I haven't done a formal bisect, but I think this is caused by
commit 9f01ac3b3257ab925a2b1229dba19e3eb86a706b
Author: zoecarver <z.zoelec2@gmail.com>
Date: Tue Apr 20 08:50:11 2021 -0400
[libcxx] makes `iterator_traits` C++20-aware
* adds `iterator_traits` specialisation that supports all expected
member aliases except for `pointer`
* adds `iterator_traits` specialisations for iterators that meet the
legacy iterator requirements but might lack multiple member aliases
* makes pointer `iterator_traits` specialisation require objects
Depends on D99854.
Differential Revision: https://reviews.llvm.org/D99855
That change was made as part of our ongoing implementation of Ranges in libc++.
It looks like you are trying to detect whether a specialization of std::iterator_traits refers to the base template or to a full/partial specialization. If so, you could use the presence of the __primary_template member inside std::iterator_traits to detect that in newer versions. Even better would be to not rely on any implementation detail of libc++, however I expect you'll say that you can't live without it.
Those lines won't work anymore with recent versions of libc++:
https://github.com/ericniebler/range-v3/blob/e157199166e20f7f4a730292e212239682a89095/include/std/detail/associated_types.hpp#L267-L272
I haven't done a formal bisect, but I think this is caused by
That change was made as part of our ongoing implementation of Ranges in libc++.
It looks like you are trying to detect whether a specialization of
std::iterator_traits
refers to the base template or to a full/partial specialization. If so, you could use the presence of the__primary_template
member insidestd::iterator_traits
to detect that in newer versions. Even better would be to not rely on any implementation detail of libc++, however I expect you'll say that you can't live without it.cc @zoecarver for awareness