Commit 5766c8ebc8
2022-12-27 00:06:19
1 parent
4068fafChanged files (2)
src
test
behavior
src/Sema.zig
@@ -29119,6 +29119,12 @@ fn resolveLazyValue(sema: *Sema, val: Value) CompileError!void {
const field_ptr = val.castTag(.comptime_field_ptr).?.data;
return sema.resolveLazyValue(field_ptr.field_val);
},
+ .eu_payload,
+ .opt_payload,
+ => {
+ const sub_val = val.cast(Value.Payload.SubValue).?.data;
+ return sema.resolveLazyValue(sub_val);
+ },
.@"union" => {
const union_val = val.castTag(.@"union").?.data;
return sema.resolveLazyValue(union_val.val);
@@ -29158,7 +29164,7 @@ pub fn resolveTypeLayout(sema: *Sema, ty: Type) CompileError!void {
.Fn => {
const info = ty.fnInfo();
if (info.is_generic) {
- // Resolving of generic function types is defeerred to when
+ // Resolving of generic function types is deferred to when
// the function is instantiated.
return;
}
@@ -29612,7 +29618,7 @@ pub fn resolveTypeFully(sema: *Sema, ty: Type) CompileError!void {
.Fn => {
const info = ty.fnInfo();
if (info.is_generic) {
- // Resolving of generic function types is defeerred to when
+ // Resolving of generic function types is deferred to when
// the function is instantiated.
return;
}
test/behavior/struct.zig
@@ -1431,15 +1431,34 @@ test "struct field has a pointer to an aligned version of itself" {
try expect(&e == e.next);
}
-test "struct only referenced from optional parameter/return" {
+test "struct has only one reference" {
const S = struct {
- fn f(_: ?struct { x: u8 }) void {}
- fn g() ?struct { x: u8 } {
+ fn optionalStructParam(_: ?struct { x: u8 }) void {}
+ fn errorUnionStructParam(_: error{}!struct { x: u8 }) void {}
+ fn optionalStructReturn() ?struct { x: u8 } {
return null;
}
+ fn errorUnionStructReturn() error{Foo}!struct { x: u8 } {
+ return error.Foo;
+ }
+ fn optionalComptimeIntParam(comptime x: ?comptime_int) comptime_int {
+ return x.?;
+ }
+ fn errorUnionComptimeIntParam(comptime x: error{}!comptime_int) comptime_int {
+ return x catch unreachable;
+ }
};
- const fp: *const anyopaque = &S.f;
- const gp: *const anyopaque = &S.g;
- try expect(fp != gp);
+ const optional_struct_param: *const anyopaque = &S.optionalStructParam;
+ const error_union_struct_param: *const anyopaque = &S.errorUnionStructParam;
+ try expect(optional_struct_param != error_union_struct_param);
+
+ const optional_struct_return: *const anyopaque = &S.optionalStructReturn;
+ const error_union_struct_return: *const anyopaque = &S.errorUnionStructReturn;
+ try expect(optional_struct_return != error_union_struct_return);
+
+ try expectEqual(@alignOf(struct {}), S.optionalComptimeIntParam(@alignOf(struct {})));
+ try expectEqual(@alignOf(struct { x: u8 }), S.errorUnionComptimeIntParam(@alignOf(struct { x: u8 })));
+ try expectEqual(@sizeOf(struct { x: u16 }), S.optionalComptimeIntParam(@sizeOf(struct { x: u16 })));
+ try expectEqual(@sizeOf(struct { x: u32 }), S.errorUnionComptimeIntParam(@sizeOf(struct { x: u32 })));
}