Fix parsing of comma fold-expressions as the operand of a C-style cast.
authorRichard Smith <richard@metafoo.co.uk>
Fri, 5 Aug 2022 00:07:43 +0000 (17:07 -0700)
committerRichard Smith <richard@metafoo.co.uk>
Fri, 5 Aug 2022 00:08:08 +0000 (17:08 -0700)
clang/lib/Parse/ParseExpr.cpp
clang/test/Parser/cxx1z-fold-expressions.cpp

index a6a946d..52d4938 100644 (file)
@@ -3469,7 +3469,9 @@ Parser::ParseSimpleExpressionList(SmallVectorImpl<Expr*> &Exprs,
 
     Exprs.push_back(Expr.get());
 
-    if (Tok.isNot(tok::comma))
+    // We might be parsing the LHS of a fold-expression. If we reached the fold
+    // operator, stop.
+    if (Tok.isNot(tok::comma) || NextToken().is(tok::ellipsis))
       return false;
 
     // Move to the next argument, remember where the comma was.
index 93ee6f2..ac27111 100644 (file)
@@ -41,7 +41,13 @@ template<typename ...T> void as_operand_of_cast(int a, T ...t) {
     (int)(t + ... + undeclared_junk) + // expected-error {{undeclared}}
     (int)(... + undeclared_junk) + // expected-error {{undeclared}} expected-error {{does not contain any unexpanded}}
     (int)(undeclared_junk + ...) + // expected-error {{undeclared}}
-    (int)(a + ...); // expected-error {{does not contain any unexpanded}}
+    (int)(a + ...) + // expected-error {{does not contain any unexpanded}}
+    (int)(a, ...) + // expected-error {{does not contain any unexpanded}}
+    (int)(..., a) + // expected-error {{does not contain any unexpanded}}
+    (int)(a, ..., undeclared_junk) + // expected-error {{undeclared}} expected-error {{does not contain any unexpanded}}
+    (int)(t, ...) +
+    (int)(..., t) +
+    (int)(t, ..., a);
 }
 
 // fold-operator can be '>' or '>>'.