On Wed, Nov 22, 2023 at 11:32:10AM +0000, Richard Biener wrote: > > hack in gcc 13 and triggered on hundreds of tests there within just 5 > > seconds of running make check-g++ -j32 (and in cases I looked at had nothing > > to do with the r14-5086 backports), so I believe this is just bad > > assumption on the try_catch_may_fallthru side, gimplify.cc certainly doesn't > > care, it just calls gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup); > > on it. So, IMHO non-STATEMENT_LIST in the second operand is equivalent to > > a STATEMENT_LIST containing a single statement. > > Did you check if there's ever a CATCH_EXPR or EH_FILTER_EXPR not wrapped > inside a STATEMENT_LIST? That is, does > > if (TREE_CODE (TREE_OPERAND (stmt, 1)) != STATEMENT_LIST) > { > gcc_checking_assert (code != CATCH_EXPR && code != EH_FILTER_EXPR); > return false; > } > > work?
Looking at a trivial example void bar (); void foo (void) { try { bar (); } catch (int) {} } it seems it is even more complicated, because what e.g. the gimplification sees is not TRY_CATCH_EXPR with CATCH_EXPR second operand, but TRY_BLOCK with HANDLER second operand (note, certainly not wrapped in a STATEMENT_LIST, one would need another catch (long) {} for it after it), C++ FE specific trees. And cp_gimplify_expr then on the fly turns the TRY_BLOCK into TRY_CATCH_EXPR (in genericize_try_block) and HANDLER into CATCH_EXPR (genericize_catch_block). When gimplifying EH_SPEC_BLOCK in genericize_eh_spec_block it even creates TRY_CATCH_EXPR with genericize_eh_spec_block -> build_gimple_eh_filter_tree if even creates TRY_CATCH_EXPR with EH_FILTER_EXPR as its second operand (without intervening STATEMENT_LIST). So, I believe the patch is correct but for C++ it might be hard to see it actually trigger because most often one will see the C++ FE specific trees of TRY_BLOCK (with HANDLER) and EH_SPEC_BLOCK instead. So, I wonder why cxx_block_may_fallthru doesn't handle TRY_BLOCK and EH_SPEC_BLOCK as well. Given the genericization, I think TRY_BLOCK should be handled similarly to TRY_CATCH_EXPR in tree.cc, if second operand is HANDLER or STATEMENT_LIST starting with HANDLER, check if any of the handler bodies can fall thru, dunno if TRY_BLOCK without HANDLERs is possible, and for EH_SPEC_BLOCK see if the failure can fall through. Jakub