xref: /aosp_15_r20/external/clang/test/CodeGenCXX/exceptions-cxx-new.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple i686-pc-win32 -fms-extensions -fexceptions -fcxx-exceptions -emit-llvm -o - -std=c++11 | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li int f(int);
4*67e74705SXin Li 
test_catch()5*67e74705SXin Li void test_catch() {
6*67e74705SXin Li   try {
7*67e74705SXin Li     f(1);
8*67e74705SXin Li   } catch (int) {
9*67e74705SXin Li     f(2);
10*67e74705SXin Li   } catch (double) {
11*67e74705SXin Li     f(3);
12*67e74705SXin Li   }
13*67e74705SXin Li }
14*67e74705SXin Li 
15*67e74705SXin Li // CHECK-LABEL: define void @"\01?test_catch@@YAXXZ"(
16*67e74705SXin Li // CHECK:   invoke i32 @"\01?f@@YAHH@Z"(i32 1)
17*67e74705SXin Li // CHECK:         to label %[[NORMAL:.*]] unwind label %[[CATCHSWITCH:.*]]
18*67e74705SXin Li 
19*67e74705SXin Li // CHECK: [[CATCHSWITCH]]
20*67e74705SXin Li // CHECK:   %[[CATCHSWITCHPAD:.*]] = catchswitch within none [label %[[CATCH_INT:.*]], label %[[CATCH_DOUBLE:.*]]] unwind to caller
21*67e74705SXin Li 
22*67e74705SXin Li // CHECK: [[CATCH_INT]]
23*67e74705SXin Li // CHECK:   %[[CATCHPAD_INT:.*]] = catchpad within %[[CATCHSWITCHPAD]] [%rtti.TypeDescriptor2* @"\01??_R0H@8", i32 0, i8* null]
24*67e74705SXin Li // CHECK:   call i32 @"\01?f@@YAHH@Z"(i32 2)
25*67e74705SXin Li // CHECK:   catchret from %[[CATCHPAD_INT]] to label %[[LEAVE_INT_CATCH:.*]]
26*67e74705SXin Li 
27*67e74705SXin Li // CHECK: [[LEAVE_INT_CATCH]]
28*67e74705SXin Li // CHECK:   br label %[[LEAVE_FUNC:.*]]
29*67e74705SXin Li 
30*67e74705SXin Li // CHECK: [[LEAVE_FUNC]]
31*67e74705SXin Li // CHECK:   ret void
32*67e74705SXin Li 
33*67e74705SXin Li // CHECK: [[CATCH_DOUBLE]]
34*67e74705SXin Li // CHECK:   %[[CATCHPAD_DOUBLE:.*]] = catchpad within %[[CATCHSWITCHPAD]] [%rtti.TypeDescriptor2* @"\01??_R0N@8", i32 0, i8* null]
35*67e74705SXin Li // CHECK:   call i32 @"\01?f@@YAHH@Z"(i32 3)
36*67e74705SXin Li // CHECK:   catchret from %[[CATCHPAD_DOUBLE]] to label %[[LEAVE_DOUBLE_CATCH:.*]]
37*67e74705SXin Li 
38*67e74705SXin Li // CHECK: [[LEAVE_DOUBLE_CATCH]]
39*67e74705SXin Li // CHECK:   br label %[[LEAVE_FUNC]]
40*67e74705SXin Li 
41*67e74705SXin Li // CHECK: [[NORMAL]]
42*67e74705SXin Li // CHECK:   br label %[[LEAVE_FUNC]]
43*67e74705SXin Li 
44*67e74705SXin Li struct Cleanup {
~CleanupCleanup45*67e74705SXin Li   ~Cleanup() { f(-1); }
46*67e74705SXin Li };
47*67e74705SXin Li 
test_cleanup()48*67e74705SXin Li void test_cleanup() {
49*67e74705SXin Li   Cleanup C;
50*67e74705SXin Li   f(1);
51*67e74705SXin Li }
52*67e74705SXin Li 
53*67e74705SXin Li // CHECK-LABEL: define {{.*}} @"\01?test_cleanup@@YAXXZ"(
54*67e74705SXin Li // CHECK:   invoke i32 @"\01?f@@YAHH@Z"(i32 1)
55*67e74705SXin Li // CHECK:           to label %[[LEAVE_FUNC:.*]] unwind label %[[CLEANUP:.*]]
56*67e74705SXin Li 
57*67e74705SXin Li // CHECK: [[LEAVE_FUNC]]
58*67e74705SXin Li // CHECK:   call x86_thiscallcc void @"\01??_DCleanup@@QAE@XZ"(
59*67e74705SXin Li // CHECK:   ret void
60*67e74705SXin Li 
61*67e74705SXin Li // CHECK: [[CLEANUP]]
62*67e74705SXin Li // CHECK:   %[[CLEANUPPAD:.*]] = cleanuppad within none []
63*67e74705SXin Li // CHECK:   call x86_thiscallcc void @"\01??_DCleanup@@QAE@XZ"(
64*67e74705SXin Li // CHECK:   cleanupret from %[[CLEANUPPAD]] unwind to caller
65*67e74705SXin Li 
66*67e74705SXin Li 
67*67e74705SXin Li // CHECK-LABEL: define {{.*}} void @"\01??1Cleanup@@QAE@XZ"(
68*67e74705SXin Li // CHECK:   invoke i32 @"\01?f@@YAHH@Z"(i32 -1)
69*67e74705SXin Li // CHECK:           to label %[[LEAVE_FUNC:.*]] unwind label %[[TERMINATE:.*]]
70*67e74705SXin Li 
71*67e74705SXin Li // CHECK: [[LEAVE_FUNC]]
72*67e74705SXin Li // CHECK:   ret void
73*67e74705SXin Li 
74*67e74705SXin Li // CHECK: [[TERMINATE]]
75*67e74705SXin Li // CHECK:   %[[CLEANUPPAD:.*]] = cleanuppad within none []
76*67e74705SXin Li // CHECK-NEXT:   call void @"\01?terminate@@YAXXZ"() {{.*}} [ "funclet"(token %[[CLEANUPPAD]]) ]
77*67e74705SXin Li 
78