implement rdar://6780761, making sema reject some code that otherwise
crashes codegen.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68891 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 0a12a71..875a382 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -4178,11 +4178,13 @@
   else if (NumArgs > NumArgsInProto)
     NumArgsToCheck = NumArgsInProto;
 
+  bool IsError = false;
+
   // Initialize the implicit object parameter.
-  if (PerformObjectArgumentInitialization(Object, Method))
-    return true;
+  IsError |= PerformObjectArgumentInitialization(Object, Method);
   TheCall->setArg(0, Object);
 
+
   // Check the argument types.
   for (unsigned i = 0; i != NumArgsToCheck; i++) {
     Expr *Arg;
@@ -4191,8 +4193,7 @@
       
       // Pass the argument.
       QualType ProtoArgType = Proto->getArgType(i);
-      if (PerformCopyInitialization(Arg, ProtoArgType, "passing"))
-        return true;
+      IsError |= PerformCopyInitialization(Arg, ProtoArgType, "passing");
     } else {
       Arg = new (Context) CXXDefaultArgExpr(Method->getParamDecl(i));
     }
@@ -4205,12 +4206,13 @@
     // Promote the arguments (C99 6.5.2.2p7).
     for (unsigned i = NumArgsInProto; i != NumArgs; i++) {
       Expr *Arg = Args[i];
-
-      DefaultVariadicArgumentPromotion(Arg, VariadicMethod);
+      IsError |= DefaultVariadicArgumentPromotion(Arg, VariadicMethod);
       TheCall->setArg(i + 1, Arg);
     }
   }
 
+  if (IsError) return true;
+
   return CheckFunctionCall(Method, TheCall.take()).release();
 }