// { dg-do compile { target c++20 } } // { dg-additional-options "-fconcepts" } typedef int size_t; template struct A { static constexpr _Tp value = 1; }; template _Tp declval(); template struct __is_convertible_helper { template static A __test(int); typedef decltype(__test<_From, _To>(0)) type; }; template struct is_convertible : __is_convertible_helper::type {}; template struct remove_reference; template struct remove_reference<_Tp &> { typedef _Tp type; }; struct base; struct general; template struct B; template using make_integer_sequence = B; template using index_sequence = B; template using make_index_sequence = make_integer_sequence; template struct and_c_impl { static constexpr bool value = true; }; template constexpr bool and_c() { return and_c_impl<>::value; } template concept cpt_Convertible = is_convertible::value; template using uncvref_t = typename remove_reference::type; struct Plus; using index_t = int; template bool cpt_Index; template requires (and_c()...>()) class Dimensionality; namespace detail_concept { template bool match_dimensionality; template constexpr bool match_dimensionality> = true; } template concept cpt_Dimensionality = detail_concept::match_dimensionality; template concept cpt_Shaped = requires(X x){{x};}; template concept cpt_Dimensioned = cpt_Shaped; template requires (and_c()...>()) class Dimensionality { public: static constexpr size_t num_dimensions = sizeof...(Extents); }; template using DimensionalityC = Dimensionality<>; template struct dimensionality_type_impl; template struct dimensionality_type_impl { using type = uncvref_t().dimensionality())>; }; template using dimensionality_type = typename dimensionality_type_impl::type; template requires requires(Functor functor, Expressibles... expressibles) { map_expressions_impl(functor, expressibles...); } decltype(auto) map_impl(Functor, Expressibles...); void cpt_ContinualScalar(); template concept cpt_Scalar = cpt_ContinualScalar; template concept cpt_FlatEvaluator = requires(X x){{x}->cpt_Scalar;}; template bool k_evaluator_impl; template constexpr bool k_evaluator_impl, Evaluator> = true; template concept cpt_KEvaluator = k_evaluator_impl, X>; template concept cpt_KCompatibleEvaluator = cpt_KEvaluator; template concept cpt_Structure = cpt_Convertible; template Evaluator> class NumericArrayExpression; namespace detail_concept { template bool match_numeric_array_expression; template Evaluator> constexpr bool match_numeric_array_expression< NumericArrayExpression> = true; } template concept cpt_NumericArrayExpression = detail_concept::match_numeric_array_expression; namespace expression_traits { namespace detail_expression_traits { template struct first_numeric_array_expression_impl; template struct first_numeric_array_expression_impl { using type = ExpressionFirst; }; } template using first_numeric_array_expression = typename detail_expression_traits::first_numeric_array_expression_impl< Expressions...>::type; template using first_expression_dimensionality = dimensionality_type>; } template Evaluator> class NumericArrayExpression { public: NumericArrayExpression(Dimensionality, Evaluator) {} Dimensionality &dimensionality(); }; template Evaluator> auto make_numeric_array_expression(Dimensionality dimensionality, Evaluator evaluator) { return NumericArrayExpression( dimensionality, evaluator); } template auto make_map_evaluator_impl(Functor) requires (and_(cpt_FlatEvaluator...)); template requires requires(Expressions... expressions, expression_traits::first_expression_dimensionality dimensionality) { make_map_evaluator_impl( expressions...); } decltype(auto) map_expressions_impl(Functor, Expressions...); template concept cpt_Mappable = requires(Functor functor, Expressibles... expressibles) { map_impl(functor, expressibles...); }; void ____C_A_T_C_H____T_E_S_T____8() { auto e1 = make_numeric_array_expression(DimensionalityC<>(), [] {}); using E1 = decltype(e1); cpt_Mappable; }