https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68810
Jakub Jelinek changed:
What|Removed |Added
CC||jakub at gcc dot gnu.org
--- Comment #11 from Jakub Jelinek ---
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.0 +0100
+++ constexpr-reinterpret1.C2016-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.