diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-25 13:07:08 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-25 13:07:08 +0000 |
commit | 10ebe78730e6620060ccc05e9fefaecd671d7693 (patch) | |
tree | f3a0a799993e5c47ccfd1192d2e696a44f27b1e6 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 5fed82025e79b109bc1a1813a2ce13b11ed7f045 (diff) | |
download | bcm5719-llvm-10ebe78730e6620060ccc05e9fefaecd671d7693.tar.gz bcm5719-llvm-10ebe78730e6620060ccc05e9fefaecd671d7693.zip |
Improved support for default arguments in constructors for class templates.
llvm-svn: 79984
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f4b5a57ed53..c30b974af9d 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -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, |