mirror of
https://github.com/ziglang/zig.git
synced 2025-12-29 09:33:18 +00:00
Merge branch 'marler8997-fixSegfault'
This commit is contained in:
commit
42cc4a406b
@ -7687,8 +7687,13 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
|
||||
ZigType *tag_type = union_type->data.unionation.tag_type;
|
||||
uint32_t gen_field_count = union_type->data.unionation.gen_field_count;
|
||||
if (gen_field_count == 0) {
|
||||
union_type->llvm_type = get_llvm_type(g, tag_type);
|
||||
union_type->llvm_di_type = get_llvm_di_type(g, tag_type);
|
||||
if (tag_type == nullptr) {
|
||||
union_type->llvm_type = g->builtin_types.entry_void->llvm_type;
|
||||
union_type->llvm_di_type = g->builtin_types.entry_void->llvm_di_type;
|
||||
} else {
|
||||
union_type->llvm_type = get_llvm_type(g, tag_type);
|
||||
union_type->llvm_di_type = get_llvm_di_type(g, tag_type);
|
||||
}
|
||||
union_type->data.unionation.resolve_status = ResolveStatusLLVMFull;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -17464,7 +17464,12 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_
|
||||
return ir_analyze_container_member_access_inner(ira, bare_type, field_name,
|
||||
source_instr, container_ptr, container_type);
|
||||
}
|
||||
ZigType *ptr_type = get_pointer_to_type_extra(ira->codegen, field->type_entry,
|
||||
|
||||
ZigType *field_type = resolve_union_field_type(ira->codegen, field);
|
||||
if (field_type == nullptr)
|
||||
return ira->codegen->invalid_instruction;
|
||||
|
||||
ZigType *ptr_type = get_pointer_to_type_extra(ira->codegen, field_type,
|
||||
is_const, is_volatile, PtrLenSingle, 0, 0, 0, false);
|
||||
if (instr_is_comptime(container_ptr)) {
|
||||
ConstExprValue *ptr_val = ir_resolve_const(ira, container_ptr, UndefBad);
|
||||
@ -17481,7 +17486,7 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_
|
||||
if (initializing) {
|
||||
ConstExprValue *payload_val = create_const_vals(1);
|
||||
payload_val->special = ConstValSpecialUndef;
|
||||
payload_val->type = field->type_entry;
|
||||
payload_val->type = field_type;
|
||||
payload_val->parent.id = ConstParentIdUnion;
|
||||
payload_val->parent.data.p_union.union_val = union_val;
|
||||
|
||||
|
||||
@ -457,3 +457,13 @@ test "@unionInit can modify a pointer value" {
|
||||
value_ptr.* = @unionInit(UnionInitEnum, "Byte", 2);
|
||||
expect(value.Byte == 2);
|
||||
}
|
||||
|
||||
test "union no tag with struct member" {
|
||||
const Struct = struct {};
|
||||
const Union = union {
|
||||
s: Struct,
|
||||
pub fn foo(self: *@This()) void {}
|
||||
};
|
||||
var u = Union{ .s = Struct{} };
|
||||
u.foo();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user