diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 4b28fe2afedfc1980a47294172026a6bfd4fee02..85772524235a87ca245f384371eb1c553b6c30c0 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -5558,7 +5558,7 @@ pub const FuncGen = struct { return fg.loadByRef(payload_ptr, payload_ty, payload_ty.abiAlignment(target), false); } - const load_inst = fg.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, ""); + const load_inst = fg.builder.buildLoad(err_union_llvm_ty.structGetTypeAtIndex(offset), payload_ptr, ""); load_inst.setAlignment(payload_ty.abiAlignment(target)); return load_inst; } @@ -6792,7 +6792,7 @@ pub const FuncGen = struct { return self.loadByRef(payload_ptr, payload_ty, payload_ty.abiAlignment(target), false); } - const load_inst = self.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, ""); + const load_inst = self.builder.buildLoad(err_union_llvm_ty.structGetTypeAtIndex(offset), payload_ptr, ""); load_inst.setAlignment(payload_ty.abiAlignment(target)); return load_inst; } @@ -8580,7 +8580,7 @@ pub const FuncGen = struct { } const tag_index = @boolToInt(layout.tag_align < layout.payload_align); const tag_field_ptr = self.builder.buildStructGEP(llvm_un_ty, union_handle, tag_index, ""); - return self.builder.buildLoad(tag_field_ptr.getGEPResultElementType(), tag_field_ptr, ""); + return self.builder.buildLoad(llvm_un_ty.structGetTypeAtIndex(tag_index), tag_field_ptr, ""); } else { if (layout.payload_size == 0) { return union_handle; diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index c759c7874b2dd727de872d2cd813ac9146019bf1..ef0e55a12cf61a76813873205f9b677c91a09efb 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -254,9 +254,6 @@ pub const Value = opaque { pub const addFunctionAttr = ZigLLVMAddFunctionAttr; extern fn ZigLLVMAddFunctionAttr(Fn: *Value, attr_name: [*:0]const u8, attr_value: [*:0]const u8) void; - pub const getGEPResultElementType = ZigLLVMGetGEPResultElementType; - extern fn ZigLLVMGetGEPResultElementType(GEP: *Value) *Type; - pub const addByValAttr = ZigLLVMAddByValAttr; extern fn ZigLLVMAddByValAttr(Fn: *Value, ArgNo: c_uint, type: *Type) void; }; diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 4f73bd2c3c53b381728c5975e7a456f2f76ced79..586abf5b04c8f92bdcc0bcf1b35982821afcae1f 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -1239,10 +1239,6 @@ void ZigLLVMSetCallElemTypeAttr(LLVMValueRef Call, size_t arg_index, LLVMTypeRef Attribute::get(call_inst->getContext(), Attribute::ElementType, llvm_type)); } -LLVMTypeRef ZigLLVMGetGEPResultElementType(LLVMValueRef GEP) { - return wrap(unwrap(GEP)->getResultElementType()); -} - void ZigLLVMFunctionSetPrefixData(LLVMValueRef function, LLVMValueRef data) { unwrap(function)->setPrefixData(unwrap(data)); } diff --git a/src/zig_llvm.h b/src/zig_llvm.h index 70c53f61a4fe8c03ed8790ad9061ab3e57b2809b..de625927815da17d33587f30c6378c2509c3e527 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -332,8 +332,6 @@ ZIG_EXTERN_C void ZigLLVMAddSretAttr(LLVMValueRef fn_ref, LLVMTypeRef type_val); ZIG_EXTERN_C void ZigLLVMAddFunctionElemTypeAttr(LLVMValueRef fn_ref, size_t arg_index, LLVMTypeRef elem_ty); ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn); -ZIG_EXTERN_C LLVMTypeRef ZigLLVMGetGEPResultElementType(LLVMValueRef GEP); - ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv); diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 35bdca270e5e8a4fea7976216dc479347a68c973..20ad0a60ff6163b3478c2703bf194a6c99d4435e 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1529,3 +1529,14 @@ test "reinterpreting enum value inside packed union" { try U.doTest(); comptime try U.doTest(); } + +test "access the tag of a global tagged union" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const U = union(enum) { + a, + b: u8, + var u: @This() = .a; + }; + try expect(U.u == .a); +}