1 ; RUN: opt %s -inline -S | FileCheck %s 2 3 declare void @external_func() 4 5 @exception_type1 = external global i8 6 @exception_type2 = external global i8 7 8 9 define internal void @inner() personality i8* null { 10 invoke void @external_func() 11 to label %cont unwind label %lpad 12 cont: 13 ret void 14 lpad: 15 %lp = landingpad i32 16 catch i8* @exception_type1 17 resume i32 %lp 18 } 19 20 ; Test that the "cleanup" clause is kept when inlining @inner() into 21 ; this call site (PR17872), otherwise C++ destructors will not be 22 ; called when they should be. 23 24 define void @outer() personality i8* null { 25 invoke void @inner() 26 to label %cont unwind label %lpad 27 cont: 28 ret void 29 lpad: 30 %lp = landingpad i32 31 cleanup 32 catch i8* @exception_type2 33 resume i32 %lp 34 } 35 ; CHECK: define void @outer 36 ; CHECK: landingpad 37 ; CHECK-NEXT: cleanup 38 ; CHECK-NEXT: catch i8* @exception_type1 39 ; CHECK-NEXT: catch i8* @exception_type2 40