forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			125 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
// RUN: %clang_cc1 -fobjc-gc -emit-llvm -triple x86_64-apple-darwin10.0.0 -fobjc-runtime=macosx-fragile-10.5 -o - %s | FileCheck %s -check-prefix=CHECK-OBJ
 | 
						|
// RUN: %clang_cc1 -x c++    -emit-llvm -triple x86_64-apple-darwin10.0.0                                    -o - %s | FileCheck %s -check-prefix=CHECK-CPP
 | 
						|
#ifdef __OBJC__
 | 
						|
struct A { 
 | 
						|
  A &operator=(const A&);
 | 
						|
  A &operator=(A&);
 | 
						|
};
 | 
						|
 | 
						|
struct B {
 | 
						|
  B &operator=(B&);
 | 
						|
};
 | 
						|
 | 
						|
struct C {
 | 
						|
  virtual C& operator=(const C&);
 | 
						|
};
 | 
						|
 | 
						|
struct POD {
 | 
						|
  id myobjc;
 | 
						|
  int array[3][4];
 | 
						|
};
 | 
						|
 | 
						|
struct CopyByValue {
 | 
						|
  CopyByValue(const CopyByValue&);
 | 
						|
  CopyByValue &operator=(CopyByValue);
 | 
						|
};
 | 
						|
 | 
						|
struct D : A, B, virtual C { 
 | 
						|
  int scalar;
 | 
						|
  int scalar_array[2][3];
 | 
						|
  B class_member;
 | 
						|
  C class_member_array[2][3];
 | 
						|
  POD pod_array[2][3];
 | 
						|
 | 
						|
  union {
 | 
						|
    int x;
 | 
						|
    float f[3];
 | 
						|
  };
 | 
						|
 | 
						|
  CopyByValue by_value;
 | 
						|
};
 | 
						|
 | 
						|
void test_D(D d1, D d2) {
 | 
						|
  d1 = d2;
 | 
						|
}
 | 
						|
 | 
						|
// CHECK-OBJ-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.D* @_ZN1DaSERS_
 | 
						|
// CHECK-OBJ: {{call.*_ZN1AaSERS_}}
 | 
						|
// CHECK-OBJ: {{call.*_ZN1BaSERS_}}
 | 
						|
// CHECK-OBJ: {{call.*_ZN1CaSERKS_}}
 | 
						|
// CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 24}}
 | 
						|
// CHECK-OBJ: {{call.*_ZN1BaSERS_}}
 | 
						|
// CHECK-OBJ: br
 | 
						|
// CHECK-OBJ: {{call.*_ZN1CaSERKS_}}
 | 
						|
// CHECK-OBJ: {{call.*@objc_memmove_collectable}}
 | 
						|
// CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 12}}
 | 
						|
// CHECK-OBJ: call void @_ZN11CopyByValueC1ERKS_
 | 
						|
// CHECK-OBJ: {{call.*_ZN11CopyByValueaSES_}}
 | 
						|
// CHECK-OBJ: ret
 | 
						|
#endif
 | 
						|
 | 
						|
namespace PR13329 {
 | 
						|
#ifndef __OBJC__
 | 
						|
  typedef void* id;
 | 
						|
#endif
 | 
						|
  struct POD {
 | 
						|
    id    i;
 | 
						|
    short s;
 | 
						|
  };
 | 
						|
  
 | 
						|
  struct NonPOD {
 | 
						|
    id    i;
 | 
						|
    short s;
 | 
						|
    
 | 
						|
    NonPOD();
 | 
						|
  };
 | 
						|
  
 | 
						|
  struct DerivedNonPOD: NonPOD {
 | 
						|
    char  c;
 | 
						|
  };
 | 
						|
  
 | 
						|
  struct DerivedPOD: POD {
 | 
						|
    char  c;
 | 
						|
  };
 | 
						|
  
 | 
						|
  void testPOD() {
 | 
						|
    POD a;
 | 
						|
    POD b;
 | 
						|
    // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16
 | 
						|
    // CHECK-CPP: @llvm.memcpy{{.*}}i64 16
 | 
						|
    b = a;
 | 
						|
  }
 | 
						|
  
 | 
						|
  void testNonPOD() {
 | 
						|
    NonPOD a;
 | 
						|
    NonPOD b;
 | 
						|
    // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10
 | 
						|
    // CHECK-CPP: @llvm.memcpy{{.*}}i64 10
 | 
						|
    b = a;
 | 
						|
  }
 | 
						|
  
 | 
						|
  void testDerivedNonPOD() {
 | 
						|
    DerivedNonPOD a;
 | 
						|
    NonPOD        b;
 | 
						|
    DerivedNonPOD c;
 | 
						|
    // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10
 | 
						|
    // CHECK-CPP: @llvm.memcpy{{.*}}i64 10
 | 
						|
    (NonPOD&) a = b;
 | 
						|
    // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 11
 | 
						|
    // CHECK-CPP: @llvm.memcpy{{.*}}i64 11
 | 
						|
    a = c;
 | 
						|
  };
 | 
						|
  
 | 
						|
  void testDerivedPOD() {
 | 
						|
    DerivedPOD a;
 | 
						|
    POD        b;
 | 
						|
    DerivedPOD c;
 | 
						|
    // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16
 | 
						|
    // CHECK-CPP: @llvm.memcpy{{.*}}i64 16
 | 
						|
    (POD&) a = b;
 | 
						|
    // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 17
 | 
						|
    // CHECK-CPP: @llvm.memcpy{{.*}}i64 17
 | 
						|
    a = c;
 | 
						|
  };
 | 
						|
}
 |