aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/globals.zig
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2025-03-09 15:44:26 -0400
committerAndrew Kelley <andrew@ziglang.org>2025-04-11 15:30:20 -0400
commitfa5915389640c2b00a093914fd803d7d87dc2e91 (patch)
tree93e55c1055de800943b15c8941e27bbd8b58e008 /test/behavior/globals.zig
parent90084f4ae329c89466bc8c74bd6e00db3f2a3803 (diff)
downloadzig-fa5915389640c2b00a093914fd803d7d87dc2e91.tar.gz
zig-fa5915389640c2b00a093914fd803d7d87dc2e91.zip
Value: ensure that extern structs have their layout resolved in ptrField
Diffstat (limited to 'test/behavior/globals.zig')
-rw-r--r--test/behavior/globals.zig28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/behavior/globals.zig b/test/behavior/globals.zig
index 1a07eea95f..068c30f3f2 100644
--- a/test/behavior/globals.zig
+++ b/test/behavior/globals.zig
@@ -171,3 +171,31 @@ test "global var can be indirectly self-referential" {
try std.testing.expect(S.bar.other == &S.foo);
try std.testing.expect(S.bar.other.other == &S.bar);
}
+
+pub const Callbacks = extern struct {
+ key_callback: *const fn (key: i32) callconv(.c) i32,
+};
+
+var callbacks: Callbacks = undefined;
+var callbacks_loaded: bool = false;
+
+test "function pointer field call on global extern struct, conditional on global" {
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ if (callbacks_loaded) {
+ try std.testing.expectEqual(42, callbacks.key_callback(42));
+ }
+}
+
+test "function pointer field call on global extern struct" {
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn keyCallback(key: i32) callconv(.c) i32 {
+ return key;
+ }
+ };
+
+ callbacks = Callbacks{ .key_callback = S.keyCallback };
+ try std.testing.expectEqual(42, callbacks.key_callback(42));
+}