diff --git a/stl/inc/xutility b/stl/inc/xutility index 966a1d66036..4abd43c637c 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -2211,6 +2211,9 @@ struct _Basic_const_iterator_category<_Iter> { _EXPORT_STD template class basic_const_iterator : public _Basic_const_iterator_category<_Iter> { private: + template + friend class basic_const_iterator; + /* [[no_unique_address]] */ _Iter _Current{}; using _Reference = iter_const_reference_t<_Iter>; diff --git a/tests/std/tests/P2278R4_basic_const_iterator/test.cpp b/tests/std/tests/P2278R4_basic_const_iterator/test.cpp index e9cc8502dd2..028631d7ddd 100644 --- a/tests/std/tests/P2278R4_basic_const_iterator/test.cpp +++ b/tests/std/tests/P2278R4_basic_const_iterator/test.cpp @@ -374,9 +374,35 @@ constexpr void test_p2836r1() { } } +// GH-5321 ": basic_const_iterator Cannot Convert to basic_const_iterator" +constexpr void test_conversion_instantiation() { + struct Base {}; + struct Derived : Base {}; + + { + basic_const_iterator cit = basic_const_iterator{}; + assert(cit.base() == nullptr); + } + { + int n{}; + basic_const_iterator cit = basic_const_iterator{&n}; + assert(cit.base() == &n); + } + { + basic_const_iterator cit = basic_const_iterator{}; + assert(cit.base() == nullptr); + } + { + Derived d{}; + basic_const_iterator cit = basic_const_iterator{&d}; + assert(cit.base() == static_cast(&d)); + } +} + constexpr bool all_tests() { instantiation_test(); test_p2836r1(); + test_conversion_instantiation(); return true; }