diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-09-08 12:51:12 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-09-08 12:51:40 +0300 |
| commit | c7e45aebafef0372fe231816eeffd18198240f14 (patch) | |
| tree | 15ec0a8376e8f578df1a0c86b6931327a76f795f /test/behavior | |
| parent | 44b9a1d031cb72cd64909b3a7bd0c65b2e16815b (diff) | |
| download | zig-c7e45aebafef0372fe231816eeffd18198240f14.tar.gz zig-c7e45aebafef0372fe231816eeffd18198240f14.zip | |
llvm: handle pointers in packed structs in more places
Closes #12776
Diffstat (limited to 'test/behavior')
| -rw-r--r-- | test/behavior/bugs/12776.zig | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/behavior/bugs/12776.zig b/test/behavior/bugs/12776.zig new file mode 100644 index 0000000000..e8fe106ac7 --- /dev/null +++ b/test/behavior/bugs/12776.zig @@ -0,0 +1,42 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +const RAM = struct { + data: [0xFFFF + 1]u8, + fn new() !RAM { + return RAM{ .data = [_]u8{0} ** 0x10000 }; + } + fn get(self: *RAM, addr: u16) u8 { + return self.data[addr]; + } +}; + +const CPU = packed struct { + interrupts: bool, + ram: *RAM, + fn new(ram: *RAM) !CPU { + return CPU{ + .ram = ram, + .interrupts = false, + }; + } + fn tick(self: *CPU) !void { + var queued_interrupts = self.ram.get(0xFFFF) & self.ram.get(0xFF0F); + if (self.interrupts and queued_interrupts != 0) { + self.interrupts = false; + } + } +}; + +test { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + + var ram = try RAM.new(); + var cpu = try CPU.new(&ram); + try cpu.tick(); + try std.testing.expect(cpu.interrupts == false); +} |
