r221661 - Fix parsing of fold-expressions within a cast expression. We parse the
Richard Smith
richard-llvm at metafoo.co.uk
Mon Nov 10 19:28:50 PST 2014
Author: rsmith
Date: Mon Nov 10 21:28:50 2014
New Revision: 221661
URL: http://llvm.org/viewvc/llvm-project?rev=221661&view=rev
Log:
Fix parsing of fold-expressions within a cast expression. We parse the
parenthesized expression a bit differently in this case, just in case the
commas have special meaning.
Modified:
cfe/trunk/lib/Parse/ParseExpr.cpp
cfe/trunk/test/SemaTemplate/cxx1z-fold-expressions.cpp
Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=221661&r1=221660&r2=221661&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Mon Nov 10 21:28:50 2014
@@ -2203,24 +2203,30 @@ Parser::ParseParenExpression(ParenParseO
Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
return ExprError();
}
+ } else if (Tok.is(tok::ellipsis) &&
+ isFoldOperator(NextToken().getKind())) {
+ return ParseFoldExpression(ExprResult(), T);
} else if (isTypeCast) {
// Parse the expression-list.
InMessageExpressionRAIIObject InMessage(*this, false);
-
+
ExprVector ArgExprs;
CommaLocsTy CommaLocs;
if (!ParseSimpleExpressionList(ArgExprs, CommaLocs)) {
+ // FIXME: If we ever support comma expressions as operands to
+ // fold-expressions, we'll need to allow multiple ArgExprs here.
+ if (ArgExprs.size() == 1 && isFoldOperator(Tok.getKind()) &&
+ NextToken().is(tok::ellipsis))
+ return ParseFoldExpression(Result, T);
+
ExprType = SimpleExpr;
Result = Actions.ActOnParenListExpr(OpenLoc, Tok.getLocation(),
ArgExprs);
}
- } else if (Tok.is(tok::ellipsis) &&
- isFoldOperator(NextToken().getKind())) {
- return ParseFoldExpression(ExprResult(), T);
} else {
InMessageExpressionRAIIObject InMessage(*this, false);
-
+
Result = ParseExpression(MaybeTypeCast);
ExprType = SimpleExpr;
Modified: cfe/trunk/test/SemaTemplate/cxx1z-fold-expressions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/cxx1z-fold-expressions.cpp?rev=221661&r1=221660&r2=221661&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/cxx1z-fold-expressions.cpp (original)
+++ cfe/trunk/test/SemaTemplate/cxx1z-fold-expressions.cpp Mon Nov 10 21:28:50 2014
@@ -55,10 +55,9 @@ template<int ...N> void empty_with_base(
extern int k;
(k = ... = N); // expected-warning{{unused}}
- // FIXME: We misparse these. The first one looks a lot loke a declaration;
- // it's not clear what's happening in the second one.
void (k = ... = N); // expected-error {{expected ')'}} expected-note {{to match}}
- (void) (k = ... = N); // expected-error {{expected ')'}} expected-note {{to match}}
+ void ((k = ... = N));
+ (void) (k = ... = N);
}
template void empty_with_base<>(); // expected-note {{in instantiation of}}
template void empty_with_base<1>();
More information about the cfe-commits
mailing list