77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -triple armv7-none-eabi -emit-llvm -o - %s | FileCheck %s
 | |
| 
 | |
| struct A { int x; A(int); ~A(); };
 | |
| A f() { return A(0); }
 | |
| // CHECK-LABEL: define void @_Z1fv
 | |
| // CHECK: call {{.*}} @_ZN1AC1Ei
 | |
| // CHECK-NEXT: ret void
 | |
| 
 | |
| // Verify that we do not elide copies when constructing a base class.
 | |
| namespace no_elide_base {
 | |
|   struct Base { 
 | |
|     Base(const Base&);
 | |
|     ~Base();
 | |
|   };
 | |
| 
 | |
|   struct Other {
 | |
|     operator Base() const;
 | |
|   };
 | |
| 
 | |
|   struct Derived : public virtual Base { 
 | |
|     Derived(const Other &O);
 | |
|   };
 | |
| 
 | |
|   // CHECK: define {{.*}} @_ZN13no_elide_base7DerivedC1ERKNS_5OtherE(%"struct.no_elide_base::Derived"* returned %this, %"struct.no_elide_base::Other"* nonnull %O) unnamed_addr
 | |
|   Derived::Derived(const Other &O) 
 | |
|     // CHECK: call {{.*}} @_ZNK13no_elide_base5OthercvNS_4BaseEEv
 | |
|     // CHECK: call {{.*}} @_ZN13no_elide_base4BaseC2ERKS0_
 | |
|     // CHECK: call {{.*}} @_ZN13no_elide_base4BaseD1Ev
 | |
|     : Base(O)
 | |
|   {
 | |
|     // CHECK: ret
 | |
|   }
 | |
| }
 | |
| 
 | |
| // PR8683.
 | |
| 
 | |
| namespace PR8683 {
 | |
| 
 | |
| struct A {
 | |
|   A();
 | |
|   A(const A&);
 | |
|   A& operator=(const A&);
 | |
| };
 | |
| 
 | |
| struct B {
 | |
|   A a;
 | |
| };
 | |
| 
 | |
| void f() {
 | |
|   // Verify that we don't mark the copy constructor in this expression as elidable.
 | |
|   // CHECK: call {{.*}} @_ZN6PR86831AC1ERKS0_
 | |
|   A a = (B().a);
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 | |
| namespace PR12139 {
 | |
|   struct A {
 | |
|     A() : value(1) { }
 | |
|     A(A const &, int value = 2) : value(value) { }
 | |
|     int value;
 | |
| 
 | |
|     static A makeA() { A a; a.value = 2; return a; }
 | |
|   };
 | |
| 
 | |
|   // CHECK-LABEL: define i32 @_ZN7PR121394testEv
 | |
|   int test() {
 | |
|     // CHECK: call void @_ZN7PR121391A5makeAEv
 | |
|     // CHECK-NEXT: call %"struct.PR12139::A"* @_ZN7PR121391AC1ERKS0_i
 | |
|     A a(A::makeA(), 3);
 | |
|     // CHECK-NEXT: getelementptr inbounds
 | |
|     // CHECK-NEXT: load
 | |
|     // CHECK-NEXT: ret i32
 | |
|     return a.value;
 | |
|   }
 | |
| }
 |