]> granicus.if.org Git - clang/commitdiff
improve and simplify error recovery for calls, fix a crash when diagnosing
authorChris Lattner <sabre@nondot.org>
Sat, 21 Jul 2007 05:18:12 +0000 (05:18 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Jul 2007 05:18:12 +0000 (05:18 +0000)
invalid arguments.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40161 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseExpr.cpp
Sema/SemaType.cpp

index 7048c836fbbdc2b5a96ebeb5f285c56fbafb47b2..a6c6425d2ef9927c541ec2f565f7f875e8b08ecf 100644 (file)
@@ -624,7 +624,6 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
     case tok::l_paren: {   // p-e: p-e '(' argument-expression-list[opt] ')'
       llvm::SmallVector<ExprTy*, 8> ArgExprs;
       llvm::SmallVector<SourceLocation, 8> 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
index 5b1db6e39b6c6aa66ed3776808f65d5ec5374082..c2777fd1ffabac80fe76ad14066454513cd37df6 100644 (file)
@@ -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);