https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109754
--- Comment #3 from Marek Polacek <mpolacek at gcc dot gnu.org> --- cvise reduced it to void declval(); template <typename, typename> concept __same_as = requires { declval; }; template <class _Tp> _Tp __declval; template <class> int __v; using __msuccess = int; template <int> struct __i; template <class _Arg> concept __ok = __same_as<_Arg, __msuccess>; template <class... _Args> concept _Ok = (__ok<_Args> && ...); template <template <class> class> using __meval = __i<_Ok<>>; template <class _Fn> using __minvoke = __meval<_Fn::template __f>; template <class> struct __mexpand; template <class, class _List> using __mapply = __minvoke<__mexpand<_List>>; struct __msize; template <class...> using __call_result_t = decltype(0); template <class _Fun, class> using __tuple_types_fn = decltype(__declval<_Fun>, [] {}); template <class _Fun> struct __mexpand { template <class _MetaFn> using __f = __tuple_types_fn<_Fun, _MetaFn>; }; template <class _Tuple> long tuple_size_v = __v<__mapply<__msize, _Tuple>>; template <class...> using tuple = __call_result_t<>; using T = tuple<>; static_assert(tuple_size_v< T >, ""); but that is probably invalid.