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 {...@@ -262,6 +262,12 @@ pub const Tree = struct {
262 .extra_volatile_qualifier => {262 .extra_volatile_qualifier => {
263 return stream.writeAll("extra volatile qualifier");263 return stream.writeAll("extra volatile qualifier");
264 },264 },
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 },
265 .invalid_token => {271 .invalid_token => {
266 return stream.print("invalid token '{s}'", .{272 return stream.print("invalid token '{s}'", .{
267 token_tags[parse_error.token].symbol(),273 token_tags[parse_error.token].symbol(),
...@@ -2323,6 +2329,8 @@ pub const Error = struct {...@@ -2323,6 +2329,8 @@ pub const Error = struct {
2323 extra_allowzero_qualifier,2329 extra_allowzero_qualifier,
2324 extra_const_qualifier,2330 extra_const_qualifier,
2325 extra_volatile_qualifier,2331 extra_volatile_qualifier,
2332 invalid_align,
2333 invalid_bit_range,
2326 invalid_token,2334 invalid_token,
2327 same_line_doc_comment,2335 same_line_doc_comment,
2328 unattached_doc_comment,2336 unattached_doc_comment,
lib/std/zig/parse.zig+8-8
...@@ -1777,10 +1777,10 @@ const Parser = struct {...@@ -1777,10 +1777,10 @@ const Parser = struct {
1777 const mods = try p.parsePtrModifiers();1777 const mods = try p.parsePtrModifiers();
1778 const elem_type = try p.expectTypeExpr();1778 const elem_type = try p.expectTypeExpr();
1779 if (mods.bit_range_start != 0) {1779 if (mods.bit_range_start != 0) {
1780 @panic("TODO implement this error");1780 try p.warnMsg(.{
1781 //try p.warn(.{1781 .tag = .invalid_bit_range,
1782 // .BitRangeInvalid = .{ .node = mods.bit_range_start },1782 .token = p.nodes.items(.main_token)[mods.bit_range_start],
1783 //});1783 });
1784 }1784 }
1785 if (len_expr == 0) {1785 if (len_expr == 0) {
1786 if (sentinel == 0) {1786 if (sentinel == 0) {
...@@ -1816,10 +1816,10 @@ const Parser = struct {...@@ -1816,10 +1816,10 @@ const Parser = struct {
1816 }1816 }
1817 } else {1817 } else {
1818 if (mods.align_node != 0) {1818 if (mods.align_node != 0) {
1819 @panic("TODO implement this error");1819 try p.warnMsg(.{
1820 //try p.warn(.{1820 .tag = .invalid_align,
1821 // .AlignInvalid = .{ .node = mods.align_node },1821 .token = p.nodes.items(.main_token)[mods.align_node],
1822 //});1822 });
1823 }1823 }
1824 if (sentinel == 0) {1824 if (sentinel == 0) {
1825 return p.addNode(.{1825 return p.addNode(.{
lib/std/zig/parser_test.zig+16
...@@ -4032,6 +4032,22 @@ test "zig fmt: trailing comma should force multiline 1 column" {...@@ -4032,6 +4032,22 @@ test "zig fmt: trailing comma should force multiline 1 column" {
4032// );4032// );
4033//}4033//}
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
4035test "recovery: top level" {4051test "recovery: top level" {
4036 try testError(4052 try testError(
4037 \\test "" {inline}4053 \\test "" {inline}