1*67e74705SXin Li // RUN: %clang_cc1 -triple armv7-none-eabi -emit-llvm -o - %s | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li struct A { int x; A(int); ~A(); }; f()4*67e74705SXin LiA f() { return A(0); } 5*67e74705SXin Li // CHECK-LABEL: define void @_Z1fv 6*67e74705SXin Li // CHECK: call {{.*}} @_ZN1AC1Ei 7*67e74705SXin Li // CHECK-NEXT: ret void 8*67e74705SXin Li 9*67e74705SXin Li // Verify that we do not elide copies when constructing a base class. 10*67e74705SXin Li namespace no_elide_base { 11*67e74705SXin Li struct Base { 12*67e74705SXin Li Base(const Base&); 13*67e74705SXin Li ~Base(); 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li struct Other { 17*67e74705SXin Li operator Base() const; 18*67e74705SXin Li }; 19*67e74705SXin Li 20*67e74705SXin Li struct Derived : public virtual Base { 21*67e74705SXin Li Derived(const Other &O); 22*67e74705SXin Li }; 23*67e74705SXin Li 24*67e74705SXin Li // CHECK: define {{.*}} @_ZN13no_elide_base7DerivedC1ERKNS_5OtherE(%"struct.no_elide_base::Derived"* returned %this, %"struct.no_elide_base::Other"* dereferenceable({{[0-9]+}}) %O) unnamed_addr Derived(const Other & O)25*67e74705SXin Li Derived::Derived(const Other &O) 26*67e74705SXin Li // CHECK: call {{.*}} @_ZNK13no_elide_base5OthercvNS_4BaseEEv 27*67e74705SXin Li // CHECK: call {{.*}} @_ZN13no_elide_base4BaseC2ERKS0_ 28*67e74705SXin Li // CHECK: call {{.*}} @_ZN13no_elide_base4BaseD1Ev 29*67e74705SXin Li : Base(O) 30*67e74705SXin Li { 31*67e74705SXin Li // CHECK: ret 32*67e74705SXin Li } 33*67e74705SXin Li } 34*67e74705SXin Li 35*67e74705SXin Li // PR8683. 36*67e74705SXin Li 37*67e74705SXin Li namespace PR8683 { 38*67e74705SXin Li 39*67e74705SXin Li struct A { 40*67e74705SXin Li A(); 41*67e74705SXin Li A(const A&); 42*67e74705SXin Li A& operator=(const A&); 43*67e74705SXin Li }; 44*67e74705SXin Li 45*67e74705SXin Li struct B { 46*67e74705SXin Li A a; 47*67e74705SXin Li }; 48*67e74705SXin Li f()49*67e74705SXin Livoid f() { 50*67e74705SXin Li // Verify that we don't mark the copy constructor in this expression as elidable. 51*67e74705SXin Li // CHECK: call {{.*}} @_ZN6PR86831AC1ERKS0_ 52*67e74705SXin Li A a = (B().a); 53*67e74705SXin Li } 54*67e74705SXin Li 55*67e74705SXin Li } 56*67e74705SXin Li 57*67e74705SXin Li namespace PR12139 { 58*67e74705SXin Li struct A { APR12139::A59*67e74705SXin Li A() : value(1) { } APR12139::A60*67e74705SXin Li A(A const &, int value = 2) : value(value) { } 61*67e74705SXin Li int value; 62*67e74705SXin Li makeAPR12139::A63*67e74705SXin Li static A makeA() { A a; a.value = 2; return a; } 64*67e74705SXin Li }; 65*67e74705SXin Li 66*67e74705SXin Li // CHECK-LABEL: define i32 @_ZN7PR121394testEv test()67*67e74705SXin Li int test() { 68*67e74705SXin Li // CHECK: call void @_ZN7PR121391A5makeAEv 69*67e74705SXin Li // CHECK-NEXT: call %"struct.PR12139::A"* @_ZN7PR121391AC1ERKS0_i 70*67e74705SXin Li A a(A::makeA(), 3); 71*67e74705SXin Li // CHECK-NEXT: getelementptr inbounds 72*67e74705SXin Li // CHECK-NEXT: load 73*67e74705SXin Li // CHECK-NEXT: ret i32 74*67e74705SXin Li return a.value; 75*67e74705SXin Li } 76*67e74705SXin Li } 77