forked from OSchip/llvm-project
Allow elision of invocations of move constructors from temporary objects.
llvm-svn: 124455
This commit is contained in:
parent
e9f2f0cb0b
commit
3fb22baddb
|
@ -5551,7 +5551,7 @@ Sema::BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType,
|
||||||
// can be omitted by constructing the temporary object
|
// can be omitted by constructing the temporary object
|
||||||
// directly into the target of the omitted copy/move
|
// directly into the target of the omitted copy/move
|
||||||
if (ConstructKind == CXXConstructExpr::CK_Complete &&
|
if (ConstructKind == CXXConstructExpr::CK_Complete &&
|
||||||
Constructor->isCopyConstructor() && ExprArgs.size() >= 1) {
|
Constructor->isCopyOrMoveConstructor() && ExprArgs.size() >= 1) {
|
||||||
Expr *SubExpr = ((Expr **)ExprArgs.get())[0];
|
Expr *SubExpr = ((Expr **)ExprArgs.get())[0];
|
||||||
Elidable = SubExpr->isTemporaryObject(Context, Constructor->getParent());
|
Elidable = SubExpr->isTemporaryObject(Context, Constructor->getParent());
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,13 +62,10 @@ C test();
|
||||||
// CHECK: define void @_Z15elide_copy_initv
|
// CHECK: define void @_Z15elide_copy_initv
|
||||||
void elide_copy_init() {
|
void elide_copy_init() {
|
||||||
ok = false;
|
ok = false;
|
||||||
// FIXME: We're doing an extra move here, when we shouldn't be!
|
// CHECK: call void @_Z4testv
|
||||||
// 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)
|
|
||||||
C a = test();
|
C a = test();
|
||||||
// CHECK: call void @_ZN1CD1Ev(%class.C* %a)
|
// CHECK-NEXT: call void @_ZN1CD1Ev
|
||||||
// CHECK: ret void
|
// CHECK-NEXT: ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @_Z16test_move_returnv
|
// CHECK: define void @_Z16test_move_returnv
|
||||||
|
|
Loading…
Reference in New Issue