On Wed, 22 Nov 2023, Jakub Jelinek wrote: > 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.
OK, I think this suggests we should be more forgiving here, meaning your patch is OK. Unless Jason has any additional comments today. Thanks, Richard.