zygoloid wrote:

Hmm. See https://lists.isocpp.org/core/2024/06/15952.php -- I think we should 
never be comparing constraints between functions whose signatures aren't 
otherwise the same, and in particular we should never compare the constraints 
of a conversion function template against the constraints of a conversion 
function.

Conversion functions do add another wrinkle here, because we can find them in 
different scopes too. For example:

```c++
template<typename T> concept C = true;
template<typename T> concept D = C<T> && true;

template<typename T>
struct A {
  operator T() requires C<T>;
};

template<typename U>
struct B {
  operator U() requires D<U>;
};

struct X : A<int>, B<int> {};

int n = X();
auto p = &X::operator int;
```

It doesn't make sense to compare the constraints of the conversion functions of 
the two templates here, because `T` simply has nothing to do with `U`. (Today, 
Clang and MSVC report ambiguity for both `n` and `p`; GCC and EDG accept `n` 
but reject `p`.)

That said... an example like the following sidesteps all these issues and still 
crashes clang, so I think the above comments are somewhat orthogonal to this 
patch (except that I think we should have something like this as a test case 
instead of the current test case):

```c++
template<typename T> concept C = true;
template<typename T> concept D = C<T> && true;

struct X {
  template<C T> operator T();
  template<D T> operator T();
};

auto p = &X::operator int;
```

https://github.com/llvm/llvm-project/pull/98671
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to