Skip to content

clang++-22 does not compile std::ranges::to from libstdc++14-dev #167507

@ryanjmulder

Description

@ryanjmulder

clang++-22 fails to compile std::ranges::to from libstdc++14-dev

The same code compiles with g++ 14.2.0

Minimal example:

#include <ranges>
#include <string>
#include <vector>

int main()
{
    std::vector< std::string > strings{ "one", "two" };
    auto const list = strings | std::views::join_with( std::string_view( ", " ) ) | std::ranges::to< std::string >();
    return static_cast< int >( list.size() );
}

Output:

$ clang++-22 main.cpp -std=c++23
In file included from main.cpp:1:
In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:43:
In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/iterator:61:
In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_iterator_base_types.h:71:
In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:37:
In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/ptr_traits.h:35:
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/move.h:115:36: error: function 'forward_like<std::ranges::views::__adaptor::_Partial<std::ranges::__detail::_To<std::basic_string<char>>>,
      std::ranges::views::__adaptor::_Partial<std::ranges::__detail::_To<std::basic_string<char>>>>' with deduced return type cannot be used before it is defined
  115 |     using __like_t = decltype(std::forward_like<_Tp>(std::declval<_Up>()));
      |                                    ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:1035:35: note: in instantiation of template type alias '__like_t' requested here
 1035 |           return std::apply(__forwarder, __like_t<_Self, _Partial>(__self)._M_args);
      |                                          ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:915:20: note: in instantiation of function template specialization
      'std::ranges::views::__adaptor::_Partial<std::ranges::__detail::_To<std::basic_string<char>>>::operator()<std::ranges::views::__adaptor::_Partial<std::ranges::__detail::_To<std::basic_string<char>>>,
      std::ranges::join_with_view<std::ranges::ref_view<std::vector<std::basic_string<char>>>, std::basic_string_view<char>>>' requested here
  915 |       = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
      |                    ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:915:20: note: in instantiation of requirement here
  915 |       = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
      |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:915:9: note: while substituting template arguments into constraint expression here
  915 |       = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:953:10: note: while checking the satisfaction of concept '__adaptor_invocable<_Partial<_To<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>,
      join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const
      std::basic_string_view<char, std::char_traits<char>> &>>>' requested here
  953 |       && __adaptor_invocable<_Self, _Range>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:8:83: note: while checking constraint satisfaction for template 'operator|<_Partial<_To<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>, join_with_view<views::all_t<std::vector<std::basic_string<char,
      std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>>' required here
    8 |     auto const list = strings | std::views::join_with( std::string_view( ", " ) ) | std::ranges::to< std::string >();
      |                                                                                   ^
main.cpp:8:83: note: while substituting deduced template arguments into function template 'operator|' [with _Self = _Partial<_To<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>, _Range =
      join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const
      std::basic_string_view<char, std::char_traits<char>> &>>]
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/move.h:93:3: note: 'forward_like<std::ranges::views::__adaptor::_Partial<std::ranges::__detail::_To<std::basic_string<char>>>,
      std::ranges::views::__adaptor::_Partial<std::ranges::__detail::_To<std::basic_string<char>>>>' declared here
   93 |   forward_like(_Up&& __x) noexcept
      |   ^
main.cpp:8:83: error: invalid operands to binary expression ('join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>' (aka 'join_with_view<ref_view<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>,
      std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, std::basic_string_view<char, std::char_traits<char>>>') and '_Partial<_To<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>')
    8 |     auto const list = strings | std::views::join_with( std::string_view( ", " ) ) | std::ranges::to< std::string >();
      |                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/cstddef:136:3: note: candidate function not viable: no known conversion from 'join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>' (aka
      'join_with_view<ref_view<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, std::basic_string_view<char,
      std::char_traits<char>>>') to 'byte' for 1st argument
  136 |   operator|(byte __l, byte __r) noexcept
      |   ^         ~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/ios_base.h:89:3: note: candidate function not viable: no known conversion from 'join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>' (aka
      'join_with_view<ref_view<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, std::basic_string_view<char,
      std::char_traits<char>>>') to '_Ios_Fmtflags' for 1st argument
   89 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) _GLIBCXX_NOTHROW
      |   ^         ~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/ios_base.h:139:3: note: candidate function not viable: no known conversion from 'join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>' (aka
      'join_with_view<ref_view<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, std::basic_string_view<char,
      std::char_traits<char>>>') to '_Ios_Openmode' for 1st argument
  139 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b) _GLIBCXX_NOTHROW
      |   ^         ~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/ios_base.h:186:3: note: candidate function not viable: no known conversion from 'join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>' (aka
      'join_with_view<ref_view<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, std::basic_string_view<char,
      std::char_traits<char>>>') to '_Ios_Iostate' for 1st argument
  186 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b) _GLIBCXX_NOTHROW
      |   ^         ~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:955:5: note: candidate template ignored: constraints not satisfied [with _Self = _Partial<_To<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>, _Range =
      join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const
      std::basic_string_view<char, std::char_traits<char>> &>>]
  955 |     operator|(_Range&& __r, _Self&& __self)
      |     ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:953:10: note: because '__adaptor_invocable<_Partial<_To<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >,
      join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > &>, views::all_t<const
      std::basic_string_view<char, std::char_traits<char> > &> >>' evaluated to false
  953 |       && __adaptor_invocable<_Self, _Range>
      |          ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:915:20: note: because 'std::declval<_Adaptor>()(declval<_Args>()...)' would be invalid
  915 |       = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
      |                    ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:964:5: note: candidate template ignored: constraints not satisfied [with _Lhs = join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>, _Rhs = _Partial<_To<std::basic_string<char,
      std::char_traits<char>, std::allocator<char>>>>]
  964 |     operator|(_Lhs&& __lhs, _Rhs&& __rhs)
      |     ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:961:14: note: because 'join_with_view<views::all_t<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char,
      std::char_traits<char>, std::allocator<char>>>> &>, views::all_t<const std::basic_string_view<char, std::char_traits<char>> &>>' (aka 'join_with_view<ref_view<std::vector<std::basic_string<char, std::char_traits<char>,
      std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, std::basic_string_view<char, std::char_traits<char>>>') does not satisfy '__is_range_adaptor_closure'
  961 |     requires __is_range_adaptor_closure<_Lhs>
      |              ^
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ranges:946:30: note: because '__adaptor::__is_range_adaptor_closure_fn(__t, __t)' would be invalid: no matching function for call to '__is_range_adaptor_closure_fn'
  946 |       = requires (_Tp __t) { __adaptor::__is_range_adaptor_closure_fn(__t, __t); };
      |                              ^
2 errors generated.

Versions:

$ clang++-22 --version
Ubuntu clang version 22.0.0 (++20251110081819+f2f04c363cc1-1~exp1~20251110201947.1281)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-22/bin

Installed from:

$ cat /etc/apt/sources.list.d/llvm.list 
deb http://apt.llvm.org/noble/ llvm-toolchain-noble main
deb-src http://apt.llvm.org/noble/ llvm-toolchain-noble main

Metadata

Metadata

Assignees

No one assigned

    Labels

    clang:frontendLanguage frontend issues, e.g. anything involving "Sema"duplicateResolved as duplicatelibstdc++GNU libstdc++ C++ standard library

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions