diff --git a/src/Sema.zig b/src/Sema.zig index d1de0af362..ed8a44a966 100644 --- a/src/Sema.zig +++ b/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) diff --git a/test/cases/compile_errors/array_init_invalid_elem_count.zig b/test/cases/compile_errors/array_init_invalid_elem_count.zig index d8df149d18..d61987479d 100644 --- a/test/cases/compile_errors/array_init_invalid_elem_count.zig +++ b/test/cases/compile_errors/array_init_invalid_elem_count.zig @@ -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