35 lines
		
	
	
		
			896 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			896 B
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm -DUNWIND -fcxx-exceptions -fexceptions -o - %s | FileCheck -check-prefixes CHECK,CHECK-UNWIND %s
 | 
						|
// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm -fcxx-exceptions -fexceptions -o - %s | FileCheck -check-prefixes CHECK,CHECK-NO-UNWIND %s
 | 
						|
 | 
						|
extern "C" void printf(const char *fmt, ...);
 | 
						|
 | 
						|
struct DropBomb {
 | 
						|
  bool defused = false;
 | 
						|
 | 
						|
  ~DropBomb() {
 | 
						|
    if (defused) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    printf("Boom!\n");
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
extern "C" void trap() {
 | 
						|
  throw "Trap";
 | 
						|
}
 | 
						|
 | 
						|
// CHECK: define dso_local void @test()
 | 
						|
extern "C" void test() {
 | 
						|
  DropBomb bomb;
 | 
						|
// CHECK-UNWIND: invoke void asm sideeffect unwind "call trap"
 | 
						|
// CHECK-NO-UNWIND: call void asm sideeffect "call trap"
 | 
						|
#ifdef UNWIND
 | 
						|
  asm volatile("call trap" ::
 | 
						|
                   : "unwind");
 | 
						|
#else
 | 
						|
  asm volatile("call trap" ::
 | 
						|
                   :);
 | 
						|
#endif
 | 
						|
  bomb.defused = true;
 | 
						|
}
 |