https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95310

--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> ---
(In reply to ensadc from comment #3)
> When verifying the fix, I noticed a new bug:

Thanks for the heads up.

> 
> ====
> template <class T> requires true
> using iter_reference_t = decltype(*T{});
> 
> template <typename F>
> struct result {
>   using type = iter_reference_t<F>;
> };
> 
> template <class Out, class T>
> concept indirectly_writable = requires(Out&& o, T&& t) {
>   iter_reference_t<Out>(*o) = 0;
> };
> 
> template<class In, class Out>
> requires indirectly_writable<Out, iter_reference_t<In>>
> void copy(In in, Out out) {}
> 
> void test(const int* p, int* q) {
>     copy(q, p);
> }
> 
> ====
> <source>: In function 'void test(const int*, int*)':
> <source>:19:14: error: no matching function for call to 'copy(int*&, const
> int*&)'
>    19 |     copy(q, p);
>       |              ^
> <source>:16:6: note: candidate: 'template<class In, class Out>  requires 
> indirectly_writable<Out, decltype(*{})> void copy(In, Out)'
>    16 | void copy(In in, Out out) {}
>       |      ^~~~
> <source>:16:6: note:   template argument deduction/substitution failed:
> <source>:16:6: note: constraints not satisfied
> <source>: In substitution of 'template<class In, class Out>  requires 
> indirectly_writable<Out, decltype(*{})> void copy(In, Out) [with In = int*;
> Out = const int*]':
> <source>:19:14:   required from here
> <source>:10:9:   required for the satisfaction of 'indirectly_writable<Out,
> iter_reference_t<F> >' [with Out = const int*; In = int*]
> <source>:10:31:   in requirements with 'Out&& o', 'T&& t' [with T = int&;
> Out = const int*]
> <source>:11:29: note: the required expression 'decltype(*{})(*o)=0' is
> invalid
>    11 |   iter_reference_t<Out>(*o) = 0;
>       |   ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
> cc1plus: note: set '-fconcepts-diagnostics-depth=' to at least 2 for more
> detail
> ====
> 
> In
> 
>   <source>:10:9:   required for the satisfaction of
> 'indirectly_writable<Out, iter_reference_t<F> >' [with Out = const int*; In
> = int*]
> 
> Note the mismatch between `F` and `In`.
> 
> GCC 10.2 prints `F = int*` instead of `In = int*`:
> 
>   <source>:10:9:   required for the satisfaction of
> 'indirectly_writable<Out, iter_reference_t<F> >' [with Out = const int*; F =
> int*]
> 
> The name `F` comes from a completely unrelated class template, but at least
> the names match in GCC 10.2.
> 
> (Interestingly, the alias template is not expanded in this line.)

Hmm, so the r11-3373 patch fixed only the printing of template parameters
within the constraint's parameter mapping, i.e. within the [with ...] part of
the diagnostic.  But as your latest testcase shows, within the diagnostic the
constraint itself could also refer to an unrelated template parameter.  To fix
this part of the diagnostic I think we would have to more generally fix PR66968
once and for all..

Reply via email to