| author | |
| committer | |
| log | f9e4344bb51c70aa9959680f3dfc9d7712858395 |
| tree | 6c115c0a6c81fed9657d1e6be710fc8f7ee422a2 |
| parent | 673fafc23142b0bdc467efcb8554cd4e70bba17b |
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 fields | 3996 | // 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 | } |
| 4001 | 4001 | ||
| ... | @@ -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); |
| 11676 | 11676 | ||
| 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"); |
| 152 | 155 | ||
| 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 { |
| 38 | test "exporting enum type and value" { | 38 | test "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" }); |