From: Chris Lattner Date: Sat, 21 Jul 2007 05:18:12 +0000 (+0000) Subject: improve and simplify error recovery for calls, fix a crash when diagnosing X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ff5426cd83ae02378efacdfeb70d6785eb09a30;p=clang improve and simplify error recovery for calls, fix a crash when diagnosing invalid arguments. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40161 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Parse/ParseExpr.cpp b/Parse/ParseExpr.cpp index 7048c836fb..a6c6425d2e 100644 --- a/Parse/ParseExpr.cpp +++ b/Parse/ParseExpr.cpp @@ -624,7 +624,6 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { case tok::l_paren: { // p-e: p-e '(' argument-expression-list[opt] ')' llvm::SmallVector ArgExprs; llvm::SmallVector CommaLocs; - bool ArgExprsOk = true; Loc = ConsumeParen(); @@ -632,9 +631,8 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { while (1) { ExprResult ArgExpr = ParseAssignmentExpression(); if (ArgExpr.isInvalid) { - ArgExprsOk = false; SkipUntil(tok::r_paren); - break; + return ExprResult(true); } else ArgExprs.push_back(ArgExpr.Val); @@ -646,15 +644,14 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { } // Match the ')'. - if (!LHS.isInvalid && ArgExprsOk && Tok.getKind() == tok::r_paren) { + if (!LHS.isInvalid && Tok.getKind() == tok::r_paren) { assert((ArgExprs.size() == 0 || ArgExprs.size()-1 == CommaLocs.size())&& "Unexpected number of commas!"); LHS = Actions.ParseCallExpr(LHS.Val, Loc, &ArgExprs[0], ArgExprs.size(), &CommaLocs[0], Tok.getLocation()); } - if (ArgExprsOk) - MatchRHSPunctuation(tok::r_paren, Loc); + MatchRHSPunctuation(tok::r_paren, Loc); break; } case tok::arrow: // postfix-expression: p-e '->' identifier diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp index 5b1db6e39b..c2777fd1ff 100644 --- a/Sema/SemaType.cpp +++ b/Sema/SemaType.cpp @@ -204,19 +204,20 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) { // have arguments of incomplete type. if (FTI.NumArgs != 1 || FTI.isVariadic) { Diag(DeclType.Loc, diag::err_void_only_param); - return QualType(); - } - // Reject, but continue to parse 'int(void abc)'. - if (FTI.ArgInfo[i].Ident) + ArgTy = Context.IntTy; + } else if (FTI.ArgInfo[i].Ident) { + // Reject, but continue to parse 'int(void abc)'. Diag(FTI.ArgInfo[i].IdentLoc, diag::err_void_param_with_identifier); - - // Reject, but continue to parse 'float(const void)'. - if (ArgTy.getQualifiers()) - Diag(DeclType.Loc, diag::err_void_param_qualified); - - // Do not add 'void' to the ArgTys list. - break; + ArgTy = Context.IntTy; + } else { + // Reject, but continue to parse 'float(const void)'. + if (ArgTy.getQualifiers()) + Diag(DeclType.Loc, diag::err_void_param_qualified); + + // Do not add 'void' to the ArgTys list. + break; + } } ArgTys.push_back(ArgTy);