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) {...@@ -1470,7 +1470,8 @@ static bool type_allowed_in_extern(CodeGen *g, ZigType *type_entry) {
1470 case ZigTypeIdArray:1470 case ZigTypeIdArray:
1471 return type_allowed_in_extern(g, type_entry->data.array.child_type);1471 return type_allowed_in_extern(g, type_entry->data.array.child_type);
1472 case ZigTypeIdFn:1472 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;
1474 case ZigTypeIdPointer:1475 case ZigTypeIdPointer:
1475 if (type_size(g, type_entry) == 0)1476 if (type_size(g, type_entry) == 0)
1476 return false;1477 return false;
test/cases/fn.zig+14
...@@ -191,3 +191,17 @@ test "return inner function which references comptime variable of outer function...@@ -191,3 +191,17 @@ test "return inner function which references comptime variable of outer function
191 var func = outer(10);191 var func = outer(10);
192 assert(func(3) == 7);192 assert(func(3) == 7);
193}193}
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}