forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -std=c++1y -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s
 | |
| 
 | |
| struct S {
 | |
|   S();
 | |
|   ~S();
 | |
| };
 | |
| 
 | |
| struct T {
 | |
|   T() noexcept;
 | |
|   ~T();
 | |
|   int n;
 | |
| };
 | |
| 
 | |
| // CHECK-LABEL: define void @_Z1fv(
 | |
| void f() {
 | |
|   // CHECK: call void @_ZN1SC1Ev(
 | |
|   // CHECK: invoke void @__cxa_throw
 | |
|   //
 | |
|   // Ensure we call the lambda destructor here, and do not call the destructor
 | |
|   // for the capture.
 | |
|   // CHECK: landingpad
 | |
|   // CHECK-NOT: _ZN1SD
 | |
|   // CHECK: call void @"_ZZ1fvEN3$_0D1Ev"(
 | |
|   // CHECK-NOT: _ZN1SD
 | |
|   // CHECK: resume
 | |
|   [s = S()] {}, throw 0;
 | |
| 
 | |
|   // CHECK: }
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: define void @_Z1gv(
 | |
| void g() {
 | |
|   // CHECK: call void @_ZN1SC1Ev(
 | |
|   // CHECK: invoke void @__cxa_throw
 | |
|   //
 | |
|   // Ensure we call the lambda destructor here, and do not call the destructor
 | |
|   // for the capture.
 | |
|   // CHECK: landingpad
 | |
|   // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"(
 | |
|   // CHECK: call void @_ZN1SD1Ev(
 | |
|   // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"(
 | |
|   // CHECK: resume
 | |
|   [s = S(), t = (throw 0, 1)] {};
 | |
| 
 | |
|   // CHECK: }
 | |
| }
 | |
| 
 | |
| void x() noexcept;
 | |
| void y() noexcept;
 | |
| 
 | |
| // CHECK-LABEL: define void @_Z1hbb(
 | |
| void h(bool b1, bool b2) {
 | |
|   // CHECK: {{.*}} = alloca i1,
 | |
|   // CHECK: %[[S_ISACTIVE:.*]] = alloca i1,
 | |
|   // CHECK: {{.*}} = alloca i1,
 | |
| 
 | |
|   // lambda init: s and t, branch on b1
 | |
|   // CHECK: call void @_ZN1SC1Ev(
 | |
|   // CHECK: store i1 true, i1* %[[S_ISACTIVE]], align 1
 | |
|   // CHECK: call void @_ZN1TC1Ev(
 | |
|   // CHECK: br i1
 | |
| 
 | |
|   // throw 1
 | |
|   // CHECK: invoke void @__cxa_throw
 | |
| 
 | |
|   // completion of lambda init, branch on b2
 | |
|   // CHECK: store i32 42,
 | |
|   // CHECK: store i1 false, i1* %[[S_ISACTIVE]], align 1
 | |
|   // CHECK: br i1
 | |
| 
 | |
|   // throw 2
 | |
|   // CHECK: invoke void @__cxa_throw
 | |
| 
 | |
|   // end of full-expression
 | |
|   // CHECK: call void @_Z1xv(
 | |
|   // CHECK: call void @"_ZZ1hbbEN3$_2D1Ev"(
 | |
|   // CHECK: call void @_ZN1TD1Ev(
 | |
|   // CHECK: call void @_Z1yv(
 | |
|   // CHECK: ret void
 | |
| 
 | |
|   // cleanups for throw 1
 | |
|   // CHECK: landingpad
 | |
|   // CHECK-NOT: @"_ZZ1hbbEN3$_2D1Ev"(
 | |
|   // CHECK: br
 | |
| 
 | |
|   // cleanups for throw 2
 | |
|   // CHECK: landingpad
 | |
|   // CHECK: call void @"_ZZ1hbbEN3$_2D1Ev"(
 | |
|   // CHECK: br
 | |
| 
 | |
|   // common cleanup code
 | |
|   // CHECK: call void @_ZN1TD1Ev(
 | |
|   // CHECK: load i1, i1* %[[S_ISACTIVE]],
 | |
|   // CHECK: br i1
 | |
| 
 | |
|   // CHECK: call void @_ZN1SD1Ev(
 | |
|   // CHECK: br
 | |
| 
 | |
|   // CHECK: resume
 | |
|   [s = S(), t = T().n, u = (b1 ? throw 1 : 42)] {}, (b2 ? throw 2 : 0), x();
 | |
|   y();
 | |
| 
 | |
|   // CHECK: }
 | |
| }
 |