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/SemaExprCXX.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/SemaExprCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index a4c3b0dd594..85924948da7 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -239,9 +239,8 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, if (const RecordType *RT = Ty->getAs<RecordType>()) { CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl()); - // FIXME: We should always create a CXXTemporaryObjectExpr here unless - // both the ctor and dtor are trivial. - if (NumExprs > 1 || Record->hasUserDeclaredConstructor()) { + if (NumExprs > 1 || !Record->hasTrivialConstructor() || + !Record->hasTrivialDestructor()) { CXXConstructorDecl *Constructor = PerformInitializationByConstructor(Ty, Exprs, NumExprs, TypeRange.getBegin(), @@ -253,11 +252,13 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, if (!Constructor) return ExprError(); - exprs.release(); - Expr *E = new (Context) CXXTemporaryObjectExpr(Context, Constructor, - Ty, TyBeginLoc, Exprs, - NumExprs, RParenLoc); - return MaybeBindToTemporary(E); + OwningExprResult Result = + BuildCXXTemporaryObjectExpr(Constructor, Ty, TyBeginLoc, + move(exprs), RParenLoc); + if (Result.isInvalid()) + return ExprError(); + + return MaybeBindToTemporary(Result.takeAs<Expr>()); } // Fall through to value-initialize an object of class type that |

