Home | History | Annotate | Download | only in Inline
      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() {
     10   invoke void @external_func()
     11       to label %cont unwind label %lpad
     12 cont:
     13   ret void
     14 lpad:
     15   %lp = landingpad i32 personality i8* null
     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() {
     25   invoke void @inner()
     26       to label %cont unwind label %lpad
     27 cont:
     28   ret void
     29 lpad:
     30   %lp = landingpad i32 personality i8* null
     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