1 // RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s 2 3 struct A { int x; A(int); ~A(); }; 4 A f() { return A(0); } 5 // CHECK: define void @_Z1fv 6 // CHECK: call {{.*}} @_ZN1AC1Ei 7 // CHECK-NEXT: ret void 8 9 // Verify that we do not elide copies when constructing a base class. 10 namespace no_elide_base { 11 struct Base { 12 Base(const Base&); 13 ~Base(); 14 }; 15 16 struct Other { 17 operator Base() const; 18 }; 19 20 struct Derived : public virtual Base { 21 Derived(const Other &O); 22 }; 23 24 // CHECK: define {{.*}} @_ZN13no_elide_base7DerivedC1ERKNS_5OtherE(%"struct.no_elide_base::Derived"* %this, %"struct.no_elide_base::Other"* %O) unnamed_addr 25 Derived::Derived(const Other &O) 26 // CHECK: call {{.*}} @_ZNK13no_elide_base5OthercvNS_4BaseEEv 27 // CHECK: call {{.*}} @_ZN13no_elide_base4BaseC2ERKS0_ 28 // CHECK: call {{.*}} @_ZN13no_elide_base4BaseD1Ev 29 : Base(O) 30 { 31 // CHECK: ret 32 } 33 } 34 35 // PR8683. 36 37 namespace PR8683 { 38 39 struct A { 40 A(); 41 A(const A&); 42 A& operator=(const A&); 43 }; 44 45 struct B { 46 A a; 47 }; 48 49 void f() { 50 // Verify that we don't mark the copy constructor in this expression as elidable. 51 // CHECK: call {{.*}} @_ZN6PR86831AC1ERKS0_ 52 A a = (B().a); 53 } 54 55 } 56