commit 88d0e77b9747152a923e4a4479988924de0fe26f (tree)
parent 4074e79748ad9ecc39a4127cd1c28c115efff56a
Author: Andrew Kelley <andrew@ziglang.org>
Date: Sun, 21 Feb 2021 00:18:20 -0700
parse: implement error for invalid bit range and alignment
Diffstat:
3 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/lib/std/zig/ast.zig b/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,
diff --git a/lib/std/zig/parse.zig b/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(.{
diff --git a/lib/std/zig/parser_test.zig b/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}