47 lines
		
	
	
		
			1007 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1007 B
		
	
	
	
		
			C++
		
	
	
	
// Check that initialization of the only one memcpy-able struct member will not
 | 
						|
// be performed twice after successful non-trivial initializtion of the second
 | 
						|
// member.
 | 
						|
//
 | 
						|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -O0 -fno-elide-constructors -emit-llvm %s -o - | FileCheck %s
 | 
						|
 | 
						|
int globId = 0;
 | 
						|
 | 
						|
struct ImplicitCopy {
 | 
						|
  int id;
 | 
						|
 | 
						|
  ImplicitCopy() { id = 10; }
 | 
						|
  ~ImplicitCopy() { id = 20; }
 | 
						|
};
 | 
						|
 | 
						|
struct ExplicitCopy {
 | 
						|
  int id;
 | 
						|
 | 
						|
  ExplicitCopy() { id = 15; }
 | 
						|
  ExplicitCopy(const ExplicitCopy &x) { id = 25; }
 | 
						|
  ~ExplicitCopy() { id = 35; }
 | 
						|
};
 | 
						|
 | 
						|
struct Container {
 | 
						|
  ImplicitCopy o1; // memcpy-able member.
 | 
						|
  ExplicitCopy o2; // non-trivial initialization.
 | 
						|
 | 
						|
  Container() { globId = 1000; }
 | 
						|
  ~Container() { globId = 2000; }
 | 
						|
};
 | 
						|
 | 
						|
int main() {
 | 
						|
  try {
 | 
						|
    Container c1;
 | 
						|
    // CHECK-DAG: call void @llvm.memcpy
 | 
						|
    // CHECK-DAG: declare void @llvm.memcpy
 | 
						|
    // CHECK-NOT: @llvm.memcpy
 | 
						|
    Container c2(c1);
 | 
						|
 | 
						|
    return 2;
 | 
						|
  }
 | 
						|
  catch (...) {
 | 
						|
    return 1;
 | 
						|
  }
 | 
						|
  return 0;
 | 
						|
}
 |