| 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