authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-12-24 19:44:52-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-09 15:10:44-07:00
log4068fafcc621a05f4149f5e838c938f78c9500ad
tree802ef56a2e9b73b901de3375ab01bf38521a369b
parentfe6fd0d5412bdef86cf200d664b37e05a3050966

Sema: fix missing struct layout for llvm backend

Closes #14063

2 files changed, 25 insertions(+), 0 deletions(-)

src/Sema.zig+12
......@@ -29155,6 +29155,18 @@ pub fn resolveTypeLayout(sema: *Sema, ty: Type) CompileError!void {
2915529155 const payload_ty = ty.errorUnionPayload();
2915629156 return sema.resolveTypeLayout(payload_ty);
2915729157 },
29158 .Fn => {
29159 const info = ty.fnInfo();
29160 if (info.is_generic) {
29161 // Resolving of generic function types is defeerred to when
29162 // the function is instantiated.
29163 return;
29164 }
29165 for (info.param_types) |param_ty| {
29166 try sema.resolveTypeLayout(param_ty);
29167 }
29168 try sema.resolveTypeLayout(info.return_type);
29169 },
2915829170 else => {},
2915929171 }
2916029172}
test/behavior/struct.zig+13
......@@ -1430,3 +1430,16 @@ test "struct field has a pointer to an aligned version of itself" {
14301430
14311431 try expect(&e == e.next);
14321432}
1433
1434test "struct only referenced from optional parameter/return" {
1435 const S = struct {
1436 fn f(_: ?struct { x: u8 }) void {}
1437 fn g() ?struct { x: u8 } {
1438 return null;
1439 }
1440 };
1441
1442 const fp: *const anyopaque = &S.f;
1443 const gp: *const anyopaque = &S.g;
1444 try expect(fp != gp);
1445}