On Wed, Nov 22, 2023 at 01:21:12PM +0100, Jakub Jelinek wrote: > So, pedantically perhaps just assuming TRY_CATCH_EXPR where second argument > is not STATEMENT_LIST to be the CATCH_EXPR/EH_FILTER_EXPR case could work > for C++, but there are other FEs and it would be fragile (and weird, given > that STATEMENT_LIST with single stmt in it vs. that stmt ought to be > generally interchangeable).
Looking at other FE, e.g. go/go-gcc.cc clearly has: stat_tree = build2_loc(location.gcc_location(), TRY_CATCH_EXPR, void_type_node, stat_tree, build2_loc(location.gcc_location(), CATCH_EXPR, void_type_node, NULL, except_tree)); so CATCH_EXPR is immediately the second operand of TRY_CATCH_EXPR. d/toir.cc has: /* Back-end expects all catches in a TRY_CATCH_EXPR to be enclosed in a statement list, however pop_stmt_list may optimize away the list if there is only a single catch to push. */ if (TREE_CODE (catches) != STATEMENT_LIST) { tree stmt_list = alloc_stmt_list (); append_to_statement_list_force (catches, &stmt_list); catches = stmt_list; } add_stmt (build2 (TRY_CATCH_EXPR, void_type_node, trybody, catches)); so I assume it run into the try_catch_may_fallthru issue (because gimplifier clearly doesn't require that). rust/rust-gcc.cc copies go-gcc.cc and also creates CATCH_EXPR directly in TRY_CATCH_EXPR's operand. Note, the only time one runs into the ICE is when the first operand (i.e. try body) doesn't fall thru, otherwise the function returns true early. Jakub