Improve error recovery for calls, fixing:
PR3972: Poor diagnostic with missing ')'


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68932 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index 6713ca9..ebba576 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -851,15 +851,20 @@
       }
 
       // Match the ')'.
-      if (!LHS.isInvalid() && Tok.is(tok::r_paren)) {
+      if (Tok.isNot(tok::r_paren)) {
+        MatchRHSPunctuation(tok::r_paren, Loc);
+        return ExprError();
+      }
+      
+      if (!LHS.isInvalid()) {
         assert((ArgExprs.size() == 0 || ArgExprs.size()-1 == CommaLocs.size())&&
                "Unexpected number of commas!");
         LHS = Actions.ActOnCallExpr(CurScope, move(LHS), Loc,
                                     move_arg(ArgExprs), &CommaLocs[0],
                                     Tok.getLocation());
       }
-
-      MatchRHSPunctuation(tok::r_paren, Loc);
+      
+      ConsumeParen();
       break;
     }
     case tok::arrow:       // postfix-expression: p-e '->' identifier
diff --git a/test/Parser/expressions.c b/test/Parser/expressions.c
index 3f58ef3..2b4d463 100644
--- a/test/Parser/expressions.c
+++ b/test/Parser/expressions.c
@@ -1,4 +1,4 @@
-// RUN: clang-cc -parse-noop %s
+// RUN: clang-cc -parse-noop -verify %s
 
 void test1() {
   if (sizeof (int){ 1});   // sizeof compound literal
@@ -41,3 +41,10 @@
   __extension__ (*(char*)0) = 1;
 }
 
+// PR3972
+int test5(int);
+int test6(void) { 
+  return test5(      // expected-note {{to match}}
+               test5(1)
+                 ; // expected-error {{expected ')'}}
+}