// RUN: cir-opt %s --verify-roundtrip | FileCheck %s !u8i = !cir.int !s32i = !cir.int !void = !cir.void module { cir.global "private" constant external @_ZTIi : !cir.ptr cir.global "private" constant external @_ZTIPKc : !cir.ptr cir.func dso_local @empty_try_block_with_catch_all() { cir.scope { cir.try { cir.yield } catch all (%eh_token : !cir.eh_token) { %catch_token, %0 = cir.begin_catch %eh_token : !cir.eh_token -> (!cir.catch_token, !cir.ptr) cir.cleanup.scope { cir.yield } cleanup eh { cir.end_catch %catch_token : !cir.catch_token cir.yield } cir.yield } } cir.return } // CHECK: cir.func dso_local @empty_try_block_with_catch_all() { // CHECK: cir.scope { // CHECK: cir.try { // CHECK: cir.yield // CHECK: } catch all (%[[EH_TOKEN:.*]]: !cir.eh_token) { // CHECK: %[[CATCH_TOKEN:.*]], %[[EXN_PTR:.*]] = cir.begin_catch %[[EH_TOKEN]] : !cir.eh_token -> (!cir.catch_token, !cir.ptr) // CHECK: cir.cleanup.scope { // CHECK: cir.yield // CHECK: } cleanup eh { // CHECK: cir.end_catch %[[CATCH_TOKEN]] : !cir.catch_token // CHECK: cir.yield // CHECK: } // CHECK: cir.yield // CHECK: } // CHECK: } // CHECK: cir.return // CHECK: } cir.func dso_local @empty_try_block_with_catch_unwind() { cir.scope { cir.try { cir.yield } unwind (%eh_token : !cir.eh_token) { cir.yield } } cir.return } // CHECK: cir.func dso_local @empty_try_block_with_catch_unwind() { // CHECK: cir.scope { // CHECK: cir.try { // CHECK: cir.yield // CHECK: } unwind (%{{.*}}: !cir.eh_token) { // CHECK: cir.yield // CHECK: } // CHECK: } // CHECK: cir.return // CHECK: } cir.func dso_local @empty_try_block_with_catch_ist() { cir.scope { cir.try { cir.yield } catch [type #cir.global_view<@_ZTIi> : !cir.ptr] (%eh_token : !cir.eh_token) { %catch_token, %0 = cir.begin_catch %eh_token : !cir.eh_token -> (!cir.catch_token, !cir.ptr) cir.cleanup.scope { cir.yield } cleanup eh { cir.end_catch %catch_token : !cir.catch_token cir.yield } cir.yield } catch [type #cir.global_view<@_ZTIPKc> : !cir.ptr] (%eh_token_1 : !cir.eh_token) { %catch_token_1, %1 = cir.begin_catch %eh_token_1 : !cir.eh_token -> (!cir.catch_token, !cir.ptr>) cir.cleanup.scope { cir.yield } cleanup eh { cir.end_catch %catch_token_1 : !cir.catch_token cir.yield } cir.yield } unwind (%eh_token_2 : !cir.eh_token) { cir.yield } } cir.return } // CHECK: cir.func dso_local @empty_try_block_with_catch_ist() { // CHECK: cir.scope { // CHECK: cir.try { // CHECK: cir.yield // CHECK: } catch [type #cir.global_view<@_ZTIi> : !cir.ptr] (%[[EH1:.*]]: !cir.eh_token) { // CHECK: %[[CT1:.*]], %{{.*}} = cir.begin_catch %[[EH1]] : !cir.eh_token -> (!cir.catch_token, !cir.ptr) // CHECK: cir.cleanup.scope { // CHECK: cir.yield // CHECK: } cleanup eh { // CHECK: cir.end_catch %[[CT1]] : !cir.catch_token // CHECK: cir.yield // CHECK: } // CHECK: cir.yield // CHECK: } catch [type #cir.global_view<@_ZTIPKc> : !cir.ptr] (%[[EH2:.*]]: !cir.eh_token) { // CHECK: %[[CT2:.*]], %{{.*}} = cir.begin_catch %[[EH2]] : !cir.eh_token -> (!cir.catch_token, !cir.ptr>) // CHECK: cir.cleanup.scope { // CHECK: cir.yield // CHECK: } cleanup eh { // CHECK: cir.end_catch %[[CT2]] : !cir.catch_token // CHECK: cir.yield // CHECK: } // CHECK: cir.yield // CHECK: } unwind (%{{.*}}: !cir.eh_token) { // CHECK: cir.yield // CHECK: } // CHECK: } // CHECK: cir.return // CHECK: } cir.func @empty_try_block_with_catch_unwind_contains_resume() { cir.scope { cir.try { cir.yield } unwind (%eh_token : !cir.eh_token) { cir.resume %eh_token : !cir.eh_token } } cir.return } // CHECK: cir.func @empty_try_block_with_catch_unwind_contains_resume() { // CHECK: cir.scope { // CHECK: cir.try { // CHECK: cir.yield // CHECK: } unwind (%[[ET:.*]]: !cir.eh_token) { // CHECK: cir.resume %[[ET]] : !cir.eh_token // CHECK: } // CHECK: } // CHECK: cir.return // CHECK: } }