diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-12-27 16:59:26 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-12-27 16:59:26 -0700 |
| commit | 886df772f06377df95f867e8b18ee47bbd0fcd8b (patch) | |
| tree | d8224b85c2b1691abf4ce669fce4b0aa0fc9e933 /test/behavior | |
| parent | 3abe464b06ab7d75954abda18dc41bf7af4a3839 (diff) | |
| download | zig-886df772f06377df95f867e8b18ee47bbd0fcd8b.tar.gz zig-886df772f06377df95f867e8b18ee47bbd0fcd8b.zip | |
stage2: LLVM backend: fix const packed structs
When doing LLVM const bit shifting we must make sure the integer bit
sizes are wide enough or else LLVM gives us a poison result.
Diffstat (limited to 'test/behavior')
| -rw-r--r-- | test/behavior/enum_llvm.zig | 43 | ||||
| -rw-r--r-- | test/behavior/enum_stage1.zig | 57 |
2 files changed, 43 insertions, 57 deletions
diff --git a/test/behavior/enum_llvm.zig b/test/behavior/enum_llvm.zig index bd93f48db7..c0d536c029 100644 --- a/test/behavior/enum_llvm.zig +++ b/test/behavior/enum_llvm.zig @@ -47,3 +47,46 @@ test "enum literal casting to optional" { try expect(bar.? == Bar.B); } + +const A = enum(u3) { One, Two, Three, Four, One2, Two2, Three2, Four2 }; +const B = enum(u3) { One3, Two3, Three3, Four3, One23, Two23, Three23, Four23 }; +const C = enum(u2) { One4, Two4, Three4, Four4 }; + +const BitFieldOfEnums = packed struct { + a: A, + b: B, + c: C, +}; + +const bit_field_1 = BitFieldOfEnums{ + .a = A.Two, + .b = B.Three3, + .c = C.Four4, +}; + +test "bit field access with enum fields" { + var data = bit_field_1; + try expect(getA(&data) == A.Two); + try expect(getB(&data) == B.Three3); + try expect(getC(&data) == C.Four4); + comptime try expect(@sizeOf(BitFieldOfEnums) == 1); + + data.b = B.Four3; + try expect(data.b == B.Four3); + + data.a = A.Three; + try expect(data.a == A.Three); + try expect(data.b == B.Four3); +} + +fn getA(data: *const BitFieldOfEnums) A { + return data.a; +} + +fn getB(data: *const BitFieldOfEnums) B { + return data.b; +} + +fn getC(data: *const BitFieldOfEnums) C { + return data.c; +} diff --git a/test/behavior/enum_stage1.zig b/test/behavior/enum_stage1.zig index 791f636633..59c1b93586 100644 --- a/test/behavior/enum_stage1.zig +++ b/test/behavior/enum_stage1.zig @@ -2,63 +2,6 @@ const expect = @import("std").testing.expect; const mem = @import("std").mem; const Tag = @import("std").meta.Tag; -const Small2 = enum(u2) { One, Two }; - -const A = enum(u3) { One, Two, Three, Four, One2, Two2, Three2, Four2 }; -const B = enum(u3) { One3, Two3, Three3, Four3, One23, Two23, Three23, Four23 }; -const C = enum(u2) { One4, Two4, Three4, Four4 }; - -const BitFieldOfEnums = packed struct { - a: A, - b: B, - c: C, -}; - -const bit_field_1 = BitFieldOfEnums{ - .a = A.Two, - .b = B.Three3, - .c = C.Four4, -}; - -test "bit field access with enum fields" { - var data = bit_field_1; - try expect(getA(&data) == A.Two); - try expect(getB(&data) == B.Three3); - try expect(getC(&data) == C.Four4); - comptime try expect(@sizeOf(BitFieldOfEnums) == 1); - - data.b = B.Four3; - try expect(data.b == B.Four3); - - data.a = A.Three; - try expect(data.a == A.Three); - try expect(data.b == B.Four3); -} - -fn getA(data: *const BitFieldOfEnums) A { - return data.a; -} - -fn getB(data: *const BitFieldOfEnums) B { - return data.b; -} - -fn getC(data: *const BitFieldOfEnums) C { - return data.c; -} - -const MultipleChoice2 = enum(u32) { - Unspecified1, - A = 20, - Unspecified2, - B = 40, - Unspecified3, - C = 60, - Unspecified4, - D = 1000, - Unspecified5, -}; - const EnumWithOneMember = enum { Eof }; fn doALoopThing(id: EnumWithOneMember) void { |
