rupprecht wrote:

I bisected a build failure to this commit. I can't figure out if it's expected 
or not. I minimized it to this:

```c++
#include <concepts>

enum class KindEnum {
    Unknown = 0,
    Foo = 1,
};

template <typename T>
concept KnownKind = T::kind() != KindEnum::Unknown;

template <KnownKind T>
struct KnownType;

struct Type {
    KindEnum kind() const;

    static Type f(Type t);

    template <KnownKind T>
    static KnownType<T> f(T t);

    static void g() {
        Type t;
        f(t);
    }
};

template <KnownKind T>
struct KnownType {
    static constexpr KindEnum kind() { return KindEnum::Foo; }
};
```

gcc accepts it. After this commit, clang rejects it:
```
<source>:9:21: error: substitution into constraint expression resulted in a 
non-constant expression
    9 | concept KnownKind = T::kind() != KindEnum::Unknown;
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:19:15: note: while checking the satisfaction of concept 
'KnownKind<Type>' requested here
   19 |     template <KnownKind T>
      |               ^
<source>:19:15: note: while substituting template arguments into constraint 
expression here
   19 |     template <KnownKind T>
      |               ^~~~~~~~~
<source>:24:9: note: while checking constraint satisfaction for template 
'f<Type>' required here
   24 |         f(t);
      |         ^
<source>:24:9: note: while substituting deduced template arguments into 
function template 'f' [with T = Type]
<source>:9:24: note: implicit use of 'this' pointer is only allowed within the 
evaluation of a call to a 'constexpr' member function
    9 | concept KnownKind = T::kind() != KindEnum::Unknown;
      |                        ^
1 error generated.
```

Live link: https://godbolt.org/z/oGh319a44

Is this sort of breakage expected?

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

Reply via email to