The attached preprocessed code compiles with -std=gnu++20 -O1 but fails if you add -Wformat This is the output for -std=gnu++20 -O1 -fcompare-debug=-Wformat In file included from /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ranges_algobase.h:38, from /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ranges_algo.h:35, from /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/algorithm:64, from /home/jwakely/src/gcc/gcc-10/libstdc++-v3/testsuite/std/ranges/adaptors/join.cc:21: /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges: In instantiation of ‘constexpr const _Derived& std::ranges::view_interface<_Derived>::_M_derived() const [with _Derived = std::ranges::join_view<std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity> >]’: /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges:130:73: required from ‘constexpr std::ranges::view_interface<_Derived>::operator bool() const requires requires{std::ranges::__cust::empty(((const std::ranges::view_interface<_Derived>*)this)->std::ranges::view_interface<_Derived>::_M_derived()());} [with _Derived = std::ranges::join_view<std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity> >]’ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges:2673:56: required from ‘constexpr auto std::ranges::join_view<_Vp>::end() [with _Vp = std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity>]’ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/range_access.h:419:26: required from ‘constexpr auto std::ranges::__cust_access::_End::operator()(_Tp&&) const [with _Tp = std::ranges::join_view<std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity> >&]’ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/range_access.h:865:13: required from here /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges:112:16: error: static assertion failed 112 | static_assert(view<_Derived>); | ^~~~~~~~~~~~~~ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges: In instantiation of ‘constexpr _Derived& std::ranges::view_interface<_Derived>::_M_derived() [with _Derived = std::ranges::join_view<std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity> >]’: /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges:126:67: required from ‘constexpr std::ranges::view_interface<_Derived>::operator bool() requires requires{std::ranges::__cust::empty(((std::ranges::view_interface<_Derived>*)this)->std::ranges::view_interface<_Derived>::_M_derived()());} [with _Derived = std::ranges::join_view<std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity> >]’ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges:2673:56: required from ‘constexpr auto std::ranges::join_view<_Vp>::end() [with _Vp = std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity>]’ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/range_access.h:419:26: required from ‘constexpr auto std::ranges::__cust_access::_End::operator()(_Tp&&) const [with _Tp = std::ranges::join_view<std::ranges::transform_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized>, std::identity> >&]’ /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/range_access.h:865:13: required from here /home/jwakely/src/gcc/build10/x86_64-pc-linux-gnu/libstdc++-v3/include/ranges:105:16: error: static assertion failed 105 | static_assert(view<_Derived>); | ^~~~~~~~~~~~~~ g++: error: during ‘-fcompare-debug’ recompilation g++: error: /tmp/join-good.ii: ‘-fcompare-debug’ failure (length)
Removing the [10 Regression] marker, as the same code fails even with 10.1.0 (and depends on C++20 features that aren't in gcc-9 so I can't test it there). It does compile OK on trunk though.
Hmm, I suspect this might essentially be a dup of PR c++/94038 / PR libstdc++/93978.
Yes, that seems likely.