Fixes crash when a struct is given as the first parameter to the unionInit builtin (#16385)

This commit is contained in:
Anton Lilja
2023-07-12 08:37:42 +02:00
committed by GitHub
parent ff0e2ab398
commit 711b4e93e2
2 changed files with 23 additions and 0 deletions

View File

@@ -18727,6 +18727,15 @@ fn zirUnionInit(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
const init_src: LazySrcLoc = .{ .node_offset_builtin_call_arg2 = inst_data.src_node };
const extra = sema.code.extraData(Zir.Inst.UnionInit, inst_data.payload_index).data;
const union_ty = try sema.resolveType(block, ty_src, extra.union_type);
if (union_ty.zigTypeTag(sema.mod) != .Union) {
const msg = msg: {
const msg = try sema.errMsg(block, ty_src, "expected union type, found '{}'", .{union_ty.fmt(sema.mod)});
errdefer msg.destroy(sema.gpa);
try sema.addDeclaredHereNote(msg, union_ty);
break :msg msg;
};
return sema.failWithOwnedErrorMsg(msg);
}
const field_name = try sema.resolveConstStringIntern(block, field_src, extra.field_name, "name of field being initialized must be comptime-known");
const init = try sema.resolveInst(extra.init);
return sema.unionInit(block, init, init_src, union_ty, ty_src, field_name, field_src);

View File

@@ -0,0 +1,14 @@
const S = struct {
a: u8,
};
export fn u() void {
_ = @unionInit(S, "a", 5);
}
// error
// backend=stage2
// target=native
//
// :6:20: error: expected union type, found 'tmp.S'
// :1:11: note: struct declared here