Make sure that we instantiate default function arguments for an

overloaded operator(). 

llvm-svn: 86581
This commit is contained in:
Douglas Gregor 2009-11-09 19:27:57 +00:00
parent d2f9c044c0
commit 1bc688dc60
2 changed files with 23 additions and 3 deletions

View File

@ -5420,7 +5420,14 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object,
QualType ProtoArgType = Proto->getArgType(i);
IsError |= PerformCopyInitialization(Arg, ProtoArgType, "passing");
} else {
Arg = CXXDefaultArgExpr::Create(Context, Method->getParamDecl(i));
OwningExprResult DefArg
= BuildCXXDefaultArgExpr(LParenLoc, Method, Method->getParamDecl(i));
if (DefArg.isInvalid()) {
IsError = true;
break;
}
Arg = DefArg.takeAs<Expr>();
}
TheCall->setArg(i + 1, Arg);

View File

@ -65,8 +65,8 @@ void test_x0(X0<int> xi) {
xi.f(17);
}
struct NotDefaultConstructible { // expected-note{{candidate}}
NotDefaultConstructible(int); // expected-note{{candidate}}
struct NotDefaultConstructible { // expected-note 2{{candidate}}
NotDefaultConstructible(int); // expected-note 2{{candidate}}
};
void test_x0_not_default_constructible(X0<NotDefaultConstructible> xn) {
@ -85,6 +85,18 @@ void test_X1() {
X1<int> x1;
}
template<typename T>
struct X2 {
void operator()(T = T()); // expected-error{{no matching}}
};
void test_x2(X2<int> x2i, X2<NotDefaultConstructible> x2n) {
x2i();
x2i(17);
x2n(NotDefaultConstructible(17));
x2n(); // expected-note{{in instantiation of default function argument}}
}
// PR5283
namespace PR5283 {
template<typename T> struct A {
@ -131,3 +143,4 @@ namespace pr5301 {
h(0);
}
}