Issue 167507
Summary clang++-22 does not compile std::ranges::to from libstdc++14-dev
Labels clang
Assignees
Reporter ryanjmulder
    clang++-22 fails to compile `std::ranges::to` from [libstdc++14-dev](https://packages.ubuntu.com/noble/libstdc++-14-dev)

The same code compiles with g++ 14.2.0

Minimal example:
``` c++
#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
```

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to