Commit 88d0e77b97

Andrew Kelley <andrew@ziglang.org>
2021-02-21 08:18:20
parse: implement error for invalid bit range and alignment
1 parent 4074e79
Changed files (3)
lib/std/zig/ast.zig
@@ -262,6 +262,12 @@ pub const Tree = struct {
             .extra_volatile_qualifier => {
                 return stream.writeAll("extra volatile qualifier");
             },
+            .invalid_align => {
+                return stream.writeAll("alignment not allowed on arrays");
+            },
+            .invalid_bit_range => {
+                return stream.writeAll("bit range not allowed on slices and arrays");
+            },
             .invalid_token => {
                 return stream.print("invalid token '{s}'", .{
                     token_tags[parse_error.token].symbol(),
@@ -2323,6 +2329,8 @@ pub const Error = struct {
         extra_allowzero_qualifier,
         extra_const_qualifier,
         extra_volatile_qualifier,
+        invalid_align,
+        invalid_bit_range,
         invalid_token,
         same_line_doc_comment,
         unattached_doc_comment,
lib/std/zig/parse.zig
@@ -1777,10 +1777,10 @@ const Parser = struct {
                     const mods = try p.parsePtrModifiers();
                     const elem_type = try p.expectTypeExpr();
                     if (mods.bit_range_start != 0) {
-                        @panic("TODO implement this error");
-                        //try p.warn(.{
-                        //    .BitRangeInvalid = .{ .node = mods.bit_range_start },
-                        //});
+                        try p.warnMsg(.{
+                            .tag = .invalid_bit_range,
+                            .token = p.nodes.items(.main_token)[mods.bit_range_start],
+                        });
                     }
                     if (len_expr == 0) {
                         if (sentinel == 0) {
@@ -1816,10 +1816,10 @@ const Parser = struct {
                         }
                     } else {
                         if (mods.align_node != 0) {
-                            @panic("TODO implement this error");
-                            //try p.warn(.{
-                            //    .AlignInvalid = .{ .node = mods.align_node },
-                            //});
+                            try p.warnMsg(.{
+                                .tag = .invalid_align,
+                                .token = p.nodes.items(.main_token)[mods.align_node],
+                            });
                         }
                         if (sentinel == 0) {
                             return p.addNode(.{
lib/std/zig/parser_test.zig
@@ -4032,6 +4032,22 @@ test "zig fmt: trailing comma should force multiline 1 column" {
 //    );
 //}
 
+test "zig fmt: error for invalid bit range" {
+    try testError(
+        \\var x: []align(0:0:0)u8 = bar;
+    , &[_]Error{
+        .invalid_bit_range,
+    });
+}
+
+test "zig fmt: error for invalid align" {
+    try testError(
+        \\var x: [10]align(10)u8 = bar;
+    , &[_]Error{
+        .invalid_align,
+    });
+}
+
 test "recovery: top level" {
     try testError(
         \\test "" {inline}