mirror of
https://github.com/ziglang/zig.git
synced 2026-01-11 18:05:11 +00:00
commit
b1537b525f
@ -1509,6 +1509,8 @@ test "zig fmt: error set declaration" {
|
||||
\\const Error = error{OutOfMemory};
|
||||
\\const Error = error{};
|
||||
\\
|
||||
\\const Error = error{ OutOfMemory, OutOfTime };
|
||||
\\
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -1268,25 +1268,51 @@ fn renderExpression(
|
||||
}
|
||||
|
||||
try renderToken(tree, stream, err_set_decl.error_token, indent, start_col, Space.None); // error
|
||||
try renderToken(tree, stream, lbrace, indent, start_col, Space.Newline); // {
|
||||
const new_indent = indent + indent_delta;
|
||||
|
||||
var it = err_set_decl.decls.iterator(0);
|
||||
while (it.next()) |node| {
|
||||
try stream.writeByteNTimes(' ', new_indent);
|
||||
const src_has_trailing_comma = blk: {
|
||||
const maybe_comma = tree.prevToken(err_set_decl.rbrace_token);
|
||||
break :blk tree.tokens.at(maybe_comma).id == .Comma;
|
||||
};
|
||||
|
||||
if (it.peek()) |next_node| {
|
||||
try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.None);
|
||||
try renderToken(tree, stream, tree.nextToken(node.*.lastToken()), new_indent, start_col, Space.Newline); // ,
|
||||
if (src_has_trailing_comma) {
|
||||
try renderToken(tree, stream, lbrace, indent, start_col, Space.Newline); // {
|
||||
const new_indent = indent + indent_delta;
|
||||
|
||||
try renderExtraNewline(tree, stream, start_col, next_node.*);
|
||||
} else {
|
||||
try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.Comma);
|
||||
var it = err_set_decl.decls.iterator(0);
|
||||
while (it.next()) |node| {
|
||||
try stream.writeByteNTimes(' ', new_indent);
|
||||
|
||||
if (it.peek()) |next_node| {
|
||||
try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.None);
|
||||
try renderToken(tree, stream, tree.nextToken(node.*.lastToken()), new_indent, start_col, Space.Newline); // ,
|
||||
|
||||
try renderExtraNewline(tree, stream, start_col, next_node.*);
|
||||
} else {
|
||||
try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.Comma);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try stream.writeByteNTimes(' ', indent);
|
||||
return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
|
||||
try stream.writeByteNTimes(' ', indent);
|
||||
return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
|
||||
} else {
|
||||
try renderToken(tree, stream, lbrace, indent, start_col, Space.Space); // {
|
||||
|
||||
var it = err_set_decl.decls.iterator(0);
|
||||
while (it.next()) |node| {
|
||||
if (it.peek()) |next_node| {
|
||||
try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None);
|
||||
|
||||
const comma_token = tree.nextToken(node.*.lastToken());
|
||||
assert(tree.tokens.at(comma_token).id == .Comma);
|
||||
try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // ,
|
||||
try renderExtraNewline(tree, stream, start_col, next_node.*);
|
||||
} else {
|
||||
try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Space);
|
||||
}
|
||||
}
|
||||
|
||||
return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
|
||||
}
|
||||
},
|
||||
|
||||
.ErrorTag => {
|
||||
@ -1589,8 +1615,7 @@ fn renderExpression(
|
||||
}
|
||||
} else {
|
||||
var it = switch_case.items.iterator(0);
|
||||
while (true) {
|
||||
const node = it.next().?;
|
||||
while (it.next()) |node| {
|
||||
if (it.peek()) |next_node| {
|
||||
try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None);
|
||||
|
||||
@ -1601,7 +1626,6 @@ fn renderExpression(
|
||||
} else {
|
||||
try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Comma);
|
||||
try stream.writeByteNTimes(' ', indent);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -803,13 +803,7 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
|
||||
}
|
||||
buf_appendf(&entry->name, "]%s", buf_ptr(&child_type->name));
|
||||
|
||||
size_t full_array_size;
|
||||
if (array_size == 0) {
|
||||
full_array_size = 0;
|
||||
} else {
|
||||
full_array_size = array_size + ((sentinel != nullptr) ? 1 : 0);
|
||||
}
|
||||
|
||||
size_t full_array_size = array_size + ((sentinel != nullptr) ? 1 : 0);
|
||||
entry->size_in_bits = child_type->size_in_bits * full_array_size;
|
||||
entry->abi_align = child_type->abi_align;
|
||||
entry->abi_size = child_type->abi_size * full_array_size;
|
||||
@ -1197,7 +1191,8 @@ Error type_val_resolve_zero_bits(CodeGen *g, ZigValue *type_val, ZigType *parent
|
||||
LazyValueArrayType *lazy_array_type =
|
||||
reinterpret_cast<LazyValueArrayType *>(type_val->data.x_lazy);
|
||||
|
||||
if (lazy_array_type->length < 1) {
|
||||
// The sentinel counts as an extra element
|
||||
if (lazy_array_type->length == 0 && lazy_array_type->sentinel == nullptr) {
|
||||
*is_zero_bits = true;
|
||||
return ErrorNone;
|
||||
}
|
||||
@ -1452,7 +1447,7 @@ static OnePossibleValue type_val_resolve_has_one_possible_value(CodeGen *g, ZigV
|
||||
case LazyValueIdArrayType: {
|
||||
LazyValueArrayType *lazy_array_type =
|
||||
reinterpret_cast<LazyValueArrayType *>(type_val->data.x_lazy);
|
||||
if (lazy_array_type->length < 1)
|
||||
if (lazy_array_type->length == 0)
|
||||
return OnePossibleValueYes;
|
||||
return type_val_resolve_has_one_possible_value(g, lazy_array_type->elem_type->value);
|
||||
}
|
||||
|
||||
@ -3584,7 +3584,9 @@ static bool value_is_all_undef(CodeGen *g, ZigValue *const_val) {
|
||||
}
|
||||
return true;
|
||||
} else if (const_val->type->id == ZigTypeIdArray) {
|
||||
return value_is_all_undef_array(g, const_val, const_val->type->data.array.len);
|
||||
const size_t full_len = const_val->type->data.array.len +
|
||||
(const_val->type->data.array.sentinel != nullptr);
|
||||
return value_is_all_undef_array(g, const_val, full_len);
|
||||
} else if (const_val->type->id == ZigTypeIdVector) {
|
||||
return value_is_all_undef_array(g, const_val, const_val->type->data.vector.len);
|
||||
} else {
|
||||
|
||||
@ -376,3 +376,23 @@ test "type deduction for array subscript expression" {
|
||||
S.doTheTest();
|
||||
comptime S.doTheTest();
|
||||
}
|
||||
|
||||
test "sentinel element count towards the ABI size calculation" {
|
||||
const S = struct {
|
||||
fn doTheTest() void {
|
||||
const T = packed struct {
|
||||
fill_pre: u8 = 0x55,
|
||||
data: [0:0]u8 = undefined,
|
||||
fill_post: u8 = 0xAA,
|
||||
};
|
||||
var x = T{};
|
||||
var as_slice = mem.asBytes(&x);
|
||||
expectEqual(@as(usize, 3), as_slice.len);
|
||||
expectEqual(@as(u8, 0x55), as_slice[0]);
|
||||
expectEqual(@as(u8, 0xAA), as_slice[2]);
|
||||
}
|
||||
};
|
||||
|
||||
S.doTheTest();
|
||||
comptime S.doTheTest();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user