https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93978
Bug ID: 93978 Summary: A snippet using views::join fails to compile with -O1, but succeeds with -O0 Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: ppalka at gcc dot gnu.org Target Milestone: --- $ cat join.cc #include <ranges> #include <vector> namespace ranges = std::ranges; namespace views = std::views; void test() { std::vector<std::string> x = {""}; auto i = std::counted_iterator(x.begin(), 1); auto r = ranges::subrange{i, std::default_sentinel}; auto v = r | views::join; } $ g++ -std=c++2a -O0 join.cc $ g++ -std=c++2a -O1 join.c ... /home/patrick/code/gcc/libstdc++-v3/include/std/ranges:112:16: error: static assertion failed 112 | static_assert(view<_Derived>); | ^~~~~~~~~~~~~~ /home/patrick/code/gcc/libstdc++-v3/include/std/ranges:112:16: note: constraints not satisfied In file included from /home/patrick/code/gcc/libstdc++-v3/include/std/string:54, from /home/patrick/code/gcc/libstdc++-v3/include/bits/locale_classes.h:40, from /home/patrick/code/gcc/libstdc++-v3/include/bits/ios_base.h:41, from /home/patrick/code/gcc/libstdc++-v3/include/std/streambuf:41, from /home/patrick/code/gcc/libstdc++-v3/include/bits/streambuf_iterator.h:35, from /home/patrick/code/gcc/libstdc++-v3/include/std/iterator:66, from /home/patrick/code/gcc/libstdc++-v3/include/std/ranges:44, from join.cc:1: /home/patrick/code/gcc/libstdc++-v3/include/bits/range_access.h:880:13: required for the satisfaction of ‘range<std::ranges::join_view<std::ranges::subrange<std::counted_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::default_sentinel_t, std::ranges::subrange_kind::sized> > >’ /home/patrick/code/gcc/libstdc++-v3/include/bits/range_access.h:880:21: in requirements with ‘std::ranges::join_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> >& __t’ /home/patrick/code/gcc/libstdc++-v3/include/bits/range_access.h:883:13: note: the required expression ‘std::ranges::__cust::end(__t)’ is invalid 883 | ranges::end(__t); | ~~~~~~~~~~~^~~~~ If we uncomment the code in constraint.cc that replays constraint satisfication failures during diagnostics, it turns out that ranges::end(__t); is invalid ultimately because /home/patrick/code/gcc/libstdc++-v3/include/bits/range_access.h:437:26: error: use of ‘constexpr auto std::ranges::join_view<_Vp>::end() [with _Vp = 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>]’ before deduction of ‘auto’ 437 | { __decay_copy(__t.end()) } | ~~~~~~~^~ Removing the static_assert(view<_Derived>); from view_interface::_M_derived() fixes the compilation failure, but I'm not sure why.