authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-10 20:00:07+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-10 20:00:07+02:00
logf9e4344bb51c70aa9959680f3dfc9d7712858395
tree6c115c0a6c81fed9657d1e6be710fc8f7ee422a2
parent673fafc23142b0bdc467efcb8554cd4e70bba17b

Sema: implement zirStructInit is_ref=true union


3 files changed, 16 insertions(+), 12 deletions(-)

src/Sema.zig+13-6
...@@ -3995,7 +3995,7 @@ pub fn analyzeExport(...@@ -3995,7 +3995,7 @@ pub fn analyzeExport(
3995 try mod.ensureDeclAnalyzed(exported_decl);3995 try mod.ensureDeclAnalyzed(exported_decl);
3996 // TODO run the same checks as we do for C ABI struct fields3996 // TODO run the same checks as we do for C ABI struct fields
3997 switch (exported_decl.ty.zigTypeTag()) {3997 switch (exported_decl.ty.zigTypeTag()) {
3998 .Fn, .Int, .Struct, .Array, .Float => {},3998 .Fn, .Int, .Enum, .Struct, .Union, .Array, .Float => {},
3999 else => return sema.fail(block, src, "unable to export type '{}'", .{exported_decl.ty}),3999 else => return sema.fail(block, src, "unable to export type '{}'", .{exported_decl.ty}),
4000 }4000 }
40014001
...@@ -11674,18 +11674,25 @@ fn zirStructInit(...@@ -11674,18 +11674,25 @@ fn zirStructInit(
11674 const field_name = sema.code.nullTerminatedString(field_type_extra.name_start);11674 const field_name = sema.code.nullTerminatedString(field_type_extra.name_start);
11675 const field_index = try sema.unionFieldIndex(block, resolved_ty, field_name, field_src);11675 const field_index = try sema.unionFieldIndex(block, resolved_ty, field_name, field_src);
1167611676
11677 if (is_ref) {
11678 return sema.fail(block, src, "TODO: Sema.zirStructInit is_ref=true union", .{});
11679 }
11680
11681 const init_inst = sema.resolveInst(item.data.init);11677 const init_inst = sema.resolveInst(item.data.init);
11682 if (try sema.resolveMaybeUndefVal(block, field_src, init_inst)) |val| {11678 if (try sema.resolveMaybeUndefVal(block, field_src, init_inst)) |val| {
11683 const tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index);11679 const tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index);
11684 return sema.addConstant(11680 return sema.addConstantMaybeRef(
11681 block,
11682 src,
11685 resolved_ty,11683 resolved_ty,
11686 try Value.Tag.@"union".create(sema.arena, .{ .tag = tag_val, .val = val }),11684 try Value.Tag.@"union".create(sema.arena, .{ .tag = tag_val, .val = val }),
11685 is_ref,
11687 );11686 );
11688 }11687 }
11688
11689 if (is_ref) {
11690 const alloc = try block.addTy(.alloc, resolved_ty);
11691 const field_ptr = try sema.unionFieldPtr(block, field_src, alloc, field_name, field_src, resolved_ty);
11692 try sema.storePtr(block, src, field_ptr, init_inst);
11693 return alloc;
11694 }
11695
11689 return sema.fail(block, src, "TODO: Sema.zirStructInit for runtime-known union values", .{});11696 return sema.fail(block, src, "TODO: Sema.zirStructInit for runtime-known union values", .{});
11690 }11697 }
11691 unreachable;11698 unreachable;
test/behavior.zig+3-3
...@@ -57,6 +57,7 @@ test {...@@ -57,6 +57,7 @@ test {
57 _ = @import("behavior/bugs/5487.zig");57 _ = @import("behavior/bugs/5487.zig");
58 _ = @import("behavior/bugs/6850.zig");58 _ = @import("behavior/bugs/6850.zig");
59 _ = @import("behavior/bugs/7003.zig");59 _ = @import("behavior/bugs/7003.zig");
60 _ = @import("behavior/bugs/7047.zig");
60 _ = @import("behavior/bugs/7250.zig");61 _ = @import("behavior/bugs/7250.zig");
61 _ = @import("behavior/bugs/11100.zig");62 _ = @import("behavior/bugs/11100.zig");
62 _ = @import("behavior/bugs/10970.zig");63 _ = @import("behavior/bugs/10970.zig");
...@@ -142,12 +143,14 @@ test {...@@ -142,12 +143,14 @@ test {
142 if (builtin.zig_backend != .stage2_c) {143 if (builtin.zig_backend != .stage2_c) {
143 // Tests that pass for stage1 and the llvm backend.144 // Tests that pass for stage1 and the llvm backend.
144 _ = @import("behavior/atomics.zig");145 _ = @import("behavior/atomics.zig");
146 _ = @import("behavior/export.zig");
145 _ = @import("behavior/maximum_minimum.zig");147 _ = @import("behavior/maximum_minimum.zig");
146 _ = @import("behavior/popcount.zig");148 _ = @import("behavior/popcount.zig");
147 _ = @import("behavior/saturating_arithmetic.zig");149 _ = @import("behavior/saturating_arithmetic.zig");
148 _ = @import("behavior/widening.zig");150 _ = @import("behavior/widening.zig");
149 _ = @import("behavior/bugs/2114.zig");151 _ = @import("behavior/bugs/2114.zig");
150 _ = @import("behavior/bugs/3779.zig");152 _ = @import("behavior/bugs/3779.zig");
153 _ = @import("behavior/bugs/10147.zig");
151 _ = @import("behavior/union_with_members.zig");154 _ = @import("behavior/union_with_members.zig");
152155
153 if (builtin.zig_backend == .stage1) {156 if (builtin.zig_backend == .stage1) {
...@@ -164,10 +167,7 @@ test {...@@ -164,10 +167,7 @@ test {
164 _ = @import("behavior/bugs/6456.zig");167 _ = @import("behavior/bugs/6456.zig");
165 _ = @import("behavior/bugs/6781.zig");168 _ = @import("behavior/bugs/6781.zig");
166 _ = @import("behavior/bugs/7027.zig");169 _ = @import("behavior/bugs/7027.zig");
167 _ = @import("behavior/bugs/7047.zig");
168 _ = @import("behavior/bugs/10147.zig");
169 _ = @import("behavior/const_slice_child.zig");170 _ = @import("behavior/const_slice_child.zig");
170 _ = @import("behavior/export.zig");
171 _ = @import("behavior/select.zig");171 _ = @import("behavior/select.zig");
172 _ = @import("behavior/shuffle.zig");172 _ = @import("behavior/shuffle.zig");
173 _ = @import("behavior/struct_contains_slice_of_itself.zig");173 _ = @import("behavior/struct_contains_slice_of_itself.zig");
test/behavior/export.zig-3
...@@ -38,9 +38,6 @@ export fn testPackedStuff(a: *const PackedStruct, b: *const PackedUnion) void {...@@ -38,9 +38,6 @@ export fn testPackedStuff(a: *const PackedStruct, b: *const PackedUnion) void {
38test "exporting enum type and value" {38test "exporting enum type and value" {
39 const S = struct {39 const S = struct {
40 const E = enum(c_int) { one, two };40 const E = enum(c_int) { one, two };
41 comptime {
42 @export(E, .{ .name = "E" });
43 }
44 const e: E = .two;41 const e: E = .two;
45 comptime {42 comptime {
46 @export(e, .{ .name = "e" });43 @export(e, .{ .name = "e" });