mirror of
https://github.com/ziglang/zig.git
synced 2026-01-04 20:43:19 +00:00
commit
b0cd24f90e
10
src/Sema.zig
10
src/Sema.zig
@ -29708,6 +29708,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);
|
||||
@ -29747,7 +29753,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;
|
||||
}
|
||||
@ -30201,7 +30207,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;
|
||||
}
|
||||
|
||||
@ -1420,15 +1420,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 })));
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user