Commit 960b5b518f
Changed files (2)
lib
std
lib/std/zig/tokenizer.zig
@@ -403,6 +403,7 @@ pub const Tokenizer = struct {
angle_bracket_angle_bracket_right,
period,
period_2,
+ period_asterisk,
saw_at_sign,
};
@@ -979,9 +980,7 @@ pub const Tokenizer = struct {
state = .period_2;
},
'*' => {
- result.id = .PeriodAsterisk;
- self.index += 1;
- break;
+ state = .period_asterisk;
},
else => {
result.id = .Period;
@@ -1001,6 +1000,17 @@ pub const Tokenizer = struct {
},
},
+ .period_asterisk => switch (c) {
+ '*' => {
+ result.id = .Invalid;
+ break;
+ },
+ else => {
+ result.id = .PeriodAsterisk;
+ break;
+ }
+ },
+
.slash => switch (c) {
'/' => {
state = .line_comment_start;
@@ -1376,6 +1386,9 @@ pub const Tokenizer = struct {
.period_2 => {
result.id = .Ellipsis2;
},
+ .period_asterisk => {
+ result.id = .PeriodAsterisk;
+ },
.pipe => {
result.id = .Pipe;
},
@@ -1762,6 +1775,31 @@ test "correctly parse pointer assignment" {
});
}
+test "correctly parse pointer dereference followed by asterisk" {
+ testTokenize("\"b\".* ** 10", &[_]Token.Id{
+ .StringLiteral,
+ .PeriodAsterisk,
+ .AsteriskAsterisk,
+ .IntegerLiteral,
+ });
+
+ testTokenize("(\"b\".*)** 10", &[_]Token.Id{
+ .LParen,
+ .StringLiteral,
+ .PeriodAsterisk,
+ .RParen,
+ .AsteriskAsterisk,
+ .IntegerLiteral,
+ });
+
+ testTokenize("\"b\".*** 10", &[_]Token.Id{
+ .StringLiteral,
+ .Invalid,
+ .AsteriskAsterisk,
+ .IntegerLiteral,
+ });
+}
+
test "tokenizer - range literals" {
testTokenize("0...9", &[_]Token.Id{ .IntegerLiteral, .Ellipsis3, .IntegerLiteral });
testTokenize("'0'...'9'", &[_]Token.Id{ .CharLiteral, .Ellipsis3, .CharLiteral });
test/compile_errors.zig
@@ -8195,4 +8195,12 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
, &[_][]const u8{
"tmp.zig:4:9: error: expected type '*c_void', found '?*c_void'",
});
+
+ cases.add("Issue #6823: don't allow .* to be followed by **",
+ \\fn foo() void {
+ \\ var sequence = "repeat".*** 10;
+ \\}
+ , &[_][]const u8{
+ "tmp.zig:2:30: error: `.*` can't be followed by `*`. Are you missing a space?",
+ });
}