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.


r~
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index cfe6696..373687c 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1081,6 +1081,15 @@ voidify_wrapper_expr (tree wrapper, tree temp)
              break;
 
            default:
+             /* Assume that any tree upon which voidify_wrapper_expr is
+                directly called is a wrapper, and that its body is op0.  */
+             if (p == &wrapper)
+               {
+                 TREE_SIDE_EFFECTS (*p) = 1;
+                 TREE_TYPE (*p) = void_type_node;
+                 p = &TREE_OPERAND (*p, 0);
+                 break;
+               }
              goto out;
            }
        }

Reply via email to