Open
Description
See: https://godbolt.org/z/GqbzYfa78
Related Issue: #141693
template<typename T>
concept IsOK =
[]<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
static_assert(IsOK<int>);
int main() {
}
gcc is ok, but clang gives errors as follows:
<source>:3:67: error: substitution into constraint expression resulted in a non-constant expression
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^~~~~~~~~~~~~
<source>:3:67: note: while checking the satisfaction of nested requirement requested here
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^~~~~~~~~~~~~
<source>:3:67: note: in instantiation of requirement here
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^~~~~~~~~~~~~
<source>:3:67: note: while checking the satisfaction of nested requirement requested here
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^~~~~~~~~~~~~
<source>:3:38: note: while substituting into a lambda expression here
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^
<source>:3:5: note: while substituting template arguments into constraint expression here
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:5:15: note: while checking the satisfaction of concept 'IsOK<int>' requested here
5 | static_assert(IsOK<int>);
| ^~~~~~~~~
<source>:3:67: note: subexpression not valid in a constant expression
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^
<source>:5:15: error: static assertion failed
5 | static_assert(IsOK<int>);
| ^~~~~~~~~
<source>:5:15: note: because 'int' does not satisfy 'IsOK'
<source>:3:5: note: because '[]<typename U>() -> bool {
return requires { requires <<error-expression>>; };
}.template operator()<int>()' evaluated to false
3 | []<typename U> consteval -> bool { return requires { requires sizeof(U) > 1; }; }.template operator()<T>();
| ^
2 errors generated.
Compiler returned: 1