forked from OSchip/llvm-project
Improved support for default arguments in constructors for class templates.
llvm-svn: 79984
This commit is contained in:
parent
5fed82025e
commit
10ebe78730
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue