summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-08-27 05:08:22 +0000
committerAnders Carlsson <andersca@mac.com>2009-08-27 05:08:22 +0000
commit574315a0fae41cb7379b6b69c7c86f68ea7354ca (patch)
treef004e38924f7eae882d597e0211e589246324fc7 /clang/lib/Sema/SemaDeclCXX.cpp
parent1ce61b82ac0c3012b47ff4ca29cc87b2254adf3f (diff)
downloadbcm5719-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.cpp33
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,
OpenPOWER on IntegriCloud