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);

Reply via email to