aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseExprCXX.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-06 06:02:23 +0000
committerChris Lattner <sabre@nondot.org>2008-04-06 06:02:23 +0000
commit2a2819a0a8e114bfa5a3c4fc4c97fa173155bae9 (patch)
treec83f06737a6d0cc96a17bcdee447af371566837b /lib/Parse/ParseExprCXX.cpp
parentef4715c3feb2c77f07171577510ef861753280b6 (diff)
finish up throw parsing.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49266 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseExprCXX.cpp')
-rw-r--r--lib/Parse/ParseExprCXX.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp
index 6b42fb5b08..c98a7f91f8 100644
--- a/lib/Parse/ParseExprCXX.cpp
+++ b/lib/Parse/ParseExprCXX.cpp
@@ -87,13 +87,21 @@ Parser::ExprResult Parser::ParseThrowExpression() {
ExprResult Expr;
SourceLocation ThrowLoc = ConsumeToken(); // Eat the throw token.
- // FIXME: Anything that isn't an assignment-expression should bail out now.
- if (Tok.is(tok::semi) || Tok.is(tok::r_paren) || Tok.is(tok::colon) ||
- Tok.is(tok::comma))
+ // If the current token isn't the start of an assignment-expression,
+ // then the expression is not present. This handles things like:
+ // "C ? throw : (void)42", which is crazy but legal.
+ switch (Tok.getKind()) { // FIXME: move this predicate somewhere common.
+ case tok::semi:
+ case tok::r_paren:
+ case tok::r_square:
+ case tok::r_brace:
+ case tok::colon:
+ case tok::comma:
return Actions.ActOnCXXThrow(ThrowLoc);
- Expr = ParseAssignmentExpression();
- if (!Expr.isInvalid)
- Expr = Actions.ActOnCXXThrow(ThrowLoc, Expr.Val);
- return Expr;
+ default:
+ Expr = ParseAssignmentExpression();
+ if (Expr.isInvalid) return Expr;
+ return Actions.ActOnCXXThrow(ThrowLoc, Expr.Val);
+ }
}