https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68429
--- Comment #1 from ryan.burn at gmail dot com --- Additional case. (not sure if it's the same bug) namespace std { typedef int size_t; template <typename _Tp, _Tp __v> struct A { static constexpr _Tp value = __v; typedef _Tp value_type; }; typedef A<bool, true> true_type; template <bool, typename, typename> struct conditional { using type = int; }; struct B : true_type {}; template <typename> struct is_integral { static constexpr bool value = true; }; template <typename, typename> struct is_same { static constexpr bool value = true; }; } template <typename T, typename U> concept bool Same = std::is_same<T, U>::value; template <typename T> concept bool Integral = requires{{T()}->Same<typename T::value_type>}; template <class...> struct compose; template <class T> constexpr typename T::value_type _v = T::value; template <long N> using size_t = std::A<long, N>; template <bool B> using bool_ = std::A<bool, B>; template <class Fn, typename... Args> using apply = typename Fn::template apply<Args...>; namespace detail { template <template <typename...> class C, typename... Ts> struct defer_ { using type = C<Ts...>; }; } template <template <typename...> class C, typename... Ts> struct defer : detail::defer_<C, Ts...> {}; template <class Fn0> struct compose<Fn0> { template <typename... Ts> using apply = apply<Fn0, Ts...>; }; template <class Fn0, class... Fns> struct compose<Fn0, Fns...> { template <typename... Ts> using apply = apply<Fn0, apply<compose<Fns...>, Ts...>>; }; template <template <typename...> class C> struct quote { template <typename... Ts> using apply = typename defer<C, Ts...>::type; }; namespace detail { template <typename...> struct _if_; template <Integral If, typename Then, typename Else> struct _if_<If, Then, Else> : std::conditional<_v<If>, Then, Else> {}; } template <typename... Args> using if_ = typename detail::_if_<Args...>::type; template <bool B> using not_c = bool_<!B>; template <Integral B> using not_ = not_c<_v<B>>; template <typename... Ts> struct list { }; namespace detail { template <typename, typename> struct find_if_ { }; template <typename Head, typename... L, typename Fn> struct find_if_<list<Head, L...>, Fn> : if_<apply<Fn, Head>, list<>, find_if_<int, Fn>> {}; } template <class L, class Fn> using find_if = typename detail::find_if_<L, Fn>::type; template <class Fn> using not_fn = compose<quote<not_>, Fn>; template <class L, class Fn> using all_of = find_if<L, not_fn<Fn>>; static_assert(all_of<list<long>, quote<std::is_integral>>::value);