Hi,

On 28/04/2018 18:41, Jason Merrill wrote:
On Fri, Apr 27, 2018 at 7:26 PM, Paolo Carlini <paolo.carl...@oracle.com> wrote:
Hi again,

I'm now pretty sure that we have a latent issue in ocp_convert. The bug
fixed by Jakub shows that we used to not have issues with integer_zero_node.
That's easy to explain: at the beginning of ocp_convert there is code which
handles first some special / simple cases when
same_type_ignoring_top_level_qualifiers_p is true. That code isn't of course
used for integer_zero_node as source expression, which therefore is handled
by:

   if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e))
     {
       if (complain & tf_warning)
     maybe_warn_zero_as_null_pointer_constant (e, loc);
       return nullptr_node;
     }
Maybe we should move this code up, then.
You are totally right. Yesterday I realized that and tested on x86_64-linux the below, both with and without Jakub's fix.

Thanks!
Paolo.

////////////////////
Index: cvt.c
===================================================================
--- cvt.c       (revision 259742)
+++ cvt.c       (working copy)
@@ -711,6 +711,14 @@ ocp_convert (tree type, tree expr, int convtype, i
   if (error_operand_p (e))
     return error_mark_node;
 
+  if (NULLPTR_TYPE_P (type) && null_ptr_cst_p (e))
+    {
+      if (complain & tf_warning)
+       maybe_warn_zero_as_null_pointer_constant (e, loc);
+      if (!TREE_SIDE_EFFECTS (e))
+       return nullptr_node;
+    }
+
   if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
     /* We need a new temporary; don't take this shortcut.  */;
   else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
@@ -832,12 +840,6 @@ ocp_convert (tree type, tree expr, int convtype, i
       /* Ignore any integer overflow caused by the conversion.  */
       return ignore_overflows (converted, e);
     }
-  if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e))
-    {
-      if (complain & tf_warning)
-       maybe_warn_zero_as_null_pointer_constant (e, loc);
-      return nullptr_node;
-    }
   if (POINTER_TYPE_P (type) || TYPE_PTRMEM_P (type))
     return cp_convert_to_pointer (type, e, dofold, complain);
   if (code == VECTOR_TYPE)

Reply via email to