Make sure that we instantiate default function arguments for an

overloaded operator(). 


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86581 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2009-11-09 19:27:57 +00:00
Родитель 80c30dad6c
Коммит d47c47d65e
2 изменённых файлов: 23 добавлений и 3 удалений

Просмотреть файл

@ -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);

Просмотреть файл

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