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 '||'