| ... | ... | @@ -171,3 +171,31 @@ test "global var can be indirectly self-referential" { |
| 171 | 171 | try std.testing.expect(S.bar.other == &S.foo); |
| 172 | 172 | try std.testing.expect(S.bar.other.other == &S.bar); |
| 173 | 173 | } |
| 174 | |
| 175 | pub const Callbacks = extern struct { |
| 176 | key_callback: *const fn (key: i32) callconv(.c) i32, |
| 177 | }; |
| 178 | |
| 179 | var callbacks: Callbacks = undefined; |
| 180 | var callbacks_loaded: bool = false; |
| 181 | |
| 182 | test "function pointer field call on global extern struct, conditional on global" { |
| 183 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 184 | |
| 185 | if (callbacks_loaded) { |
| 186 | try std.testing.expectEqual(42, callbacks.key_callback(42)); |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | test "function pointer field call on global extern struct" { |
| 191 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 192 | |
| 193 | const S = struct { |
| 194 | fn keyCallback(key: i32) callconv(.c) i32 { |
| 195 | return key; |
| 196 | } |
| 197 | }; |
| 198 | |
| 199 | callbacks = Callbacks{ .key_callback = S.keyCallback }; |
| 200 | try std.testing.expectEqual(42, callbacks.key_callback(42)); |
| 201 | } |