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