authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-15 20:40:56+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-15 20:58:42+02:00
logb971c7d0ff1c0ef86ac8d6816eb5e115f0d648fa
treefab4cfd6e9141b25b9e75f48a2b9e5d7473a3b54
parent6fd0dddf186f6435f422f2992f44ec9a35e09f20
signature Commit is signed but in an unrecognized format.

update tests and translate-c


5 files changed, 78 insertions(+), 42 deletions(-)

src-self-hosted/translate_c.zig+13-14
......@@ -440,7 +440,6 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
440440 .PrivateExtern => return failDecl(c, fn_decl_loc, fn_name, "unsupported storage class: private extern", .{}),
441441 .Auto => unreachable, // Not legal on functions
442442 .Register => unreachable, // Not legal on functions
443 else => unreachable,
444443 },
445444 };
446445
......@@ -953,6 +952,19 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
953952 tld_node.semicolon_token = try appendToken(c, .Semicolon, ";");
954953 try addTopLevelDecl(c, field_name, &tld_node.base);
955954 }
955 // make non exhaustive
956 const field_node = try c.a().create(ast.Node.ContainerField);
957 field_node.* = .{
958 .doc_comments = null,
959 .comptime_token = null,
960 .name_token = try appendIdentifier(c, "_"),
961 .type_expr = null,
962 .value_expr = null,
963 .align_expr = null,
964 };
965
966 try container_node.fields_and_decls.push(&field_node.base);
967 _ = try appendToken(c, .Comma, ",");
956968 container_node.rbrace_token = try appendToken(c, .RBrace, "}");
957969
958970 break :blk &container_node.base;
......@@ -1231,18 +1243,6 @@ fn transBinaryOperator(
12311243 op_id = .BitOr;
12321244 op_token = try appendToken(rp.c, .Pipe, "|");
12331245 },
1234 .Assign,
1235 .MulAssign,
1236 .DivAssign,
1237 .RemAssign,
1238 .AddAssign,
1239 .SubAssign,
1240 .ShlAssign,
1241 .ShrAssign,
1242 .AndAssign,
1243 .XorAssign,
1244 .OrAssign,
1245 => unreachable,
12461246 else => unreachable,
12471247 }
12481248
......@@ -1678,7 +1678,6 @@ fn transStringLiteral(
16781678 "TODO: support string literal kind {}",
16791679 .{kind},
16801680 ),
1681 else => unreachable,
16821681 }
16831682}
16841683
test/compile_errors.zig+22-19
......@@ -2,6 +2,28 @@ const tests = @import("tests.zig");
22const builtin = @import("builtin");
33
44pub fn addCases(cases: *tests.CompileErrorContext) void {
5 cases.addTest("non-exhaustive enums",
6 \\const E = enum {
7 \\ a,
8 \\ b,
9 \\ _,
10 \\};
11 \\pub export fn entry() void {
12 \\ var e: E = .b;
13 \\ switch (e) { // error: switch not handling the tag `b`
14 \\ .a => {},
15 \\ _ => {},
16 \\ }
17 \\ switch (e) { // error: switch on non-exhaustive enum must include `else` or `_` prong
18 \\ .a => {},
19 \\ .b => {},
20 \\ }
21 \\}
22 , &[_][]const u8{
23 "tmp.zig:8:5: error: enumeration value 'E.b' not handled in switch",
24 "tmp.zig:12:5: error: switch on non-exhaustive enum must include `else` or `_` prong",
25 });
26
527 cases.addTest("@export with empty name string",
628 \\pub export fn entry() void { }
729 \\comptime {
......@@ -139,25 +161,6 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
139161 "tmp.zig:2:13: error: pointer type '[*]align(4) u8' requires aligned address",
140162 });
141163
142 cases.add("switch on extern enum missing else prong",
143 \\const i = extern enum {
144 \\ n = 0,
145 \\ o = 2,
146 \\ p = 4,
147 \\ q = 4,
148 \\};
149 \\pub fn main() void {
150 \\ var x = @intToEnum(i, 52);
151 \\ switch (x) {
152 \\ .n,
153 \\ .o,
154 \\ .p => unreachable,
155 \\ }
156 \\}
157 , &[_][]const u8{
158 "tmp.zig:9:5: error: switch on an extern enum must have an else prong",
159 });
160
161164 cases.add("invalid float literal",
162165 \\const std = @import("std");
163166 \\
test/stage1/behavior/cast.zig-1
......@@ -618,7 +618,6 @@ test "peer resolution of string literals" {
618618 .b => "two",
619619 .c => "three",
620620 .d => "four",
621 else => unreachable,
622621 };
623622 expect(mem.eql(u8, cmd, "two"));
624623 }
test/stage1/behavior/enum.zig+32-8
......@@ -11,17 +11,41 @@ test "extern enum" {
1111 };
1212 fn doTheTest(y: c_int) void {
1313 var x = i.o;
14 expect(@enumToInt(x) == 2);
15 x = @intToEnum(i, 12);
16 expect(@enumToInt(x) == 12);
17 x = @intToEnum(i, y);
18 expect(@enumToInt(x) == 52);
1914 switch (x) {
20 .n,
21 .o,
22 .p => unreachable,
15 .n, .p => unreachable,
16 .o => {},
17 }
18 }
19 };
20 S.doTheTest(52);
21 comptime S.doTheTest(52);
22}
23
24test "non-exhaustive enum" {
25 const S = struct {
26 const E = enum(u8) {
27 a,
28 b,
29 _,
30 };
31 fn doTheTest(y: u8) void {
32 var e: E = .b;
33 switch (e) {
34 .a => {},
35 .b => {},
36 _ => {},
37 }
38
39 switch (e) {
40 .a => {},
41 .b => {},
2342 else => {},
2443 }
44 expect(@enumToInt(e) == 1);
45 e = @intToEnum(E, 12);
46 expect(@enumToInt(e) == 12);
47 e = @intToEnum(E, y);
48 expect(@enumToInt(e) == 52);
2549 }
2650 };
2751 S.doTheTest(52);
test/translate_c.zig+11
......@@ -629,6 +629,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
629629 \\ VAL21 = 6917529027641081853,
630630 \\ VAL22 = 0,
631631 \\ VAL23 = -1,
632 \\ _,
632633 \\};
633634 });
634635 }
......@@ -990,6 +991,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
990991 \\pub const FOO = @enumToInt(enum_enum_ty.FOO);
991992 \\pub const enum_enum_ty = extern enum {
992993 \\ FOO,
994 \\ _,
993995 \\};
994996 \\pub extern var my_enum: enum_enum_ty;
995997 });
......@@ -1106,6 +1108,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11061108 \\ a,
11071109 \\ b,
11081110 \\ c,
1111 \\ _,
11091112 \\};
11101113 \\pub const d = enum_unnamed_1;
11111114 \\pub const e = @enumToInt(enum_unnamed_2.e);
......@@ -1115,6 +1118,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11151118 \\ e = 0,
11161119 \\ f = 4,
11171120 \\ g = 5,
1121 \\ _,
11181122 \\};
11191123 \\pub export var h: enum_unnamed_2 = @intToEnum(enum_unnamed_2, e);
11201124 \\pub const i = @enumToInt(enum_unnamed_3.i);
......@@ -1124,6 +1128,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11241128 \\ i,
11251129 \\ j,
11261130 \\ k,
1131 \\ _,
11271132 \\};
11281133 \\pub const struct_Baz = extern struct {
11291134 \\ l: enum_unnamed_3,
......@@ -1136,6 +1141,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11361141 \\ n,
11371142 \\ o,
11381143 \\ p,
1144 \\ _,
11391145 \\};
11401146 ,
11411147 \\pub const Baz = struct_Baz;
......@@ -1566,6 +1572,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15661572 \\const enum_unnamed_1 = extern enum {
15671573 \\ One,
15681574 \\ Two,
1575 \\ _,
15691576 \\};
15701577 });
15711578
......@@ -1669,6 +1676,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
16691676 \\ A,
16701677 \\ B,
16711678 \\ C,
1679 \\ _,
16721680 \\};
16731681 \\pub const SomeTypedef = c_int;
16741682 \\pub export fn and_or_non_bool(arg_a: c_int, arg_b: f32, arg_c: ?*c_void) c_int {
......@@ -1713,6 +1721,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17131721 \\pub const enum_Bar = extern enum {
17141722 \\ A,
17151723 \\ B,
1724 \\ _,
17161725 \\};
17171726 \\pub extern fn func(a: [*c]struct_Foo, b: [*c][*c]enum_Bar) void;
17181727 ,
......@@ -1977,6 +1986,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
19771986 \\ A,
19781987 \\ B,
19791988 \\ C,
1989 \\ _,
19801990 \\};
19811991 \\pub export fn if_none_bool(arg_a: c_int, arg_b: f32, arg_c: ?*c_void, arg_d: enum_SomeEnum) c_int {
19821992 \\ var a = arg_a;
......@@ -2418,6 +2428,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
24182428 \\ A = 2,
24192429 \\ B = 5,
24202430 \\ @"1" = 6,
2431 \\ _,
24212432 \\};
24222433 ,
24232434 \\pub const Foo = enum_Foo;