// { dg-do compile { target c++2a } } // { dg-additional-options "-fconcepts-ts" } 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 bool cpt_Convertible() { return 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 bool cpt_Dimensionality() { return detail_concept::match_dimensionality; } template concept bool cpt_Shaped() { return requires(X x){{x};}; } template concept bool cpt_Dimensioned() { return 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 bool cpt_Scalar() { return cpt_ContinualScalar; } template concept bool cpt_FlatEvaluator() { return requires(X x){{x}->cpt_Scalar;}; } template bool k_evaluator_impl; template constexpr bool k_evaluator_impl, Evaluator> = true; template concept bool cpt_KEvaluator() { return k_evaluator_impl, X>; } template concept bool cpt_KCompatibleEvaluator() { return cpt_KEvaluator(); } template concept bool cpt_Structure() { return 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 bool cpt_NumericArrayExpression() { return 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 bool cpt_Mappable() { return 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(); }