master
 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    if (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag.isDarwin()) {
13        // Fails due to register hazards.
14        return error.SkipZigTest;
15    }
16
17    const S = struct {
18        threadlocal var t: i32 = 1234;
19    };
20    S.t += 1;
21    try expect(S.t == 1235);
22}
23
24test "pointer to thread local array" {
25    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
26    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
27    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
28    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
29
30    const s = "Hello world";
31    @memcpy(buffer[0..s.len], s);
32    try std.testing.expectEqualSlices(u8, buffer[0..], s);
33}
34
35threadlocal var buffer: [11]u8 = undefined;
36
37test "reference a global threadlocal variable" {
38    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
39    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
40    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
41    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
42
43    try nrfx_uart_rx(&g_uart0);
44}
45
46const nrfx_uart_t = extern struct {
47    p_reg: [*c]u32,
48    drv_inst_idx: u8,
49};
50
51pub fn nrfx_uart_rx(p_instance: [*c]const nrfx_uart_t) !void {
52    try expect(p_instance.*.p_reg == 0);
53    try expect(p_instance.*.drv_inst_idx == 0xab);
54}
55
56threadlocal var g_uart0 = nrfx_uart_t{
57    .p_reg = 0,
58    .drv_inst_idx = 0xab,
59};