authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-21 00:18:20-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-21 00:18:20-07:00
log88d0e77b9747152a923e4a4479988924de0fe26f
treeddb3ba22c76d204410187b22f5b37548efd1eb09
parent4074e79748ad9ecc39a4127cd1c28c115efff56a

parse: implement error for invalid bit range and alignment


3 files changed, 32 insertions(+), 8 deletions(-)

lib/std/zig/ast.zig+8
......@@ -262,6 +262,12 @@ pub const Tree = struct {
262262 .extra_volatile_qualifier => {
263263 return stream.writeAll("extra volatile qualifier");
264264 },
265 .invalid_align => {
266 return stream.writeAll("alignment not allowed on arrays");
267 },
268 .invalid_bit_range => {
269 return stream.writeAll("bit range not allowed on slices and arrays");
270 },
265271 .invalid_token => {
266272 return stream.print("invalid token '{s}'", .{
267273 token_tags[parse_error.token].symbol(),
......@@ -2323,6 +2329,8 @@ pub const Error = struct {
23232329 extra_allowzero_qualifier,
23242330 extra_const_qualifier,
23252331 extra_volatile_qualifier,
2332 invalid_align,
2333 invalid_bit_range,
23262334 invalid_token,
23272335 same_line_doc_comment,
23282336 unattached_doc_comment,
lib/std/zig/parse.zig+8-8
......@@ -1777,10 +1777,10 @@ const Parser = struct {
17771777 const mods = try p.parsePtrModifiers();
17781778 const elem_type = try p.expectTypeExpr();
17791779 if (mods.bit_range_start != 0) {
1780 @panic("TODO implement this error");
1781 //try p.warn(.{
1782 // .BitRangeInvalid = .{ .node = mods.bit_range_start },
1783 //});
1780 try p.warnMsg(.{
1781 .tag = .invalid_bit_range,
1782 .token = p.nodes.items(.main_token)[mods.bit_range_start],
1783 });
17841784 }
17851785 if (len_expr == 0) {
17861786 if (sentinel == 0) {
......@@ -1816,10 +1816,10 @@ const Parser = struct {
18161816 }
18171817 } else {
18181818 if (mods.align_node != 0) {
1819 @panic("TODO implement this error");
1820 //try p.warn(.{
1821 // .AlignInvalid = .{ .node = mods.align_node },
1822 //});
1819 try p.warnMsg(.{
1820 .tag = .invalid_align,
1821 .token = p.nodes.items(.main_token)[mods.align_node],
1822 });
18231823 }
18241824 if (sentinel == 0) {
18251825 return p.addNode(.{
lib/std/zig/parser_test.zig+16
......@@ -4032,6 +4032,22 @@ test "zig fmt: trailing comma should force multiline 1 column" {
40324032// );
40334033//}
40344034
4035test "zig fmt: error for invalid bit range" {
4036 try testError(
4037 \\var x: []align(0:0:0)u8 = bar;
4038 , &[_]Error{
4039 .invalid_bit_range,
4040 });
4041}
4042
4043test "zig fmt: error for invalid align" {
4044 try testError(
4045 \\var x: [10]align(10)u8 = bar;
4046 , &[_]Error{
4047 .invalid_align,
4048 });
4049}
4050
40354051test "recovery: top level" {
40364052 try testError(
40374053 \\test "" {inline}