1const std = @import("std");
2const builtin = @import("builtin");
3const expect = std.testing.expect;
4
5test "thread local variable" {
6 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
10 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
11
12 const S = struct {
13 threadlocal var t: i32 = 1234;
14 };
15 S.t += 1;
16 try expect(S.t == 1235);
17}
18
19test "pointer to thread local array" {
20 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
21 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
22 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
24
25 const s = "Hello world";
26 @memcpy(buffer[0..s.len], s);
27 try std.testing.expectEqualSlices(u8, buffer[0..], s);
28}
29
30threadlocal var buffer: [11]u8 = undefined;
31
32test "reference a global threadlocal variable" {
33 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
34 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
35 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
36 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
37
38 try nrfx_uart_rx(&g_uart0);
39}
40
41const nrfx_uart_t = extern struct {
42 p_reg: [*c]u32,
43 drv_inst_idx: u8,
44};
45
46pub fn nrfx_uart_rx(p_instance: [*c]const nrfx_uart_t) !void {
47 try expect(p_instance.*.p_reg == 0);
48 try expect(p_instance.*.drv_inst_idx == 0xab);
49}
50
51threadlocal var g_uart0 = nrfx_uart_t{
52 .p_reg = 0,
53 .drv_inst_idx = 0xab,
54};