Bug#1001107: clang-13: clang++-13 has broken std::ranges::ref_view - iterator_concepts.h:980:13: error: no matching function for call to '__begin'

Daniel Boles dboles.src at gmail.com
Sun Dec 5 10:13:36 GMT 2021


I see now that the Transcoder stuff in the cppref code is invalid for
separate reasons, chiefly that the functor passed to transform is not
std::regular_invocable because it is not equality preserving... so I'll fix
that as it's a wiki.

BUT the error occurs regardless and has manifested in unrelated, OK code
too. Not being equality preserving cannot cause my errors since that is not
compiler diagnosable.

Nonetheless I'll try to prepare a separate repro.


On Sat, 4 Dec 2021, 13:10 Daniel Boles, <dboles.src at gmail.com> wrote:

> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-llvm-team/attachments/20211205/244fe864/attachment-0001.htm>


More information about the Pkg-llvm-team mailing list