diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 291e76f084..4502fe1c30 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -3775,6 +3775,7 @@ pub const Object = struct { .float, .enum_tag, => {}, + .opt => {}, // pointer like optional expected else => unreachable, } const bits = ty.bitSize(mod); @@ -4376,7 +4377,7 @@ pub const Object = struct { .int => try o.builder.castConst( .inttoptr, try o.builder.intConst(try o.lowerType(Type.usize), offset), - .ptr, + try o.lowerType(Type.fromInterned(ptr.ty)), ), .eu_payload => |eu_ptr| try o.lowerPtr( eu_ptr, diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index 4870cd5984..51a302c945 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -1304,3 +1304,10 @@ test "2-byte packed struct argument in C calling convention" { try S.bar(s); } } + +test "packed struct contains optional pointer" { + const foo: packed struct { + a: ?*@This() = null, + } = .{}; + try expect(foo.a == null); +}