aboutsummaryrefslogtreecommitdiff
path: root/test/behavior
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-12-27 16:59:26 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-12-27 16:59:26 -0700
commit886df772f06377df95f867e8b18ee47bbd0fcd8b (patch)
treed8224b85c2b1691abf4ce669fce4b0aa0fc9e933 /test/behavior
parent3abe464b06ab7d75954abda18dc41bf7af4a3839 (diff)
downloadzig-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.zig43
-rw-r--r--test/behavior/enum_stage1.zig57
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 {