https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86960
--- Comment #20 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Marek Polacek from comment #19) > The ICE was fixed by r15-3195. I'm not sure it's valid code so this may be > fixed now. The odd thing is if the outer class was not a variadic arg template, all compilers I tried accept it. That is: ``` template<class T> struct Outer { template<T x> struct Inner; }; template<> template<bool x> struct Outer<bool>::Inner { static constexpr bool value = x; }; static_assert(Outer<bool>::Inner<true>::value); ``` But once you change T to be variandic, compilers reject it. I don't see why we are just specializing the inner with outer being T...=={bool}.