From 9c9eefc841b577f646a54e74c8970e074162b594 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 17 Sep 2018 11:22:30 -0400 Subject: [PATCH] allow extern structs to have stdcallcc function pointers closes #1536 --- src/analyze.cpp | 3 ++- test/cases/fn.zig | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 0401c7125f..328eda786c 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -1470,7 +1470,8 @@ static bool type_allowed_in_extern(CodeGen *g, ZigType *type_entry) { case ZigTypeIdArray: return type_allowed_in_extern(g, type_entry->data.array.child_type); case ZigTypeIdFn: - return type_entry->data.fn.fn_type_id.cc == CallingConventionC; + return type_entry->data.fn.fn_type_id.cc == CallingConventionC || + type_entry->data.fn.fn_type_id.cc == CallingConventionStdcall; case ZigTypeIdPointer: if (type_size(g, type_entry) == 0) return false; diff --git a/test/cases/fn.zig b/test/cases/fn.zig index a862f85b0d..8908bd7854 100644 --- a/test/cases/fn.zig +++ b/test/cases/fn.zig @@ -191,3 +191,17 @@ test "return inner function which references comptime variable of outer function var func = outer(10); assert(func(3) == 7); } + +test "extern struct with stdcallcc fn pointer" { + const S = extern struct { + ptr: stdcallcc fn () i32, + + stdcallcc fn foo() i32 { + return 1234; + } + }; + + var s: S = undefined; + s.ptr = S.foo; + assert(s.ptr() == 1234); +}