reader/wgsl: Reserve ++ and -- tokens
Fixed: tint:971
Change-Id: I70732db7b22f7785866066cd7966eec630078de0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/57761
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/reader/wgsl/lexer.cc b/src/reader/wgsl/lexer.cc
index 8c92c14..dffed2e 100644
--- a/src/reader/wgsl/lexer.cc
+++ b/src/reader/wgsl/lexer.cc
@@ -423,6 +423,10 @@
type = Token::Type::kArrow;
pos_ += 2;
location_.column += 2;
+ } else if (matches(pos_, "--")) {
+ type = Token::Type::kMinusMinus;
+ pos_ += 2;
+ location_.column += 2;
} else if (matches(pos_, "-")) {
type = Token::Type::kMinus;
pos_ += 1;
@@ -431,6 +435,10 @@
type = Token::Type::kPeriod;
pos_ += 1;
location_.column += 1;
+ } else if (matches(pos_, "++")) {
+ type = Token::Type::kPlusPlus;
+ pos_ += 2;
+ location_.column += 2;
} else if (matches(pos_, "+")) {
type = Token::Type::kPlus;
pos_ += 1;
diff --git a/src/reader/wgsl/lexer_test.cc b/src/reader/wgsl/lexer_test.cc
index c7374f5..52a6f1b 100644
--- a/src/reader/wgsl/lexer_test.cc
+++ b/src/reader/wgsl/lexer_test.cc
@@ -387,8 +387,10 @@
TokenData{"%", Token::Type::kMod},
TokenData{"!=", Token::Type::kNotEqual},
TokenData{"-", Token::Type::kMinus},
+ TokenData{"--", Token::Type::kMinusMinus},
TokenData{".", Token::Type::kPeriod},
TokenData{"+", Token::Type::kPlus},
+ TokenData{"++", Token::Type::kPlusPlus},
TokenData{"|", Token::Type::kOr},
TokenData{"||", Token::Type::kOrOr},
TokenData{"(", Token::Type::kParenLeft},
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 7069756..1c8bfda 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -2223,6 +2223,15 @@
Maybe<ast::Expression*> ParserImpl::postfix_expression(
ast::Expression* prefix) {
Source source;
+
+ if (match(Token::Type::kPlusPlus, &source) ||
+ match(Token::Type::kMinusMinus, &source)) {
+ add_error(source,
+ "postfix increment and decrement operators are reserved for a "
+ "future WGSL version");
+ return Failure::kErrored;
+ }
+
if (match(Token::Type::kBracketLeft, &source)) {
return sync(Token::Type::kBracketRight, [&]() -> Maybe<ast::Expression*> {
auto param = logical_or_expression();
@@ -2299,6 +2308,13 @@
Maybe<ast::Expression*> ParserImpl::unary_expression() {
auto t = peek();
+ if (match(Token::Type::kPlusPlus) || match(Token::Type::kMinusMinus)) {
+ add_error(t.source(),
+ "prefix increment and decrement operators are reserved for a "
+ "future WGSL version");
+ return Failure::kErrored;
+ }
+
ast::UnaryOp op;
if (match(Token::Type::kMinus)) {
op = ast::UnaryOp::kNegation;
diff --git a/src/reader/wgsl/parser_impl_singular_expression_test.cc b/src/reader/wgsl/parser_impl_singular_expression_test.cc
index ee73c87..bcac8ab 100644
--- a/src/reader/wgsl/parser_impl_singular_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_singular_expression_test.cc
@@ -236,6 +236,30 @@
EXPECT_EQ(index_expr->symbol(), p->builder().Symbols().Get("c"));
}
+TEST_F(ParserImplTest, SingularExpression_PostfixPlusPlus) {
+ auto p = parser("a++");
+ auto e = p->singular_expression();
+ EXPECT_FALSE(e.matched);
+ EXPECT_TRUE(e.errored);
+ EXPECT_EQ(e.value, nullptr);
+ EXPECT_TRUE(p->has_error());
+ EXPECT_EQ(p->error(),
+ "1:2: postfix increment and decrement operators are reserved for a "
+ "future WGSL version");
+}
+
+TEST_F(ParserImplTest, SingularExpression_PostfixMinusMinus) {
+ auto p = parser("a--");
+ auto e = p->singular_expression();
+ EXPECT_FALSE(e.matched);
+ EXPECT_TRUE(e.errored);
+ EXPECT_EQ(e.value, nullptr);
+ EXPECT_TRUE(p->has_error());
+ EXPECT_EQ(p->error(),
+ "1:2: postfix increment and decrement operators are reserved for a "
+ "future WGSL version");
+}
+
} // namespace
} // namespace wgsl
} // namespace reader
diff --git a/src/reader/wgsl/parser_impl_unary_expression_test.cc b/src/reader/wgsl/parser_impl_unary_expression_test.cc
index 5bddbaf..0724c55 100644
--- a/src/reader/wgsl/parser_impl_unary_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_unary_expression_test.cc
@@ -177,6 +177,30 @@
EXPECT_EQ(init->literal()->As<ast::SintLiteral>()->value(), 1);
}
+TEST_F(ParserImplTest, UnaryExpression_PrefixPlusPlus) {
+ auto p = parser("++a");
+ auto e = p->unary_expression();
+ EXPECT_FALSE(e.matched);
+ EXPECT_TRUE(e.errored);
+ EXPECT_EQ(e.value, nullptr);
+ EXPECT_TRUE(p->has_error());
+ EXPECT_EQ(p->error(),
+ "1:1: prefix increment and decrement operators are reserved for a "
+ "future WGSL version");
+}
+
+TEST_F(ParserImplTest, UnaryExpression_PrefixMinusMinus) {
+ auto p = parser("--a");
+ auto e = p->unary_expression();
+ EXPECT_FALSE(e.matched);
+ EXPECT_TRUE(e.errored);
+ EXPECT_EQ(e.value, nullptr);
+ EXPECT_TRUE(p->has_error());
+ EXPECT_EQ(p->error(),
+ "1:1: prefix increment and decrement operators are reserved for a "
+ "future WGSL version");
+}
+
} // namespace
} // namespace wgsl
} // namespace reader
diff --git a/src/reader/wgsl/token.cc b/src/reader/wgsl/token.cc
index 7616a68..9b3e066 100644
--- a/src/reader/wgsl/token.cc
+++ b/src/reader/wgsl/token.cc
@@ -84,10 +84,14 @@
return "!=";
case Token::Type::kMinus:
return "-";
+ case Token::Type::kMinusMinus:
+ return "--";
case Token::Type::kPeriod:
return ".";
case Token::Type::kPlus:
return "+";
+ case Token::Type::kPlusPlus:
+ return "++";
case Token::Type::kOr:
return "|";
case Token::Type::kOrOr:
diff --git a/src/reader/wgsl/token.h b/src/reader/wgsl/token.h
index e94f5a0..467e6ac 100644
--- a/src/reader/wgsl/token.h
+++ b/src/reader/wgsl/token.h
@@ -90,12 +90,16 @@
kMod,
/// A '-'
kMinus,
+ /// A '--'
+ kMinusMinus,
/// A '!='
kNotEqual,
/// A '.'
kPeriod,
/// A '+'
kPlus,
+ /// A '++'
+ kPlusPlus,
/// A '|'
kOr,
/// A '||'