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.

Reply via email to