https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70543
--- Comment #1 from Oleg Endo <olegendo at gcc dot gnu.org> ---
A slightly reduced version:
#include <type_traits>
template <typename Tuple> struct X
{
template <unsigned int I = 0> static constexpr
typename std::enable_if< I == 5, unsigned int>::type
calc (void)
{
return 0;
}
template <unsigned int I = 0> static constexpr
typename std::enable_if< I != 5, unsigned int>::type
calc (void)
{
return 1 + calc<I + 1> ();
}
static constexpr unsigned int value = calc (); // <<<<<<<
char foo[value];
};
If the marked line is changed to
static constexpr unsigned int value = calc<0> ();
it compiles fine.