mirror of
https://github.com/ziglang/zig.git
synced 2026-02-15 22:09:49 +00:00
Sema: implement zirStructInit is_ref=true union
This commit is contained in:
parent
673fafc231
commit
f9e4344bb5
19
src/Sema.zig
19
src/Sema.zig
@ -3995,7 +3995,7 @@ pub fn analyzeExport(
|
||||
try mod.ensureDeclAnalyzed(exported_decl);
|
||||
// TODO run the same checks as we do for C ABI struct fields
|
||||
switch (exported_decl.ty.zigTypeTag()) {
|
||||
.Fn, .Int, .Struct, .Array, .Float => {},
|
||||
.Fn, .Int, .Enum, .Struct, .Union, .Array, .Float => {},
|
||||
else => return sema.fail(block, src, "unable to export type '{}'", .{exported_decl.ty}),
|
||||
}
|
||||
|
||||
@ -11674,18 +11674,25 @@ fn zirStructInit(
|
||||
const field_name = sema.code.nullTerminatedString(field_type_extra.name_start);
|
||||
const field_index = try sema.unionFieldIndex(block, resolved_ty, field_name, field_src);
|
||||
|
||||
if (is_ref) {
|
||||
return sema.fail(block, src, "TODO: Sema.zirStructInit is_ref=true union", .{});
|
||||
}
|
||||
|
||||
const init_inst = sema.resolveInst(item.data.init);
|
||||
if (try sema.resolveMaybeUndefVal(block, field_src, init_inst)) |val| {
|
||||
const tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index);
|
||||
return sema.addConstant(
|
||||
return sema.addConstantMaybeRef(
|
||||
block,
|
||||
src,
|
||||
resolved_ty,
|
||||
try Value.Tag.@"union".create(sema.arena, .{ .tag = tag_val, .val = val }),
|
||||
is_ref,
|
||||
);
|
||||
}
|
||||
|
||||
if (is_ref) {
|
||||
const alloc = try block.addTy(.alloc, resolved_ty);
|
||||
const field_ptr = try sema.unionFieldPtr(block, field_src, alloc, field_name, field_src, resolved_ty);
|
||||
try sema.storePtr(block, src, field_ptr, init_inst);
|
||||
return alloc;
|
||||
}
|
||||
|
||||
return sema.fail(block, src, "TODO: Sema.zirStructInit for runtime-known union values", .{});
|
||||
}
|
||||
unreachable;
|
||||
|
||||
@ -57,6 +57,7 @@ test {
|
||||
_ = @import("behavior/bugs/5487.zig");
|
||||
_ = @import("behavior/bugs/6850.zig");
|
||||
_ = @import("behavior/bugs/7003.zig");
|
||||
_ = @import("behavior/bugs/7047.zig");
|
||||
_ = @import("behavior/bugs/7250.zig");
|
||||
_ = @import("behavior/bugs/11100.zig");
|
||||
_ = @import("behavior/bugs/10970.zig");
|
||||
@ -142,12 +143,14 @@ test {
|
||||
if (builtin.zig_backend != .stage2_c) {
|
||||
// Tests that pass for stage1 and the llvm backend.
|
||||
_ = @import("behavior/atomics.zig");
|
||||
_ = @import("behavior/export.zig");
|
||||
_ = @import("behavior/maximum_minimum.zig");
|
||||
_ = @import("behavior/popcount.zig");
|
||||
_ = @import("behavior/saturating_arithmetic.zig");
|
||||
_ = @import("behavior/widening.zig");
|
||||
_ = @import("behavior/bugs/2114.zig");
|
||||
_ = @import("behavior/bugs/3779.zig");
|
||||
_ = @import("behavior/bugs/10147.zig");
|
||||
_ = @import("behavior/union_with_members.zig");
|
||||
|
||||
if (builtin.zig_backend == .stage1) {
|
||||
@ -164,10 +167,7 @@ test {
|
||||
_ = @import("behavior/bugs/6456.zig");
|
||||
_ = @import("behavior/bugs/6781.zig");
|
||||
_ = @import("behavior/bugs/7027.zig");
|
||||
_ = @import("behavior/bugs/7047.zig");
|
||||
_ = @import("behavior/bugs/10147.zig");
|
||||
_ = @import("behavior/const_slice_child.zig");
|
||||
_ = @import("behavior/export.zig");
|
||||
_ = @import("behavior/select.zig");
|
||||
_ = @import("behavior/shuffle.zig");
|
||||
_ = @import("behavior/struct_contains_slice_of_itself.zig");
|
||||
|
||||
@ -38,9 +38,6 @@ export fn testPackedStuff(a: *const PackedStruct, b: *const PackedUnion) void {
|
||||
test "exporting enum type and value" {
|
||||
const S = struct {
|
||||
const E = enum(c_int) { one, two };
|
||||
comptime {
|
||||
@export(E, .{ .name = "E" });
|
||||
}
|
||||
const e: E = .two;
|
||||
comptime {
|
||||
@export(e, .{ .name = "e" });
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user