authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-17 11:22:30-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-17 11:22:30-04:00
log9c9eefc841b577f646a54e74c8970e074162b594
treef746c761e0e5a2f58c009962cd65c17ec2804351
parentdd5b2d1b04197903489f5da9c178e17e61bb55e3
signaturelock-open Commit is signed but in an unrecognized format.

allow extern structs to have stdcallcc function pointers

closes #1536

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

src/analyze.cpp+2-1
......@@ -1470,7 +1470,8 @@ static bool type_allowed_in_extern(CodeGen *g, ZigType *type_entry) {
14701470 case ZigTypeIdArray:
14711471 return type_allowed_in_extern(g, type_entry->data.array.child_type);
14721472 case ZigTypeIdFn:
1473 return type_entry->data.fn.fn_type_id.cc == CallingConventionC;
1473 return type_entry->data.fn.fn_type_id.cc == CallingConventionC ||
1474 type_entry->data.fn.fn_type_id.cc == CallingConventionStdcall;
14741475 case ZigTypeIdPointer:
14751476 if (type_size(g, type_entry) == 0)
14761477 return false;
test/cases/fn.zig+14
......@@ -191,3 +191,17 @@ test "return inner function which references comptime variable of outer function
191191 var func = outer(10);
192192 assert(func(3) == 7);
193193}
194
195test "extern struct with stdcallcc fn pointer" {
196 const S = extern struct {
197 ptr: stdcallcc fn () i32,
198
199 stdcallcc fn foo() i32 {
200 return 1234;
201 }
202 };
203
204 var s: S = undefined;
205 s.ptr = S.foo;
206 assert(s.ptr() == 1234);
207}