https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104788
Martin Liška <marxin at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords|needs-reduction |
CC| |marxin at gcc dot gnu.org
--- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> ---
Reduced to:
cat pr104788.ii
template <int __v>
struct integral_constant {
static constexpr int value = __v;
};
using true_type = integral_constant<true>;
using false_type = integral_constant<false>;
template <typename _Tp>
struct __success_type {
typedef _Tp type;
};
template <typename>
using __void_t = void;
template <typename _Tp, typename _Up = _Tp &&>
_Up __declval(int);
template <typename _Tp>
auto declval() -> decltype(__declval<_Tp>(0));
template <typename _Tp>
struct remove_cv {
using type = _Tp;
};
template <bool, bool, typename...>
struct __result_of_impl;
struct __result_of_other_impl {
template <typename _Fn, typename... _Args>
static __success_type<decltype(_Fn()(_Args()...))> _S_test(int);
};
template <typename _Functor, typename... _ArgTypes>
struct __result_of_impl<false, false, _Functor, _ArgTypes...>
: __result_of_other_impl {
typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
};
template <typename _Functor, typename... _ArgTypes>
struct __invoke_result : __result_of_impl<false_type::value, false_type::value,
_Functor, _ArgTypes...>::type {};
template <typename _Default>
struct __detector {
using type = _Default;
};
template <typename _Default, template <typename> class>
using __detected_or = __detector<_Default>;
template <typename _Default, template <typename> class _Op>
using __detected_or_t = __detected_or<_Default, _Op>::type;
template <typename, typename, typename = void>
struct __is_invocable_impl;
template <typename _Result, typename _Ret>
struct __is_invocable_impl<_Result, _Ret, __void_t<typename _Result::type>>
: true_type {};
template <typename _Fn, typename... _Args>
using invoke_result_t = __invoke_result<_Fn, _Args...>::type;
template <typename _Fn, typename... _ArgTypes>
struct is_invocable
: __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void> {};
template <typename _Tp, typename _Up>
constexpr bool is_same_v = __is_same(_Tp, _Up);
template <typename _Fn, typename... _Args>
constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value;
template <typename _Tp>
using remove_cvref_t = remove_cv<_Tp>::type;
template <typename, typename _Yp>
using __cond_res = decltype(declval<_Yp()>()());
template <typename...>
struct common_reference;
template <typename... _Tp>
using common_reference_t = common_reference<_Tp...>::type;
template <typename _Tp1, typename _Tp2>
struct common_reference<_Tp1, _Tp2> {
using type = __cond_res<int, _Tp2>;
};
namespace __detail {
template <typename _Tp, typename _Up>
concept __same_as = is_same_v<_Tp, _Up>;
}
template <typename _Tp, typename _Up>
concept same_as = __detail::__same_as<_Up, _Tp>;
template <typename _Tp, typename _Up>
concept common_reference_with =
same_as<common_reference_t<_Tp, _Up>, common_reference_t<_Tp, _Up>>;
namespace __detail {
template <typename _Tp>
using __cref = _Tp;
template <typename _Tp, typename _Up>
concept __weakly_eq_cmp_with = requires(_Tp __t, _Up __u) {
__u != __t;
};
} // namespace __detail
template <typename _Tp>
concept equality_comparable = __detail::__weakly_eq_cmp_with<_Tp, _Tp>;
template <typename _Tp, typename _Up>
concept equality_comparable_with =
common_reference_with<__detail::__cref<_Tp>, __detail::__cref<_Up>> &&
equality_comparable<
common_reference_t<__detail::__cref<_Tp>, __detail::__cref<_Up>>>;
template <typename _Tp, typename _Up>
concept totally_ordered_with = equality_comparable_with<
_Tp, common_reference_t<__detail::__cref<_Tp>, __detail::__cref<_Up>>>;
template <typename _Fn, typename... _Args>
concept invocable = is_invocable_v<_Fn, _Args...>;
template <typename _Fn, typename... _Args>
concept regular_invocable = invocable<_Fn, _Args...>;
template <typename _Fn, typename... _Args>
concept predicate = regular_invocable<_Fn, _Args...>;
template <typename _Rel, typename _Tp, typename _Up>
concept relation = predicate<_Rel, _Up, _Tp>;
template <typename _Rel, typename _Tp, typename _Up>
concept strict_weak_order = relation<_Rel, _Tp, _Up>;
template <typename>
struct iterator_traits;
struct identity {
template <typename _Tp>
_Tp operator()(_Tp);
};
struct less {
template <typename _Tp, typename _Up>
requires totally_ordered_with<_Tp, _Up>
bool operator()(_Tp, _Up);
};
namespace __detail {
template <typename _Tp>
concept __dereferenceable = requires(_Tp __t) {
__t;
};
} // namespace __detail
template <__detail::__dereferenceable _Tp>
using iter_reference_t = decltype(*_Tp());
namespace __detail {
template <typename _Tp>
using __iter_value_t = _Tp ::value_type;
}
template <typename _Tp>
using iter_value_t = __detail::__iter_value_t<_Tp>;
namespace __detail {
template <typename _In>
concept __indirectly_readable_impl = common_reference_with<_In, _In>;
}
template <typename _In>
concept indirectly_readable = __detail::__indirectly_readable_impl<_In>;
template <indirectly_readable _Tp>
using iter_common_reference_t = common_reference_t<_Tp, iter_value_t<_Tp>>;
template <typename _Iter>
concept random_access_iterator = requires(_Iter __n) {
__n;
};
template <typename _Fn, typename _Iter>
concept indirectly_regular_unary_invocable =
common_reference_with<invoke_result_t<_Fn, _Iter>,
invoke_result_t<_Fn, _Iter>>;
template <typename _Fn, typename _I1, typename _I2 = _I1>
concept indirect_strict_weak_order =
strict_weak_order<_Fn, iter_common_reference_t<_I1>, _I2>;
template <typename _Fn, typename... _Is>
using indirect_result_t = invoke_result_t<_Fn, iter_reference_t<_Is>...>;
template <indirectly_readable _Iter,
indirectly_regular_unary_invocable<_Iter> _Proj>
struct projected {
using value_type = remove_cvref_t<indirect_result_t<_Proj, _Iter>>;
};
template <typename _Iter, typename _Rel, typename _Proj = identity>
concept sortable = indirect_strict_weak_order<_Rel, projected<_Iter, _Proj>>;
namespace ranges::__cust_access {
template <typename _Tp>
auto __begin(_Tp __t) {
return __t.begin();
}
} // namespace ranges::__cust_access
namespace __detail {
template <typename _Tp>
using __range_iter_t = decltype(ranges::__cust_access::__begin(_Tp()));
}
template <typename _Tp>
struct iterator_traits<_Tp *> {
using reference = _Tp;
};
template <typename _Iterator>
struct __normal_iterator {
iterator_traits<_Iterator>::reference operator*();
};
template <typename _Tp>
struct allocator {
typedef _Tp value_type;
};
struct __allocator_traits_base {
template <typename _Tp>
using __pointer = _Tp;
};
template <typename _Alloc>
struct allocator_traits : __allocator_traits_base {
typedef _Alloc::value_type value_type;
using pointer = __detected_or_t<value_type *, __pointer>;
};
template <typename _Alloc>
struct __alloc_traits {
struct rebind {
typedef allocator_traits<_Alloc> other;
};
};
namespace ranges {
template <typename _Tp>
using iterator_t = __detail::__range_iter_t<_Tp>;
template <typename _Tp>
concept random_access_range = random_access_iterator<_Tp>;
struct {
template <random_access_range _Range, typename _Comp = less>
requires sortable<iterator_t<_Range>, _Comp> _Range operator()(_Range);
} sort;
} // namespace ranges
template <typename _Alloc>
struct _Vector_base {
typedef __alloc_traits<_Alloc>::rebind::other ::pointer pointer;
};
template <typename _Tp, typename _Alloc = allocator<_Tp>>
struct vector {
__normal_iterator<typename _Vector_base<_Alloc>::pointer> begin();
};
struct OpenFoamReader {
OpenFoamReader() {
struct Connection {
auto operator<=>(const Connection &) const = default;
};
vector<Connection> connections;
ranges::sort(connections);
}
};