зеркало из https://github.com/microsoft/clang.git
Diagnose a missing ')' on what looks like a statement expression.
A situation where we can get an invalid ExprResult without an error. Fixes PR8394. Patch by Justin Bogner! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
77ebb3829f
Коммит
b3c4906aa6
|
@ -1632,6 +1632,9 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
|
|||
return ExprError();
|
||||
}
|
||||
|
||||
// None of these cases should fall through with an invalid Result
|
||||
// unless they've already reported an error.
|
||||
|
||||
if (ExprType >= CompoundStmt && Tok.is(tok::l_brace)) {
|
||||
Diag(Tok, diag::ext_gnu_statement_expr);
|
||||
ParsedAttributes attrs(AttrFactory);
|
||||
|
@ -1639,7 +1642,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
|
|||
ExprType = CompoundStmt;
|
||||
|
||||
// If the substmt parsed correctly, build the AST node.
|
||||
if (!Stmt.isInvalid() && Tok.is(tok::r_paren))
|
||||
if (!Stmt.isInvalid())
|
||||
Result = Actions.ActOnStmtExpr(OpenLoc, Stmt.take(), Tok.getLocation());
|
||||
|
||||
} else if (ExprType >= CompoundLiteral &&
|
||||
|
@ -1737,6 +1740,8 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
|
|||
|
||||
Result = ParseExpression();
|
||||
ExprType = SimpleExpr;
|
||||
|
||||
// Don't build a paren expression unless we actually match a ')'.
|
||||
if (!Result.isInvalid() && Tok.is(tok::r_paren))
|
||||
Result = Actions.ActOnParenExpr(OpenLoc, Tok.getLocation(), Result.take());
|
||||
}
|
||||
|
|
|
@ -51,3 +51,9 @@ int test6(void) {
|
|||
test5(1)
|
||||
; // expected-error {{expected ')'}}
|
||||
}
|
||||
|
||||
// PR8394
|
||||
void test7() {
|
||||
({} // expected-note {{to match}}
|
||||
; // expected-error {{expected ')'}}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче