<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/71684>71684</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
"is not a structural type" should be a substitution failure
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ecatmur
</td>
</tr>
</table>
<pre>
On CE trunk 20231108 18.0.0 (https://github.com/llvm/llvm-project.git fb07d9cc096f4a0c2473dee064c427edc2a83157):
```c++
template<auto> struct test {};
template<class T> concept structural = requires { []<T x>(test<x>) {}; };
class C { int i; };
static_assert(not structural<C>);
```
(reduced from https://stackoverflow.com/a/68856187/567292)
fails with hard error:
```
<source>:2:56: error: type 'C' of non-type template parameter is not a structural type
2 | template<class T> concept structural = requires { []<T x>(test<x>) {}; };
| ^
<source>:2:51: note: while substituting into a lambda expression here
2 | template<class T> concept structural = requires { []<T x>(test<x>) {}; };
| ^
<source>:2:51: note: in instantiation of requirement here
2 | template<class T> concept structural = requires { []<T x>(test<x>) {}; };
| ^~~~~~~~~~~~~~~~~~~
<source>:2:40: note: while substituting template arguments into constraint expression here
2 | template<class T> concept structural = requires { []<T x>(test<x>) {}; };
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:4:19: note: while checking the satisfaction of concept 'structural<C>' requested here
4 | static_assert(not structural<C>);
| ^~~~~~~~~~~~~
<source>:3:15: note: 'C' is not a structural type because it has a non-static data member that is not public
3 | class C { int i; };
| ^
1 error generated.
Compiler returned: 1
```
Previously (13.0.0 through 17.0.1) this was a substitution failure, which I think it should be.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVk1v4zgP_jXKhZjAlvx58CHjNsB7evcw9wUt07G2tpWVqHZ62d--kN00nWmD2bksZoXAgQSRfB6SIonem9NC1Ij8s8jvdhh4tK4hjTwHt-ts_9z8f4H2HtiF5QFkIlWaJhWk1T7ZJyBkNTKfvVAHIY9CHk-Gx9DttZ2FPE7T4-Xv09nZP0jz_mQYhi4p-1rrpC6GDBMts1L1REmR6UyW1GuJlUrzUsg6Kk7uRHIQRbL9tJCf4289ZZrPEzIJ1WJgK9Q9eHZBMzB5BlF-FuWdUO9v6wm9hy9RQNtF05lfBIPDCYS6A0d_BuPIRyWwuUeo9gt8FepeyCrqF6rddvXVErw1uFlpVxVmYTDfX_CMbPTv6D05FrJa7FscQrXtpv9V4NUNL1tZOeqDph4GZ2f4NhieUT_YR3LDZJ9eYoJCHouqyou0KoU85kUpaxktbPrW74Bm8vBkeIQRXQ_knHXvI_GyVa23wWmKSNVBCnXIC6EOr1LAz2cCIctWyBLsAItdPq1nl3jAGR3OxOTAeIg-wLfRiHc3WwAAEkTZwr8eSlhXNC3y-9vM00h4sRHYAZ5GMxH40Hk2HNgsp5gFFhAmnLsegb6eHXlv7AIjuf8mSbOAWTzjwgY5MrHDBctMC_-CxP56t25SzZIfxPM1hdGdQuTrtxBru3h2GB_9x0H-NR3xD9ySCXVI6_du0SPph9UlI4FHNn5AfUmICyMhyw_KW7lSI8_Uf5cu2Qr1p6vkTZYfMlKRUf6W0aVY3apG0JHG4AkMw4gecK1pG0zokRFmmjtywCPyRcs5dJPRV4BqBfjDFnHl8u16faHpVmnhRAs5ZOr323lr57OZyIEjDm6hPjJLP67h6_c3R4_GBj89x76eqrXD8-hsOI2Qlvtkn8bE4tF4eFpZX5-CXSB2jeBIyDZmhB7hf_Hq8hCd5Ecbph462u_6RvW1qnFHTVrUdZarOle7sZGlrqq0ShElZkM3SK2SATulEl2h0unONJfpI82UVGpflHlR6apKVJEMucpFltCMZtrHgWNv3WlnvA_UlGlRZbsJO5r8ZdBxzTqVdOHkRZZMxrO_irHhiRoh5c1uJOWV0g0_7IKbmp8bjoQ8roi9kMcV9N8BAAD__xAu5yo">