[libcxx-commits] [clang] [libcxx] [Clang] Normalize constraints before checking for satisfaction (PR #161671)
Lei Wang via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Oct 6 10:29:38 PDT 2025
wlei-llvm wrote:
Hey, this breaks our internal range-v3:
```
In file included from range-v3/range/v3/view/transform.hpp:37:
In file included from range-v3/range/v3/view/adaptor.hpp:28:
In file included from range-v3/range/v3/view/all.hpp:26:
In file included from range-v3/range/v3/view/ref.hpp:25:
range-v3/range/v3/view/interface.hpp:233:59: error: invalid operands to binary
expression ('detail::facade_sentinel_t<ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const
std::vector<std::shared_ptr<const facebook::crux::SelectItem>, std::allocator<std::shared_ptr<const facebook::crux::SelectItem>>>>>, ranges::logical_negate<(lambda at
ccr/HqlRenderer.cpp:4523:33)>>>' (aka 'ranges::adaptor_sentinel<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_,
ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>::sentinel<false>,
ranges::adaptor_base>') and 'detail::facade_iterator_t<ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const
std::vector<std::shared_ptr<const facebook::crux::SelectItem>, std::allocator<std::shared_ptr<const facebook::crux::SelectItem>>>>>, ranges::logical_negate<(lambda at
ccr/HqlRenderer.cpp:4523:33)>>>' (aka
'basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>, std::allocator<std::shared_ptr<const facebook::crux::SelectItem>>>>>::cursor<false>>,
ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>,
std::allocator<std::shared_ptr<const facebook::crux::SelectItem>>>>>, ranges::logical_negate<(lambda at ccr/HqlRenderer.cpp:4523:33)>>::adaptor>>'))
233 | return static_cast<size_type>(derived().end() - derived().begin());
| ~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~
range-v3/range/v3/range/primitives.hpp:134:35: note: in instantiation of
function template specialization 'ranges::view_interface<ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const
std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, ranges::logical_negate<(lambda at ccr/HqlRenderer.cpp:4523:33)>>>::size<true>' requested here
134 | return ((R &&) r).size();
| ^
range-v3/range/v3/view/transform.hpp:189:20: note: in instantiation of function
template specialization 'ranges::_size_::fn::operator()<ranges::filter_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const
std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, (lambda at ccr/HqlRenderer.cpp:4523:33)> &>' requested here
189 | return ::ranges::size(this->base());
| ^
range-v3/range/v3/range/primitives.hpp:52:28: note: in instantiation of member
function 'ranges::iter_transform_view<ranges::filter_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const
std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, (lambda at ccr/HqlRenderer.cpp:4523:33)>, ranges::indirected<(lambda at
ccr/HqlRenderer.cpp:4528:36)>>::size' requested here
52 | ((T &&) t).size()
| ^
range-v3/concepts/concepts/concepts.hpp:464:35: note: expanded from macro
'CPP_requires'
464 | CPP_PP_CAT(CPP_REQUIRES_, REQS)
| ^
range-v3/concepts/concepts/concepts.hpp:67:45: note: expanded from macro
'CPP_PP_CAT'
67 | #define CPP_PP_CAT(X, ...) CPP_PP_CAT_(X, __VA_ARGS__)
| ^
range-v3/concepts/concepts/concepts.hpp:66:35: note: expanded from macro
'CPP_PP_CAT_'
66 | #define CPP_PP_CAT_(X, ...) X ## __VA_ARGS__
| ^
range-v3/concepts//concepts/concepts.hpp:475:7: note: expanded from macro
'CPP_REQUIRES_AUX_'
475 | { __VA_ARGS__; }
| ^
range-v3/range/v3/range/primitives.hpp:52:17: note: in instantiation of
requirement here
52 | ((T &&) t).size()
| ^~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:464:35: note: expanded from macro
'CPP_requires'
464 | CPP_PP_CAT(CPP_REQUIRES_, REQS)
| ^~~~
range-v3/concepts/concepts/concepts.hpp:67:45: note: expanded from macro
'CPP_PP_CAT'
67 | #define CPP_PP_CAT(X, ...) CPP_PP_CAT_(X, __VA_ARGS__)
| ^~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:66:35: note: expanded from macro
'CPP_PP_CAT_'
66 | #define CPP_PP_CAT_(X, ...) X ## __VA_ARGS__
| ^~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:475:7: note: expanded from macro
'CPP_REQUIRES_AUX_'
475 | { __VA_ARGS__; }
| ^~~~~~~~~~~
range-v3/range/v3/range/primitives.hpp:49:9: note: while substituting template
arguments into constraint expression here
49 | CPP_requires(has_member_size_,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
50 | requires(T && t) //
| ~~~~~~~~~~~~~~~~~~~
51 | (
| ~
52 | ((T &&) t).size()
| ~~~~~~~~~~~~~~~~~
53 | ));
| ~~
range-v3/concepts/concepts/concepts.hpp:464:9: note: expanded from macro
'CPP_requires'
464 | CPP_PP_CAT(CPP_REQUIRES_, REQS)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:67:30: note: expanded from macro
'CPP_PP_CAT'
67 | #define CPP_PP_CAT(X, ...) CPP_PP_CAT_(X, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:66:30: note: expanded from macro
'CPP_PP_CAT_'
66 | #define CPP_PP_CAT_(X, ...) X ## __VA_ARGS__
| ^~~~~~~~~~~~~~~~
<scratch space>:23:1: note: expanded from here
23 | CPP_REQUIRES_requires
| ^
range-v3/concepts/concepts/concepts.hpp:471:5: note: expanded from macro
'CPP_REQUIRES_requires'
471 | requires(__VA_ARGS__) CPP_REQUIRES_AUX_
| ^
range-v3/range/v3/range/primitives.hpp:58:30: note: (skipping 5 contexts in
backtrace; use -ftemplate-backtrace-limit=0 to see all)
58 | CPP_requires_ref(_size_::has_member_size_, T);
| ^
range-v3/range/v3/range/concepts.hpp:194:5: note: while substituting template
arguments into constraint expression here
194 | CPP_requires(sized_range_,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
195 | requires(T & t) //
| ~~~~~~~~~~~~~~~~~~
196 | (
| ~
197 | ::ranges::size(t)
| ~~~~~~~~~~~~~~~~~
198 | ));
| ~~
range-v3/concepts/concepts/concepts.hpp:464:9: note: expanded from macro
'CPP_requires'
464 | CPP_PP_CAT(CPP_REQUIRES_, REQS)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:67:30: note: expanded from macro
'CPP_PP_CAT'
67 | #define CPP_PP_CAT(X, ...) CPP_PP_CAT_(X, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:66:30: note: expanded from macro
'CPP_PP_CAT_'
66 | #define CPP_PP_CAT_(X, ...) X ## __VA_ARGS__
| ^~~~~~~~~~~~~~~~
<scratch space>:176:1: note: expanded from here
176 | CPP_REQUIRES_requires
| ^
range-v3/concepts/concepts/concepts.hpp:471:5: note: expanded from macro
'CPP_REQUIRES_requires'
471 | requires(__VA_ARGS__) CPP_REQUIRES_AUX_
| ^
range-v3/range/v3/range/concepts.hpp:211:26: note: while checking the
satisfaction of concept 'sized_range_requires_<cont_t, iter_t, ranges::transform_view<ranges::filter_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, (lambda at ccr/HqlRenderer.cpp:4523:33)>,
(lambda at ccr/HqlRenderer.cpp:4528:36)>>' requested here
211 | CPP_requires_ref(::ranges::sized_range_, T) &&
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:466:16: note: expanded from macro
'CPP_requires_ref'
466 | CPP_PP_CAT(NAME, requires_)<__VA_ARGS__>
| ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/concepts/concepts/concepts.hpp:67:42: note: expanded from macro
'CPP_PP_CAT'
67 | #define CPP_PP_CAT(X, ...) CPP_PP_CAT_(X, __VA_ARGS__)
| ^
range-v3/concepts/concepts/concepts.hpp:66:30: note: expanded from macro
'CPP_PP_CAT_'
66 | #define CPP_PP_CAT_(X, ...) X ## __VA_ARGS__
| ^
range-v3/range/v3/range/conversion.hpp:261:13: note: while checking the
satisfaction of concept 'sized_range<cont_t, iter_t, ranges::transform_view<ranges::filter_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, (lambda at ccr/HqlRenderer.cpp:4523:33)>,
(lambda at ccr/HqlRenderer.cpp:4528:36)>>' requested here
261 | sized_range<R>;
| ^~~~~~~~~~~~~~
range-v3/range/v3/range/conversion.hpp:345:39: note: while checking the
satisfaction of concept 'to_container_reserve<cont_t, iter_t, ranges::transform_view<ranges::filter_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, (lambda at ccr/HqlRenderer.cpp:4523:33)>,
(lambda at ccr/HqlRenderer.cpp:4528:36)>>' requested here
345 | meta::bool_<(bool)to_container_reserve<cont_t, iter_t, Rng>>;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
range-v3/range/v3/range/conversion.hpp:276:24: note: in instantiation of
function template specialization
'ranges::detail::to_container::fn<ranges::detail::from_range<std::vector>>::operator()<ranges::transform_view<ranges::filter_view<ranges::zip_view<ranges::detail::index_view<unsigned
long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>, (lambda at ccr/HqlRenderer.cpp:4523:33)>,
(lambda at ccr/HqlRenderer.cpp:4528:36)>>' requested here
276 | return static_cast<Fn &&>(fn)(static_cast<Rng &&>(rng));
| ^
range-v3/range/v3/iterator/basic_iterator.hpp:803:5: note: candidate template
ignored: could not match 'basic_iterator' against 'ranges::adaptor_sentinel'
803 | operator-(basic_iterator<Cur> left, typename basic_iterator<Cur>::difference_type n)
| ^
range-v3/range/v3/iterator/basic_iterator.hpp:811:5: note: candidate template
ignored: could not match 'basic_iterator' against 'ranges::adaptor_sentinel'
811 | operator-(basic_iterator<Cur2> const & left, basic_iterator<Cur> const & right)
| ^
range-v3/range/v3/iterator/basic_iterator.hpp:819:5: note: candidate template
ignored: constraints not satisfied [with S = detail::facade_sentinel_t<ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>, std::allocator<std::shared_ptr<const facebook::crux::SelectItem>>>>>,
ranges::logical_negate<(lambda at ccr/HqlRenderer.cpp:4523:33)>>>, Cur =
ranges::adaptor_cursor<ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem>>>>::cursor<false>>,
ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const
facebook::crux::SelectItem>>>>, ranges::logical_negate<(lambda at ccr/HqlRenderer.cpp:4523:33)>>::adaptor>]
819 | operator-(S const & left, basic_iterator<Cur> const & right)
| ^
range-v3/range/v3/iterator/basic_iterator.hpp:817:18: note: because
'detail::sized_sentinel_for_cursor<detail::facade_sentinel_t<ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const
std::vector<std::shared_ptr<const facebook::crux::SelectItem>, std::allocator<std::shared_ptr<const facebook::crux::SelectItem> > > > >, ranges::logical_negate<(lambda at
ccr/HqlRenderer.cpp:4523:33)> > >, ranges::adaptor_cursor<ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_,
ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem> > > >::cursor<false> >,
ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem> >
> >, ranges::logical_negate<(lambda at ccr/HqlRenderer.cpp:4523:33)> >::adaptor>>' evaluated to false
817 | requires detail::sized_sentinel_for_cursor<S, Cur>)
| ^
range-v3/range/v3/detail/prologue.hpp:35:26: note: expanded
from macro 'template'
35 | template<__VA_ARGS__ CPP_TEMPLATE_AUX_ \
| ^
range-v3/range/v3/detail/range_access.hpp:329:30: note: because
'detail::sized_sentinel_for_cursor_requires_<ranges::adaptor_sentinel<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::detail::index_view<unsigned long,
long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem> > > >::sentinel<false>, ranges::adaptor_base>,
ranges::adaptor_cursor<ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::detail::index_view<unsigned long, long>,
ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem> > > >::cursor<false> >,
ranges::remove_if_view<ranges::zip_view<ranges::detail::index_view<unsigned long, long>, ranges::ref_view<const std::vector<std::shared_ptr<const facebook::crux::SelectItem> >
> >, ranges::logical_negate<(lambda at ccr/HqlRenderer.cpp:4523:33)> >::adaptor>>' evaluated to false
329 | CPP_requires_ref(detail::sized_sentinel_for_cursor_, S, C);
| ^
range-v3/range/v3/detail/range_access.hpp:319:17: note: because
'range_access::distance_to(c, s) , concepts::requires_<signed_integer_like_<decltype(range_access::distance_to(c, s))>>' would be invalid: no matching function for call to
'distance_to'
319 | range_access::distance_to(c, s),
| ^
range-v3/range/v3/iterator/basic_iterator.hpp:826:5: note: candidate template
ignored: could not match 'basic_iterator' against 'ranges::adaptor_sentinel'
826 | operator-(basic_iterator<Cur> const & left, S const & right)
| ^
range-v3/range/v3/iterator/common_iterator.hpp:290:27: note: candidate template
ignored: could not match 'common_iterator' against 'ranges::adaptor_sentinel'
290 | iter_difference_t<I2> operator-(common_iterator<I1, S1> const & x,
| ^
range-v3/range/v3/iterator/counted_iterator.hpp:377:37: note: candidate template
ignored: could not match 'counted_iterator' against 'ranges::adaptor_sentinel'
377 | constexpr iter_difference_t<I2> operator-(counted_iterator<I1> const & x,
| ^
range-v3/range/v3/iterator/counted_iterator.hpp:384:36: note: candidate template
ignored: could not match 'counted_iterator' against 'ranges::adaptor_sentinel'
384 | constexpr iter_difference_t<I> operator-(counted_iterator<I> const & x,
| ^
range-v3/range/v3/iterator/counted_iterator.hpp:391:36: note: candidate template
ignored: could not match 'counted_iterator' against 'basic_iterator'
391 | constexpr iter_difference_t<I> operator-(default_sentinel_t,
|
```
Seems others hit some related issues too and there are some fixes, but I just checked the error are still present for the HEAD, any idea for the fix?
https://github.com/llvm/llvm-project/pull/161671
More information about the libcxx-commits
mailing list