https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68810

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The reason for this is cp_convert_to_pointer doing:
228       if (INTEGRAL_CODE_P (form))
229         {
230           if (TYPE_PRECISION (intype) == POINTER_SIZE)
231             return build1 (CONVERT_EXPR, type, expr);
232           expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 0),
expr,
233                              complain);
234           /* Modes may be different but sizes should be the same.  There
235              is supposed to be some integral type that is the same width
236              as a pointer.  */
237           gcc_assert (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr)))
238                       == GET_MODE_SIZE (TYPE_MODE (type)));
239     
240           return convert_to_pointer_nofold (type, expr);
241         }

expr is INTEGER_CST 4, so for sizeof (void *) == sizeof (int) targets it
unconditionally creates unfolded CONVERT_EXPR, which will hold the current
input_location at that point (happens to be about right), while for sizeof
(void *) != sizeof (int) targets it goes different path and (what happened to
delayed folding here?) cp_convert actually folds it right away into long int 4L
INTEGER_CST and convert_to_pointer_nofold (regardless of the *_nofold in the
name) actually also folds it into INTEGER_CST 4 with pointer type.
Thus, unless we progress further with actual delayed folding, and/or unless we
introduce also USE_EXPR trees holding uses of constants and decls, we are not
going to resolve this.
So, for GCC6, I think best would be just to move the }:
--- constexpr-reinterpret1.C~   2015-11-14 19:35:49.000000000 +0100
+++ constexpr-reinterpret1.C    2016-01-12 19:52:00.114998687 +0100
@@ -17,8 +17,7 @@ public:
   constexpr static Inner & getInner()
   {
     /* I am surprised this is considered a constexpr */
-    return *((Inner *)4);
-  } // { dg-error "reinterpret_cast" "" }
+    return *((Inner *)4); } // { dg-error "reinterpret_cast" "" }
 };

 B B::instance;
so that it really doesn't matter where it is reported.  And work more on C++
delayed folding for GCC 7.

Reply via email to