1 // RUN: %clang_cc1 %s -triple i686-pc-win32 -fms-extensions -fexceptions -fcxx-exceptions -fnew-ms-eh -emit-llvm -o - -std=c++11 | FileCheck %s 2 3 int f(int); 4 5 void test_catch() { 6 try { 7 f(1); 8 } catch (int) { 9 f(2); 10 } catch (double) { 11 f(3); 12 } 13 } 14 15 // CHECK-LABEL: define void @"\01?test_catch@@YAXXZ"( 16 // CHECK: invoke i32 @"\01?f@@YAHH@Z"(i32 1) 17 // CHECK: to label %[[NORMAL:.*]] unwind label %[[CATCH_INT:.*]] 18 19 // CHECK: [[CATCH_INT]] 20 // CHECK: %[[CATCHPAD_INT:.*]] = catchpad [%rtti.TypeDescriptor2* @"\01??_R0H@8", i32 0, i8* null] 21 // CHECK: to label %[[CATCH_INT_HANDLER:.*]] unwind label %[[CATCH_DOUBLE:.*]] 22 23 // CHECK: [[CATCH_INT_HANDLER]] 24 // CHECK: invoke i32 @"\01?f@@YAHH@Z"(i32 2) 25 // CHECK: to label %[[CATCH_INT_DONE:.*]] unwind label %[[CATCHENDPAD:.*]] 26 27 // CHECK: [[CATCH_INT_DONE]] 28 // CHECK: catchret %[[CATCHPAD_INT]] to label %[[LEAVE_INT_CATCH:.*]] 29 30 // CHECK: [[LEAVE_INT_CATCH]] 31 // CHECK: br label %[[LEAVE_FUNC:.*]] 32 33 // CHECK: [[LEAVE_FUNC]] 34 // CHECK: ret void 35 36 // CHECK: [[CATCH_DOUBLE]] 37 // CHECK: %[[CATCHPAD_DOUBLE:.*]] = catchpad [%rtti.TypeDescriptor2* @"\01??_R0N@8", i32 0, i8* null] 38 // CHECK: to label %[[CATCH_DOUBLE_HANDLER:.*]] unwind label %[[CATCHENDPAD]] 39 40 // CHECK: [[CATCH_DOUBLE_HANDLER]] 41 // CHECK: invoke i32 @"\01?f@@YAHH@Z"(i32 3) 42 // CHECK: to label %[[CATCH_DOUBLE_DONE:.*]] unwind label %[[CATCHENDPAD]] 43 44 // CHECK: [[CATCH_DOUBLE_DONE]] 45 // CHECK: catchret %[[CATCHPAD_DOUBLE]] to label %[[LEAVE_DOUBLE_CATCH:.*]] 46 47 // CHECK: [[LEAVE_DOUBLE_CATCH]] 48 // CHECK: br label %[[LEAVE_FUNC]] 49 50 // CHECK: [[CATCHENDPAD]] 51 // CHECK: catchendpad unwind to caller 52 53 // CHECK: [[NORMAL]] 54 // CHECK: br label %[[LEAVE_FUNC]] 55 56 struct Cleanup { 57 ~Cleanup() { f(-1); } 58 }; 59 60 void test_cleanup() { 61 Cleanup C; 62 f(1); 63 } 64 65 // CHECK-LABEL: define {{.*}} @"\01?test_cleanup@@YAXXZ"( 66 // CHECK: invoke i32 @"\01?f@@YAHH@Z"(i32 1) 67 // CHECK: to label %[[LEAVE_FUNC:.*]] unwind label %[[CLEANUP:.*]] 68 69 // CHECK: [[LEAVE_FUNC]] 70 // CHECK: call x86_thiscallcc void @"\01??_DCleanup@@QAE@XZ"( 71 // CHECK: ret void 72 73 // CHECK: [[CLEANUP]] 74 // CHECK: %[[CLEANUPPAD:.*]] = cleanuppad [] 75 // CHECK: call x86_thiscallcc void @"\01??_DCleanup@@QAE@XZ"( 76 // CHECK: cleanupret %[[CLEANUPPAD]] unwind to caller 77 78 79 // CHECK-LABEL: define {{.*}} void @"\01??1Cleanup@@QAE@XZ"( 80 // CHECK: invoke i32 @"\01?f@@YAHH@Z"(i32 -1) 81 // CHECK: to label %[[LEAVE_FUNC:.*]] unwind label %[[TERMINATE:.*]] 82 83 // CHECK: [[LEAVE_FUNC]] 84 // CHECK: ret void 85 86 // CHECK: [[TERMINATE]] 87 // CHECK: terminatepad [void ()* @"\01?terminate@@YAXXZ"] unwind to caller 88 89