Improved support for default arguments in constructors for class templates.

llvm-svn: 79984
This commit is contained in:
Anders Carlsson 2009-08-25 13:07:08 +00:00
parent 5fed82025e
commit 10ebe78730
2 changed files with 25 additions and 18 deletions

View File

@ -2442,29 +2442,28 @@ Sema::BuildCXXConstructExpr(QualType DeclInitType,
bool Elidable,
Expr **Exprs,
unsigned NumExprs) {
CXXConstructExpr *Temp = CXXConstructExpr::Create(Context, DeclInitType,
Constructor,
Elidable, Exprs, NumExprs);
ExprOwningPtr<CXXConstructExpr> Temp(this,
CXXConstructExpr::Create(Context,
DeclInitType,
Constructor,
Elidable,
Exprs,
NumExprs));
// default arguments must be added to constructor call expression.
FunctionDecl *FDecl = cast<FunctionDecl>(Constructor);
unsigned NumArgsInProto = FDecl->param_size();
for (unsigned j = NumExprs; j != NumArgsInProto; j++) {
Expr *DefaultExpr = FDecl->getParamDecl(j)->getDefaultArg();
// If the default expression creates temporaries, we need to
// push them to the current stack of expression temporaries so they'll
// be properly destroyed.
if (CXXExprWithTemporaries *E
= dyn_cast_or_null<CXXExprWithTemporaries>(DefaultExpr)) {
assert(!E->shouldDestroyTemporaries() &&
"Can't destroy temporaries in a default argument expr!");
for (unsigned I = 0, N = E->getNumTemporaries(); I != N; ++I)
ExprTemporaries.push_back(E->getTemporary(I));
}
Expr *Arg = CXXDefaultArgExpr::Create(Context, FDecl->getParamDecl(j));
Temp->setArg(j, Arg);
ParmVarDecl *Param = FDecl->getParamDecl(j);
OwningExprResult ArgExpr =
BuildCXXDefaultArgExpr(/*FIXME:*/SourceLocation(),
FDecl, Param);
if (ArgExpr.isInvalid())
return ExprError();
Temp->setArg(j, ArgExpr.takeAs<Expr>());
}
return Owned(Temp);
return move(Temp);
}
bool Sema::InitializeVarWithConstructor(VarDecl *VD,

View File

@ -18,3 +18,11 @@ void g() {
f3(10);
f3(S()); // expected-note{{in instantiation of default argument for 'f3<struct S>' required here}}
}
template<typename T> struct F {
F(T t = 10);
};
void g2() {
F<int> f;
}