Package: clang-13 Version: 1:13.0.0-9+b1 Severity: important Tags: upstream
Dear Maintainer, clang++ 13, as of now in Debian unstable, and on Compiler Explorer, causes confusing and seemingly wrong template/constraint errors when trying to compile many pieces of code using std::ranges / std::views objects like views::transform, seemingly because they end up using std::ranges::ref_view and that is broken. I have encountered this when trying to build my own projects with clang++ instead of my usual g++. I can replicate it here on Compiler Explorer - using the example code from https://en.cppreference.com/w/cpp/ranges/transform_view - with clang++- 13 using -std=c++20: https://godbolt.org/z/f14zWMdWa I cannot find any bug report for this upstream or on reportbug. I also cannot see how to report bugs to clang++ since its Bugzilla says it's in read- only mode due to migrating to GitHub, but its link to the status of the migration says it's been paused... Thus can you please ensure this reaches the clang++ maintainers and is patched upstream and in Debian as soon as possible? Thanks! Daniel -- code: -- #include <algorithm> #include <array> #include <cstdio> #include <ranges> #include <string> class Transcoder { static constexpr std::array r{ 0x02,-0x02,-0x42, 0x05, 0x04, 0x05, 0x04,-0x02, 0x00,-0x0a, 0x06,-0x04, 0x00, 0x0c, 0x03,-0x06, }; decltype(r.size()) p{}, q{}; public: char operator() (int x) { ! (p|q) ? (99 == x ? x += r[p++] : x -= r[q++]) : (0 < p && p < r.size()) ? x += r[p++] : (0 < q && q < r.size()) ? x -= r[q++] : (0) ; return x; } }; int main() { auto show = [](const char x) { std::putchar(x); }; std::string in{ "cppreference.com\n" }; std::ranges::for_each(in, show); std::string out; std::ranges::copy( std::ranges::views::transform(in, Transcoder{}), std::back_inserter(out)); std::ranges::for_each(out, show); auto view = std::ranges::transform_view{ out, Transcoder{} }; std::ranges::for_each(view, show); std::ranges::for_each(view, show); } -- errors: -- /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/iterator_concepts.h:962: 35: note: and 'const std::ranges::ref_view<std::basic_string<char>> &' does not satisfy '__member_begin' requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/iterator_concepts.h:945: 23: note: because '__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::ref_view<std::basic_string<char>>' { __decay_copy(__t.begin()) } -> input_or_output_iterator; ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/iterator_concepts.h:962: 59: note: and 'const std::ranges::ref_view<std::basic_string<char>> &' does not satisfy '__adl_begin' requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/iterator_concepts.h:956: 19: note: because '__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin' { __decay_copy(begin(__t)) } -> input_or_output_iterator; ^ In file included from <source>:1: In file included from /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64- linux- gnu/11.2.0/../../../../include/c++/11.2.0/algorithm:64: In file included from /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64- linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_algo.h:36: /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_util.h:110:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = std::ranges::ref_view<std::basic_string<char>>] && sized_sentinel_for<sentinel_t<_Derived>, iterator_t<_Derived>> ^~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1013:29: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::ref_view<std::basic_string<ch ar>>>' requested here class ref_view : public view_interface<ref_view<_Range>> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1069:38: note: in instantiation of template class 'std::ranges::ref_view<std::basic_string<char>>' requested here concept __can_ref_view = requires { ref_view{std::declval<_Range>()}; }; ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1069:38: note: in instantiation of requirement here concept __can_ref_view = requires { ref_view{std::declval<_Range>()}; }; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1069:27: note: while substituting template arguments into constraint expression here concept __can_ref_view = requires { ref_view{std::declval<_Range>()}; }; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1079:7: note: while checking the satisfaction of concept '__can_ref_view<std::basic_string<char> &>' requested here || __detail::__can_ref_view<_Range> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1079:17: note: (skipping 6 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all) || __detail::__can_ref_view<_Range> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1906:6: note: while substituting template arguments into constraint expression here = requires { transform_view(std::declval<_Range>(), std::declval<_Fp>()); }; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1912:11: note: while checking the satisfaction of concept '__can_transform_view<std::basic_string<char> &, Transcoder>' requested here requires __detail::__can_transform_view<_Range, _Fp> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1912:21: note: while substituting template arguments into constraint expression here requires __detail::__can_transform_view<_Range, _Fp> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <source>:34:38: note: while checking constraint satisfaction for template 'operator()<std::basic_string<char> &, Transcoder>' required here std::ranges::views::transform(in, Transcoder{}), ^ <source>:34:38: note: in instantiation of function template specialization 'std::ranges::views::_Transform::operator()<std::basic_string<char> &, Transcoder>' requested here /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_base.h:588:12: note: because 'std::ranges::ref_view<std::basic_string<char>>' does not satisfy 'range' template<range _Range> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_base.h:576:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin' ranges::begin(__t); ^ In file included from <source>:1: In file included from /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64- linux- gnu/11.2.0/../../../../include/c++/11.2.0/algorithm:64: In file included from /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64- linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_algo.h:36: /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_util.h:116:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = const std::ranges::ref_view<std::basic_string<char>>] && sized_sentinel_for<sentinel_t<const _Derived>, ^~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_base.h:588:12: note: because 'const std::ranges::ref_view<std::basic_string<char>>' does not satisfy 'range' template<range _Range> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/bits/ranges_base.h:576:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin' ranges::begin(__t); ^ <source>:34:9: error: no matching function for call to object of type 'const std::ranges::views::_Transform' std::ranges::views::transform(in, Transcoder{}), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1914:2: note: candidate template ignored: constraints not satisfied [with _Range = std::basic_string<char> &, _Fp = Transcoder] operator()(_Range&& __r, _Fp&& __f) const ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1912:21: note: because '__detail::__can_transform_view<std::basic_string<char> &, Transcoder>' evaluated to false requires __detail::__can_transform_view<_Range, _Fp> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1906:17: note: because 'transform_view(std::declval<_Range>(), std::declval<_Fp>())' would be invalid: no viable constructor or deduction guide for deduction of template arguments of 'transform_view' = requires { transform_view(std::declval<_Range>(), std::declval<_Fp>()); }; ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:806:2: note: candidate template ignored: constraints not satisfied [with _Args = <std::basic_string<char> &, Transcoder>] operator()(_Args&&... __args) const ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:804:11: note: because '__adaptor_partial_app_viable<std::ranges::views::_Transform, std::basic_string<char> &, Transcoder>' evaluated to false requires __adaptor_partial_app_viable<_Derived, _Args...> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:753:11: note: because 'sizeof...(_Args) == _Transform::_S_arity - 1' (2 == 1) evaluated to false && (sizeof...(_Args) == _Adaptor::_S_arity - 1) ^ <source>:38:17: error: no viable constructor or deduction guide for deduction of template arguments of 'transform_view' auto view = std::ranges::transform_view{ out, Transcoder{} }; ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1846:7: note: candidate template ignored: substitution failure [with _Vp = std::basic_string<char>, _Fp = Transcoder]: constraints not satisfied for class template 'transform_view' [with _Vp = std::basic_string<char>, _Fp = Transcoder] transform_view(_Vp __base, _Fp __fun) ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1898:5: note: candidate template ignored: substitution failure [with _Range = std::basic_string<char> &, _Fp = Transcoder]: constraints not satisfied for class template 'transform_view' [with _Vp = std::ranges::ref_view<std::basic_string<char>>, _Fp = Transcoder] transform_view(_Range&&, _Fp) -> transform_view<views::all_t<_Range>, _Fp>; ^ ~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1557:11: note: candidate function template not viable: requires 1 argument, but 2 were provided class transform_view : public view_interface<transform_view<_Vp, _Fp>> ^ /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux- gnu/11.2.0/../../../../include/c++/11.2.0/ranges:1843:7: note: candidate function template not viable: requires 0 arguments, but 2 were provided transform_view() = default; ^ 6 errors generated. Compiler returned: 1 -- System Information: Debian Release: bookworm/sid APT prefers unstable APT policy: (500, 'unstable'), (500, 'testing'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 5.15.0-2-amd64 (SMP w/8 CPU threads) Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages clang-13 depends on: ii binutils 2.37-10 ii libc6 2.32-4 ii libc6-dev 2.32-4 ii libclang-common-13-dev 1:13.0.0-9+b1 ii libclang-cpp13 1:13.0.0-9+b1 ii libclang1-13 1:13.0.0-9+b1 ii libgcc-11-dev 11.2.0-12 ii libgcc-s1 11.2.0-12 ii libllvm13 1:13.0.0-9+b1 ii libobjc-11-dev 11.2.0-12 ii libstdc++-11-dev 11.2.0-12 ii libstdc++6 11.2.0-12 Versions of packages clang-13 recommends: ii llvm-13-dev 1:13.0.0-9+b1 ii python3 3.9.8-1 Versions of packages clang-13 suggests: pn clang-13-doc <none> -- no debconf information

