[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