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();
}