| author | |
| committer | |
| log | 9c9eefc841b577f646a54e74c8970e074162b594 |
| tree | f746c761e0e5a2f58c009962cd65c17ec2804351 |
| parent | dd5b2d1b04197903489f5da9c178e17e61bb55e3 |
| signature |
closes #15362 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 | 1470 | case ZigTypeIdArray: |
| 1471 | 1471 | return type_allowed_in_extern(g, type_entry->data.array.child_type); |
| 1472 | 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 | 1475 | case ZigTypeIdPointer: |
| 1475 | 1476 | if (type_size(g, type_entry) == 0) |
| 1476 | 1477 | return false; |
test/cases/fn.zig+14| ... | ... | @@ -191,3 +191,17 @@ test "return inner function which references comptime variable of outer function |
| 191 | 191 | var func = outer(10); |
| 192 | 192 | assert(func(3) == 7); |
| 193 | 193 | } |
| 194 | ||
| 195 | test "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 | } |