mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
parent
034507ef7c
commit
835a1f7f0c
49
src/Sema.zig
49
src/Sema.zig
@ -4288,29 +4288,42 @@ fn zirValidateArrayInit(
|
||||
const array_ty = sema.typeOf(array_ptr).childType();
|
||||
const array_len = array_ty.arrayLen();
|
||||
|
||||
if (instrs.len != array_len and array_ty.isTuple()) {
|
||||
const struct_obj = array_ty.castTag(.tuple).?.data;
|
||||
var root_msg: ?*Module.ErrorMsg = null;
|
||||
errdefer if (root_msg) |msg| msg.destroy(sema.gpa);
|
||||
if (instrs.len != array_len) switch (array_ty.zigTypeTag()) {
|
||||
.Struct => {
|
||||
const struct_obj = array_ty.castTag(.tuple).?.data;
|
||||
var root_msg: ?*Module.ErrorMsg = null;
|
||||
errdefer if (root_msg) |msg| msg.destroy(sema.gpa);
|
||||
|
||||
for (struct_obj.values) |default_val, i| {
|
||||
if (i < instrs.len) continue;
|
||||
for (struct_obj.values) |default_val, i| {
|
||||
if (i < instrs.len) continue;
|
||||
|
||||
if (default_val.tag() == .unreachable_value) {
|
||||
const template = "missing tuple field with index {d}";
|
||||
if (root_msg) |msg| {
|
||||
try sema.errNote(block, init_src, msg, template, .{i});
|
||||
} else {
|
||||
root_msg = try sema.errMsg(block, init_src, template, .{i});
|
||||
if (default_val.tag() == .unreachable_value) {
|
||||
const template = "missing tuple field with index {d}";
|
||||
if (root_msg) |msg| {
|
||||
try sema.errNote(block, init_src, msg, template, .{i});
|
||||
} else {
|
||||
root_msg = try sema.errMsg(block, init_src, template, .{i});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (root_msg) |msg| {
|
||||
root_msg = null;
|
||||
return sema.failWithOwnedErrorMsg(msg);
|
||||
}
|
||||
}
|
||||
if (root_msg) |msg| {
|
||||
root_msg = null;
|
||||
return sema.failWithOwnedErrorMsg(msg);
|
||||
}
|
||||
},
|
||||
.Array => {
|
||||
return sema.fail(block, init_src, "expected {d} array elements; found {d}", .{
|
||||
array_len, instrs.len,
|
||||
});
|
||||
},
|
||||
.Vector => {
|
||||
return sema.fail(block, init_src, "expected {d} vector elements; found {d}", .{
|
||||
array_len, instrs.len,
|
||||
});
|
||||
},
|
||||
else => unreachable,
|
||||
};
|
||||
|
||||
if ((is_comptime or block.is_comptime) and
|
||||
(try sema.resolveDefinedValue(block, init_src, array_ptr)) != null)
|
||||
|
||||
@ -16,6 +16,14 @@ comptime {
|
||||
var a: A = A{};
|
||||
_ = a;
|
||||
}
|
||||
pub export fn entry1() void {
|
||||
var bla: V = .{ 1, 2, 3, 4 };
|
||||
_ = bla;
|
||||
}
|
||||
pub export fn entry2() void {
|
||||
var bla: A = .{ 1, 2, 3, 4 };
|
||||
_ = bla;
|
||||
}
|
||||
|
||||
// error
|
||||
// backend=stage2
|
||||
@ -25,3 +33,5 @@ comptime {
|
||||
// :8:17: error: expected 8 vector elements; found 0
|
||||
// :12:17: error: expected 8 array elements; found 1
|
||||
// :16:17: error: expected 8 array elements; found 0
|
||||
// :20:19: error: expected 8 vector elements; found 4
|
||||
// :24:19: error: expected 8 array elements; found 4
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user