diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-27 04:18:06 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-27 04:18:06 +0000 |
commit | 9af5500f3f132f9a2f9abbe82113a7c7bb751472 (patch) | |
tree | 262b83444877ee284c509b5faa4507df10170370 /lib/Parse | |
parent | 6fa9c38744b2332acf9f5a72658fa213f93158de (diff) |
Fix rdar://6719156 - clang should emit a better error when blocks are disabled but are used anyway
by changing blocks from being disabled in the parser to being disabled
in Sema.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67816 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse')
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 7 | ||||
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 20 | ||||
-rw-r--r-- | lib/Parse/ParseTentative.cpp | 5 |
3 files changed, 13 insertions, 19 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index a9fbbbe498..2c26b13dc1 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1682,11 +1682,10 @@ void Parser::ParseDeclaratorInternal(Declarator &D, tok::TokenKind Kind = Tok.getKind(); // Not a pointer, C++ reference, or block. - if (Kind != tok::star && + if (Kind != tok::star && Kind != tok::caret && (Kind != tok::amp || !getLang().CPlusPlus) && // We parse rvalue refs in C++03, because otherwise the errors are scary. - (Kind != tok::ampamp || !getLang().CPlusPlus) && - (Kind != tok::caret || !getLang().Blocks)) { + (Kind != tok::ampamp || !getLang().CPlusPlus)) { if (DirectDeclParser) (this->*DirectDeclParser)(D); return; @@ -1697,7 +1696,7 @@ void Parser::ParseDeclaratorInternal(Declarator &D, SourceLocation Loc = ConsumeToken(); // Eat the *, ^, & or &&. D.SetRangeEnd(Loc); - if (Kind == tok::star || (Kind == tok::caret && getLang().Blocks)) { + if (Kind == tok::star || Kind == tok::caret) { // Is a pointer. DeclSpec DS; diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index c0b28775ce..913f9baff1 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -776,10 +776,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, return ParseObjCAtExpression(AtLoc); } case tok::caret: - if (getLang().Blocks) - return ParsePostfixExpressionSuffix(ParseBlockLiteralExpression()); - Diag(Tok, diag::err_expected_expression); - return ExprError(); + return ParsePostfixExpressionSuffix(ParseBlockLiteralExpression()); case tok::l_square: // These can be followed by postfix-expr pieces. if (getLang().ObjC1) @@ -1344,18 +1341,17 @@ Parser::OwningExprResult Parser::ParseBlockLiteralExpression() { OwningExprResult Result(Actions, true); - if (Tok.is(tok::l_brace)) { - OwningStmtResult Stmt(ParseCompoundStatementBody()); - if (!Stmt.isInvalid()) { - Result = Actions.ActOnBlockStmtExpr(CaretLoc, move(Stmt), CurScope); - } else { - Actions.ActOnBlockError(CaretLoc, CurScope); - } - } else { + if (!Tok.is(tok::l_brace)) { // Saw something like: ^expr Diag(Tok, diag::err_expected_expression); return ExprError(); } + + OwningStmtResult Stmt(ParseCompoundStatementBody()); + if (!Stmt.isInvalid()) + Result = Actions.ActOnBlockStmtExpr(CaretLoc, move(Stmt), CurScope); + else + Actions.ActOnBlockError(CaretLoc, CurScope); return move(Result); } diff --git a/lib/Parse/ParseTentative.cpp b/lib/Parse/ParseTentative.cpp index 176529ce9c..2cca2cdb1e 100644 --- a/lib/Parse/ParseTentative.cpp +++ b/lib/Parse/ParseTentative.cpp @@ -405,14 +405,13 @@ Parser::TPResult Parser::TryParseDeclarator(bool mayBeAbstract, if (Tok.is(tok::coloncolon) || Tok.is(tok::identifier)) TryAnnotateCXXScopeToken(); - if (Tok.is(tok::star) || Tok.is(tok::amp) || - (Tok.is(tok::caret) && getLang().Blocks) || + if (Tok.is(tok::star) || Tok.is(tok::amp) || Tok.is(tok::caret) || (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::star))) { // ptr-operator ConsumeToken(); while (Tok.is(tok::kw_const) || Tok.is(tok::kw_volatile) || - Tok.is(tok::kw_restrict) ) + Tok.is(tok::kw_restrict)) ConsumeToken(); } else { break; |