On 02/15/2012 06:03 PM, Joseph S. Myers wrote:
> On Wed, 15 Feb 2012, Christian Bruel wrote:
> 
>> Removal of this NOP_EXPR if !CAN_HAVE_LOCATION_P fixes the problem.
>> looks safe from my testing, because the loc is inserted using
>> 'protected_set_expr_location', whereas no loc for a constant case
>> doesn't seem to introduce new problems with the debugging information.
>> But in case I also added a few paranoid gcc_assert.
> 
> Is it safe to set TREE_NO_WARNING without that check?  I'd have thought 
> the check was to avoid setting TREE_NO_WARNING on a shared node when 
> warnings are to be disabled in only one context where that node is used.
> 

OK, I see, we can still keep the check, like with :

Index: c-common.c
===================================================================
--- c-common.c  (revision 184301)
+++ c-common.c  (working copy)
@@ -1435,12 +1435,9 @@
      have been done by this point, so remove them again.  */
   nowarning |= TREE_NO_WARNING (ret);
   STRIP_TYPE_NOPS (ret);
-  if (nowarning && !TREE_NO_WARNING (ret))
-    {
-      if (!CAN_HAVE_LOCATION_P (ret))
-       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
-      TREE_NO_WARNING (ret) = 1;
-    }
+  if (nowarning && CAN_HAVE_LOCATION_P (ret))
+    TREE_NO_WARNING (ret) = 1;
+
   if (ret != expr)
     protected_set_expr_location (ret, loc);
   return ret;

We propagate the flag to the new node for non-constant folded
expressions, or for a converted constant (so NOT_EXPR is not stripped),

Does it make sense to set TREE_NO_WARNING for a not-converted folded
constant ? it seems that in the proposal, a warning before the fold is
OK, and a warning after the fold on the new expression is still to be
honored. The NO_WARNING flag on an non-converted constant that is folded
looks unnecessary. I tried to forge different scenarios, were the result
of the folded constant would force a duplicate warning, but no success
to find a regression case.

Thanks

Christian

Reply via email to