Home | History | Annotate | Download | only in Inline
      1 ; Test that any rethrown exceptions in an inlined function are automatically
      2 ; turned into branches to the invoke destination.
      3 
      4 ; RUN: opt < %s -inline -S | not grep unwind$
      5 
      6 declare void @might_throw()
      7 
      8 define internal i32 @callee() {
      9         invoke void @might_throw( )
     10                         to label %cont unwind label %exc
     11 
     12 cont:           ; preds = %0
     13         ret i32 0
     14 
     15 exc:            ; preds = %0a
     16        ; This just rethrows the exception!
     17         %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0
     18                  cleanup
     19         resume { i8*, i32 } %exn
     20 }
     21 
     22 ; caller returns true if might_throw throws an exception... which gets
     23 ; propagated by callee.
     24 define i32 @caller() {
     25         %X = invoke i32 @callee( )
     26                         to label %cont unwind label %Handler            ; <i32> [#uses=1]
     27 
     28 cont:           ; preds = %0
     29         ret i32 %X
     30 
     31 Handler:                ; preds = %0
     32 ; This consumes an exception thrown by might_throw
     33         %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0
     34                  cleanup
     35         ret i32 1
     36 }
     37 
     38 declare i32 @__gxx_personality_v0(...)
     39