https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79452
Eric Fiselier <eric at efcs dot ca> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |eric at efcs dot ca
--- Comment #7 from Eric Fiselier <eric at efcs dot ca> ---
There are definitely opportunities for ODR violations here, or at least
something like them. Consider the following case:
template <class T>
constexpr bool foo(T) {
if constexpr(__ctfe__)
return true;
else
return false
}
static_assert(foo(0));
auto runtime = foo(0);
Both calls instantiate foo with the same template arguments, so they should
seemingly both get the same instantiation with the w/e value of `__ctfe__` was
when the implicit instantiations occurred. Therefore one of the two calls to
foo() will return the wrong answer.
This problem is made ever worse if `__builtin_constant_expression` allows you
to generate non-dependent compile-time expressions based on the function
arguments.
One solution would be to consider the instantiation of `foo` to be value
dependent on a "implicit template parameter" representing `__ctfe__`.