aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-02-26 11:21:30 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-02-26 11:21:30 -0500
commit6291e8e4926c2e7dbd5cfa651f862c7dbd2e5bda (patch)
treec30178b457a4afcca39e355da12502f2c6216a7f /test
parentc4a2734aa08a9e810680d7be2c976fe3ae67cc5b (diff)
parent62de32a18c1eecedc29055e4199fa364f9e9b7c6 (diff)
downloadzig-6291e8e4926c2e7dbd5cfa651f862c7dbd2e5bda.tar.gz
zig-6291e8e4926c2e7dbd5cfa651f862c7dbd2e5bda.zip
Merge branch 'Vexu-tagname'
closes #4559 closes #3991
Diffstat (limited to 'test')
-rw-r--r--test/compile_errors.zig9
-rw-r--r--test/stage1/behavior/cast.zig11
-rw-r--r--test/stage1/behavior/enum.zig23
3 files changed, 42 insertions, 1 deletions
diff --git a/test/compile_errors.zig b/test/compile_errors.zig
index 138f7a7633..0260160dca 100644
--- a/test/compile_errors.zig
+++ b/test/compile_errors.zig
@@ -3,6 +3,15 @@ const builtin = @import("builtin");
const Target = @import("std").Target;
pub fn addCases(cases: *tests.CompileErrorContext) void {
+ cases.addTest("@tagName on invalid value of non-exhaustive enum",
+ \\test "enum" {
+ \\ const E = enum(u8) {A, B, _};
+ \\ _ = @tagName(@intToEnum(E, 5));
+ \\}
+ , &[_][]const u8{
+ "tmp.zig:3:18: error: no tag by value 5",
+ });
+
cases.addTest("@ptrToInt with pointer to zero-sized type",
\\export fn entry() void {
\\ var pointer: ?*u0 = null;
diff --git a/test/stage1/behavior/cast.zig b/test/stage1/behavior/cast.zig
index 76d3b784ec..d2267a3753 100644
--- a/test/stage1/behavior/cast.zig
+++ b/test/stage1/behavior/cast.zig
@@ -491,6 +491,17 @@ test "@intToEnum passed a comptime_int to an enum with one item" {
expect(x == E.A);
}
+test "@intToEnum runtime to an extern enum with duplicate values" {
+ const E = extern enum(u8) {
+ A = 1,
+ B = 1,
+ };
+ var a: u8 = 1;
+ var x = @intToEnum(E, a);
+ expect(x == E.A);
+ expect(x == E.B);
+}
+
test "@intCast to u0 and use the result" {
const S = struct {
fn doTheTest(zero: u1, one: u1, bigzero: i32) void {
diff --git a/test/stage1/behavior/enum.zig b/test/stage1/behavior/enum.zig
index 18489ba24b..b6cb86a363 100644
--- a/test/stage1/behavior/enum.zig
+++ b/test/stage1/behavior/enum.zig
@@ -198,7 +198,17 @@ test "@tagName" {
comptime expect(mem.eql(u8, testEnumTagNameBare(BareNumber.Three), "Three"));
}
-fn testEnumTagNameBare(n: BareNumber) []const u8 {
+test "@tagName extern enum with duplicates" {
+ expect(mem.eql(u8, testEnumTagNameBare(ExternDuplicates.B), "A"));
+ comptime expect(mem.eql(u8, testEnumTagNameBare(ExternDuplicates.B), "A"));
+}
+
+test "@tagName non-exhaustive enum" {
+ expect(mem.eql(u8, testEnumTagNameBare(NonExhaustive.B), "B"));
+ comptime expect(mem.eql(u8, testEnumTagNameBare(NonExhaustive.B), "B"));
+}
+
+fn testEnumTagNameBare(n: var) []const u8 {
return @tagName(n);
}
@@ -208,6 +218,17 @@ const BareNumber = enum {
Three,
};
+const ExternDuplicates = extern enum(u8) {
+ A = 1,
+ B = 1,
+};
+
+const NonExhaustive = enum(u8) {
+ A,
+ B,
+ _,
+};
+
test "enum alignment" {
comptime {
expect(@alignOf(AlignTestEnum) >= @alignOf([9]u8));