parse: implement error for invalid bit range and alignment

This commit is contained in:
Andrew Kelley 2021-02-21 00:18:20 -07:00
parent 4074e79748
commit 88d0e77b97
3 changed files with 32 additions and 8 deletions

View File

@ -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,

View File

@ -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(.{

View File

@ -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}