summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-27 23:24:55 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-27 23:24:55 +0000
commit3fb22baddb7460a4d0f33edae8c3d655cce8d25e (patch)
tree25e68edf287ef3193a2437c142b3b4e88debd796 /clang
parente9f2f0cb0b16d39388991c57900a2fdff0422057 (diff)
downloadbcm5719-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.cpp2
-rw-r--r--clang/test/CodeGenCXX/rvalue-references.cpp9
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
OpenPOWER on IntegriCloud