https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49171
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |msebor at gcc dot gnu.org
--- Comment #13 from Martin Sebor <msebor at gcc dot gnu.org> ---
The latest C++ working draft (N4582 from March 2016) makes it clear that
reinterpret_cast cannot be evaluated in core constant expressions. AFAICS,
this restriction hasn't changed since C++ 11. The current top of trunk (GCC
7.0) and prior released versions still accept reinterpret_cast in constexpr
contexts, including the expression in comment #0.
In my work on bug 60760 I looked into how feasible it would be to reject
reinterpret_cast in constexpr contexts. Rejecting examples like the one in
comment #0 is doable because a non-zero integer constant can only be converted
to a pointer by a reinterpret_cast, but rejecting others, such as
int i
constexpr void *p = reinterpret_cast<void*>(&i);
looks harder because the representation of this cast (a NOP_EXPR) is
indistinguishable from that of the following valid core constant expression:
constexpr void *p = &i;
The fact that one was the result of a reinterpret_cast and another of implicit
conversion is long lost by the time it's interpreted in a constexpr context.
To distinguish the two expressions, their internal representation would need to
be different.