mirror of https://github.com/microsoft/clang.git
Generate code for the move assignment operator using memcpy, the same as we do
for the copy assignment operator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190385 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
39bd371610
commit
7fda207777
|
@ -702,7 +702,8 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
|
|||
// clones the body of the function call operator (but is actually static).
|
||||
EmitLambdaStaticInvokeFunction(cast<CXXMethodDecl>(FD));
|
||||
} else if (FD->isDefaulted() && isa<CXXMethodDecl>(FD) &&
|
||||
cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator()) {
|
||||
(cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator() ||
|
||||
cast<CXXMethodDecl>(FD)->isMoveAssignmentOperator())) {
|
||||
// Implicit copy-assignment gets the same special treatment as implicit
|
||||
// copy-constructors.
|
||||
emitImplicitAssignmentOperatorBody(Args);
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
// RUN: %clang_cc1 -emit-llvm -std=c++11 -o - %s -triple x86_64-pc-linux-gnu | FileCheck %s
|
||||
|
||||
struct A {
|
||||
A &operator=(A&&);
|
||||
};
|
||||
|
||||
struct B {
|
||||
A a;
|
||||
int i;
|
||||
bool b;
|
||||
char c;
|
||||
long l;
|
||||
float f;
|
||||
};
|
||||
|
||||
void test1() {
|
||||
B b1, b2;
|
||||
b1 = static_cast<B&&>(b2);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define {{.*}} @_ZN1BaSEOS_
|
||||
// CHECK: call {{.*}} @_ZN1AaSEOS_
|
||||
// CHECK-NOT: store
|
||||
// CHECK: call {{.*}}memcpy{{.*}}, i64 24
|
||||
// CHECK-NOT: store
|
||||
// CHECK: ret
|
Loading…
Reference in New Issue