diff options
author | Mike Stump <mrs@apple.com> | 2009-05-15 21:47:08 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-05-15 21:47:08 +0000 |
commit | 76b824c3889b44aa7334f95dfeb3cef1c683e5ca (patch) | |
tree | dbf16b2c69cd097e1952ca2bd2291a6eb4efbaa9 | |
parent | 8a930c3b7359ed74402c468a794937f20c36ce97 (diff) | |
download | bcm5719-llvm-76b824c3889b44aa7334f95dfeb3cef1c683e5ca.tar.gz bcm5719-llvm-76b824c3889b44aa7334f95dfeb3cef1c683e5ca.zip |
Fixup parsing for (throw,throw) and __extension__ throw 1.
llvm-svn: 71897
-rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 11 | ||||
-rw-r--r-- | clang/test/Parser/cxx-throw.cpp | 16 |
2 files changed, 18 insertions, 9 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index bfbac3ac268..c3a38b1fe22 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -201,10 +201,7 @@ static prec::Level getBinOpPrecedence(tok::TokenKind Kind, /// expression ',' assignment-expression /// Parser::OwningExprResult Parser::ParseExpression() { - if (Tok.is(tok::kw_throw)) - return ParseThrowExpression(); - - OwningExprResult LHS(ParseCastExpression(false)); + OwningExprResult LHS(ParseAssignmentExpression()); if (LHS.isInvalid()) return move(LHS); return ParseRHSOfBinaryExpression(move(LHS), prec::Comma); @@ -228,11 +225,7 @@ Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) { /// process of disambiguating between an expression and a declaration. Parser::OwningExprResult Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) { - // FIXME: The handling for throw is almost certainly wrong. - if (Tok.is(tok::kw_throw)) - return ParseThrowExpression(); - - OwningExprResult LHS(ParseCastExpression(false)); + OwningExprResult LHS(ParseAssignmentExpression()); if (LHS.isInvalid()) return move(LHS); LHS = Actions.ActOnUnaryOp(CurScope, ExtLoc, tok::kw___extension__, diff --git a/clang/test/Parser/cxx-throw.cpp b/clang/test/Parser/cxx-throw.cpp new file mode 100644 index 00000000000..968ef469f9c --- /dev/null +++ b/clang/test/Parser/cxx-throw.cpp @@ -0,0 +1,16 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +int i; + +void foo() { + (throw,throw); + (1 ? throw 1 : throw 2); + throw int(1); + throw; + throw 1; + throw; + 1 ? throw : (void)42; + // gcc doesn't parse the below, but we do + __extension__ throw 1; + (void)throw; // expected-error {{expected expression}} +} |