diff options
| author | kcbanner <kcbanner@gmail.com> | 2025-03-09 15:44:26 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-04-11 15:30:20 -0400 |
| commit | fa5915389640c2b00a093914fd803d7d87dc2e91 (patch) | |
| tree | 93e55c1055de800943b15c8941e27bbd8b58e008 /test/behavior/globals.zig | |
| parent | 90084f4ae329c89466bc8c74bd6e00db3f2a3803 (diff) | |
| download | zig-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.zig | 28 |
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)); +} |
