// PR c++/67148 // { dg-do compile { target c++20 } } // { dg-additional-options "-fconcepts" } namespace std { template T declval(); typedef unsigned int size_t; typedef int ptrdiff_t; typedef decltype(nullptr) nullptr_t; template struct integer_sequence { typedef _Tp value_type; static constexpr size_t size() { return sizeof...(_Idx); } }; template struct integral_constant { using type = integral_constant; using value_type = T; constexpr operator T() const { return Value; } constexpr T operator()() const { return Value; } static constexpr T value {Value}; }; template constexpr T integral_constant::value; using true_type = integral_constant; using false_type = integral_constant; template struct is_same : false_type {}; template struct is_same : true_type {}; } namespace meta { inline namespace v1 { template using _t = typename T::type; template using and_c = std::is_same, std::integer_sequence>; } } namespace stl2 { inline namespace v1 { using std::declval; namespace detail { template struct all_same : std::true_type {}; template struct all_same : meta::and_c<__is_same_as(T, Rest)...> {}; } template concept Same = detail::all_same::value; template using ResultType = decltype(declval()(declval()...)); template struct value_type {}; template struct value_type { using type = T; }; template using ValueType = typename value_type::type; template concept Function = requires (F& f, Args&&...args) { f((Args&&)args...); requires Same >; }; template struct __function : std::false_type {}; template requires Function struct __function : std::true_type {}; template concept IndirectCallable = Function, ValueType>; template concept IndirectCallable2 = __function, ValueType>::value; namespace ext { namespace models { template constexpr bool indirect_callable() { return false; } template requires IndirectCallable constexpr bool indirect_callable() { return true; } template constexpr bool indirect_callable2() { return false; } template requires IndirectCallable constexpr bool indirect_callable2() { return true; } }} }} namespace models = stl2::ext::models; template struct plus { T operator()(T, T) const; }; static_assert((models::indirect_callable<::plus, int*, int*>())); static_assert((models::indirect_callable2<::plus, int*, int*>())); static_assert((models::indirect_callable<::plus, int**, int*>())); // { dg-error "static assertion failed" } static_assert((models::indirect_callable2<::plus, int**, int*>())); // { dg-error "static assertion failed" }