diff options
| author | Douglas Gregor <dgregor@apple.com> | 2011-01-27 23:24:55 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2011-01-27 23:24:55 +0000 |
| commit | 3fb22baddb7460a4d0f33edae8c3d655cce8d25e (patch) | |
| tree | 25e68edf287ef3193a2437c142b3b4e88debd796 /clang | |
| parent | e9f2f0cb0b16d39388991c57900a2fdff0422057 (diff) | |
| download | bcm5719-llvm-3fb22baddb7460a4d0f33edae8c3d655cce8d25e.tar.gz bcm5719-llvm-3fb22baddb7460a4d0f33edae8c3d655cce8d25e.zip | |
Allow elision of invocations of move constructors from temporary objects.
llvm-svn: 124455
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/rvalue-references.cpp | 9 |
2 files changed, 4 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 78d9a5b959a..5da10352cc1 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -5551,7 +5551,7 @@ Sema::BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, // can be omitted by constructing the temporary object // directly into the target of the omitted copy/move if (ConstructKind == CXXConstructExpr::CK_Complete && - Constructor->isCopyConstructor() && ExprArgs.size() >= 1) { + Constructor->isCopyOrMoveConstructor() && ExprArgs.size() >= 1) { Expr *SubExpr = ((Expr **)ExprArgs.get())[0]; Elidable = SubExpr->isTemporaryObject(Context, Constructor->getParent()); } diff --git a/clang/test/CodeGenCXX/rvalue-references.cpp b/clang/test/CodeGenCXX/rvalue-references.cpp index a7c74ae5c06..e15172355eb 100644 --- a/clang/test/CodeGenCXX/rvalue-references.cpp +++ b/clang/test/CodeGenCXX/rvalue-references.cpp @@ -62,13 +62,10 @@ C test(); // CHECK: define void @_Z15elide_copy_initv void elide_copy_init() { ok = false; - // FIXME: We're doing an extra move here, when we shouldn't be! - // CHECK: call void @_Z4testv(%class.C* sret %ref.tmp) - // CHECK: call void @_ZN1CC1EOS_(%class.C* %a, %class.C* %ref.tmp) - // CHECK: call void @_ZN1CD1Ev(%class.C* %ref.tmp) + // CHECK: call void @_Z4testv C a = test(); - // CHECK: call void @_ZN1CD1Ev(%class.C* %a) - // CHECK: ret void + // CHECK-NEXT: call void @_ZN1CD1Ev + // CHECK-NEXT: ret void } // CHECK: define void @_Z16test_move_returnv |

