On Mon, 2011-11-21 at 14:58 -0800, Richard Henderson wrote: > On 11/21/2011 01:58 PM, Torvald Riegel wrote: > > On Mon, 2011-11-21 at 13:45 -0800, Richard Henderson wrote: > >> On 11/21/2011 01:39 PM, Torvald Riegel wrote: > >>> It still fails when combined > >>> with transaction expressions (noexcept-4.C and noexcept-1.C) because > >>> gimplify_must_not_throw_expr() calls voidify_wrapper_expr() on a > >>> MUST_NOT_THROW_EXPR which it doesn't know to be a wrapper. What's the > >>> cleanest way to solve that? Adding handling of MUST_NOT_THROW_EXPR > >>> inside voidify_... will include C++ stuff there, right? Or should there > >>> be a C++ version of voidify_...? Or something else? > >> > >> What's happening below gimplify_must_not_throw_expr? > >> > >> That *ought* to be recursing into voidify_wrapper_expr and > >> doing the right thing. > > > > gimplify_must_not_throw_expr does call voidify_wrapper_expr, with the > > assumption that the latter understands that MNTE is a wrapper, and will > > change the code contained in the wrapper (so, change the MNTE itself). > > I thought about changing voidify_wrapper_expr so that its first argument > > is a pointer to a tree, so that one can voidify the contained/inner > > stuff even when the caller has already skipped a wrapper (MNTE in our > > case). But this didn't seem to be clearer either. > > Try this, as discussed with Jason on IRC.
Works for me, no regressions. I'll look at Jason's patch later, and adapt the transaction noexcept stuff. Thanks! Torvald