diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-27 05:08:22 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-27 05:08:22 +0000 |
commit | 574315a0fae41cb7379b6b69c7c86f68ea7354ca (patch) | |
tree | f004e38924f7eae882d597e0211e589246324fc7 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 1ce61b82ac0c3012b47ff4ca29cc87b2254adf3f (diff) | |
download | bcm5719-llvm-574315a0fae41cb7379b6b69c7c86f68ea7354ca.tar.gz bcm5719-llvm-574315a0fae41cb7379b6b69c7c86f68ea7354ca.zip |
Add a BuildCXXTemporaryObjectExpr and use it so default arguments will be instantiated correctly for temporary object expressions.
llvm-svn: 80206
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e93624af154..2f797daea32 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2467,7 +2467,7 @@ Sema::BuildCXXConstructExpr(QualType DeclInitType, Elidable, Exprs, NumExprs)); - // default arguments must be added to constructor call expression. + // 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++) { @@ -2484,6 +2484,37 @@ Sema::BuildCXXConstructExpr(QualType DeclInitType, return move(Temp); } +Sema::OwningExprResult +Sema::BuildCXXTemporaryObjectExpr(CXXConstructorDecl *Constructor, + QualType Ty, + SourceLocation TyBeginLoc, + MultiExprArg Args, + SourceLocation RParenLoc) { + CXXTemporaryObjectExpr *E + = new (Context) CXXTemporaryObjectExpr(Context, Constructor, Ty, TyBeginLoc, + (Expr **)Args.get(), + Args.size(), RParenLoc); + + ExprOwningPtr<CXXTemporaryObjectExpr> Temp(this, E); + + // Default arguments must be added to constructor call expression. + FunctionDecl *FDecl = cast<FunctionDecl>(Constructor); + unsigned NumArgsInProto = FDecl->param_size(); + for (unsigned j = Args.size(); j != NumArgsInProto; j++) { + ParmVarDecl *Param = FDecl->getParamDecl(j); + + OwningExprResult ArgExpr = BuildCXXDefaultArgExpr(TyBeginLoc, FDecl, Param); + if (ArgExpr.isInvalid()) + return ExprError(); + + Temp->setArg(j, ArgExpr.takeAs<Expr>()); + } + + Args.release(); + return move(Temp); +} + + bool Sema::InitializeVarWithConstructor(VarDecl *VD, CXXConstructorDecl *Constructor, QualType DeclInitType, |