authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-25 10:45:11-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-25 10:45:11-04:00
logeafb8e85725df570056f2be09173449f802b90fc
treeb26bbe09b21ecfda847426055711de7191130855
parent0e6c18c8207cab5d3946f119a51d62f91c1b9028
signaturelock-open Commit is signed but in an unrecognized format.

fix self reference through fn ptr field crash

closes #1208

2 files changed, 16 insertions(+), 1 deletions(-)

src/analyze.cpp+1-1
...@@ -1184,7 +1184,7 @@ ZigType *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) {...@@ -1184,7 +1184,7 @@ ZigType *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
1184 gen_param_info->src_index = i;1184 gen_param_info->src_index = i;
1185 gen_param_info->gen_index = SIZE_MAX;1185 gen_param_info->gen_index = SIZE_MAX;
11861186
1187 if ((err = ensure_complete_type(g, type_entry)))1187 if ((err = type_resolve(g, type_entry, ResolveStatusZeroBitsKnown)))
1188 return g->builtin_types.entry_invalid;1188 return g->builtin_types.entry_invalid;
11891189
1190 if (is_c_abi)1190 if (is_c_abi)
test/cases/misc.zig+15
...@@ -699,3 +699,18 @@ test "equality compare fn ptrs" {...@@ -699,3 +699,18 @@ test "equality compare fn ptrs" {
699 var a = emptyFn;699 var a = emptyFn;
700 assert(a == a);700 assert(a == a);
701}701}
702
703test "self reference through fn ptr field" {
704 const S = struct {
705 const A = struct {
706 f: fn (A) u8,
707 };
708
709 fn foo(a: A) u8 {
710 return 12;
711 }
712 };
713 var a: S.A = undefined;
714 a.f = S.foo;
715 assert(a.f(a) == 12);
716}