https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98939
--- Comment #4 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Does that mean that code like this (from type_traits) needs to be fixed? class __make_unsigned_selector_base { protected: template<typename...> struct _List { }; template<typename _Tp, typename... _Up> struct _List<_Tp, _Up...> : _List<_Up...> { static constexpr size_t __size = sizeof(_Tp); }; template<size_t _Sz, typename _Tp, bool = (_Sz <= _Tp::__size)> struct __select; template<size_t _Sz, typename _Uint, typename... _UInts> struct __select<_Sz, _List<_Uint, _UInts...>, true> { using __type = _Uint; }; template<size_t _Sz, typename _Uint, typename... _UInts> struct __select<_Sz, _List<_Uint, _UInts...>, false> : __select<_Sz, _List<_UInts...>> { }; }; when parsing the default template argument I can't know if it can be parsed right away or if I need to delay parsing (unless it's a simple literal, which in this case it isn't).