diff options
-rw-r--r-- | include/clang/Parse/Parser.h | 10 | ||||
-rw-r--r-- | lib/Parse/ParseExprCXX.cpp | 15 |
2 files changed, 12 insertions, 13 deletions
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index bc5a3a5adc..69488fcda8 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -688,16 +688,6 @@ private: OwningExprResult ParseParenExpression(ParenParseOption &ExprType, TypeTy *&CastTy, SourceLocation &RParenLoc); - - OwningExprResult ParseSimpleParenExpression() { // Parse SimpleExpr only. - SourceLocation RParenLoc; - return ParseSimpleParenExpression(RParenLoc); - } - OwningExprResult ParseSimpleParenExpression(SourceLocation &RParenLoc) { - ParenParseOption Op = SimpleExpr; - TypeTy *CastTy; - return ParseParenExpression(Op, CastTy, RParenLoc); - } OwningExprResult ParseStringLiteralExpression(); diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index c065b4760a..f2a5902e41 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -322,10 +322,19 @@ Parser::OwningExprResult Parser::ParseCXXCasts() { SourceLocation LParenLoc = Tok.getLocation(), RParenLoc; - if (Tok.isNot(tok::l_paren)) - return ExprError(Diag(Tok, diag::err_expected_lparen_after) << CastName); + if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, CastName)) + return ExprError(); - OwningExprResult Result(ParseSimpleParenExpression(RParenLoc)); + OwningExprResult Result = ParseExpression(); + + // Match the ')'. + if (Result.isInvalid()) + SkipUntil(tok::r_paren); + + if (Tok.is(tok::r_paren)) + RParenLoc = ConsumeParen(); + else + MatchRHSPunctuation(tok::r_paren, LParenLoc); if (!Result.isInvalid() && !CastTy.isInvalid()) Result = Actions.ActOnCXXNamedCast(OpLoc, Kind, |