authorgravatar for john.schmidt.h@gmail.comJohn Schmidt <john.schmidt.h@gmail.com> 2024-02-09 01:51:26+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-02-26 16:55:17-08:00
log7a045ede7ca26338dc553e1a0113d1de4daf1b95
tree292417e9614e07a9e2416cfe5d720adfdb255f87
parent3e79c0f18ce05c302c6117e66275db4fcdf033e4

Check for inactive union field when calling fn at comptime

Reuse `unionFieldPtr` here to ensure that all the safety checks are included. Closes https://github.com/ziglang/zig/issues/18546.

2 files changed, 19 insertions(+), 3 deletions(-)

src/Sema.zig+3-3
...@@ -27200,10 +27200,10 @@ fn fieldCallBind(...@@ -27200,10 +27200,10 @@ fn fieldCallBind(
27200 .Union => {27200 .Union => {
27201 try sema.resolveTypeFields(concrete_ty);27201 try sema.resolveTypeFields(concrete_ty);
27202 const union_obj = mod.typeToUnion(concrete_ty).?;27202 const union_obj = mod.typeToUnion(concrete_ty).?;
27203 const field_index = union_obj.nameIndex(ip, field_name) orelse break :find_field;27203 _ = union_obj.nameIndex(ip, field_name) orelse break :find_field;
27204 const field_ty = Type.fromInterned(union_obj.field_types.get(ip)[field_index]);
2720527204
27206 return sema.finishFieldCallBind(block, src, ptr_ty, field_ty, field_index, object_ptr);27205 const field_ptr = try unionFieldPtr(sema, block, src, object_ptr, field_name, field_name_src, concrete_ty, false);
27206 return .{ .direct = try sema.analyzeLoad(block, src, field_ptr, src) };
27207 },27207 },
27208 .Type => {27208 .Type => {
27209 const namespace = try sema.analyzeLoad(block, src, object_ptr, src);27209 const namespace = try sema.analyzeLoad(block, src, object_ptr, src);
test/cases/compile_errors/union_calling_inactive_field_as_fn.zig created+16
...@@ -0,0 +1,16 @@
1const U = union(enum) {
2 int: isize,
3 float: f64,
4};
5
6export fn entry() void {
7 const f = U{ .int = 20 };
8 _ = f.float();
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :8:10: error: access of union field 'float' while field 'int' is active
16// :1:11: note: union declared here