<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/90177>90177</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
CTAD: incorrect transformed require-clause for the alias deduction guide
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang,
c++20,
clang:frontend
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hokein
</td>
</tr>
</table>
<pre>
Example:
```
struct Key1 {};
template <class Key>
struct Foo {
Foo(Key);
};
template <class D>
constexpr bool C = sizeof(D);
template <class Key>
requires (C<Key>)
Foo(Key) -> Foo<Key>;
template <class T>
struct HasTemplateParam {
template <class Key>
using Alias = Foo<Key>;
};
class Forward;
struct Test : HasTemplateParam<Forward> {
using Foo1 = decltype(Alias{
Key1(),
});
};
```
clang rejects the above valid code with the following diagnostics:
```
<source>:9:20: error: invalid application of 'sizeof' to an incomplete type 'Forward'
9 | constexpr bool C = sizeof(D);
| ^~~~~~~~~
<source>:12:13: note: in instantiation of variable template specialization 'C<Forward>' requested here
12 | requires (C<Key>)
| ^
<source>:12:13: note: while substituting template arguments into constraint expression here
12 | requires (C<Key>)
| ^~~~~~
<source>:23:25: note: while checking constraint satisfaction for template '<deduction guide for Alias><Forward>' required here
23 | using Foo1 = decltype(Alias{
| ^~~~~
<source>:23:25: note: in instantiation of function template specialization 'HasTemplateParam<Forward>::<deduction guide for Alias><Key1>' requested here
<source>:21:7: note: forward declaration of 'Forward'
21 | class Forward;
```
It seems to be an issue in the transformed require-clause for the alias deduction guide. The require expression should be evaluated on the type `Key1`, rather than the outer type `Forward`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysls1yozgQx59GXFRxQcvm48DBwXbt1l72kBcQojHakSWvJJKZOeyzb0lghyTOx2wtRZGAWupf_9XdMndOHjViTTb3ZLNL-OgHY-vBfEOpk9Z0P-r9d346KyRsS9IdSS_PPJ3v-Oq8HYWnf-CPjFJS3JNiR9j9coLH01lxj5SwRijuXDAmbP9i_sGYODt-C28EymAG1fNqX1h5d11XGO08fj9b2hqjaEMJ21Enf6LpCZS7Fwt_AZNSi3-P0qKjBMqGsGYehWoyWCLTO8L2MYir2We-Hl4L8ht3D7PVn9zy00Kdz0hHJ_WRbpXkLkZ9G-SNmtNSB2OfuO2uYzPOAzpPCdu-4SKsuU7ZLyBnioMxWYToUCj_44wEyki2sKQxewiUQUxoLp8D4Xvb_zIHr_z6SC3-hcI76gekvDWPSB-5kh0VpkP6JP0QR3qjlHkKgJ3kR22cl8J9nOiENc6MVmBUcVsRtoU0KILWGhv-kXpyxc9nJQX30mhqekqguORdQb2hXFOphQml5ZEGTYLJRUQo5vgrSoqG_kIa03iFSWSz_2e-brJnEB4sMGvjcWKnUjvPtZdX8EduJW8VPiecO6OQXMmfkw2Bonmx_yHCUCfoPHZ0QItXtAwi2qd1NFs9X2Sz_2oQT4NUSN3YOi_96MP2XtG5PY4n1N5Rqb2ZdLVcak-DuuhcCOh_I35fewjEsHmLLQYU3wLyAs1xL13PRVS7N3ZR-lAQ1nTYjdPgcZQdRpOpuoKvGxsj7et9ATbz_0q9vkizr4Z5K8X6UU_8H6TYhx0n1Gy4P5Midpj3E_Q1fUbYtljC95PHKAu3y9p-U7iQTZV7s53e7Fy_e-oQTy50hxZjg3BuxKBYaFbecu16Y0_YXTbxTig-uinK2Olis3-lwYo-DHiZsUxzN5hRdcEVPnI18qCF0XRyFvtRnkbB8pRAQy33AwY_fOIxow-vs-ElwjxdTdEkXc26ilU8wTorsnWWVUXFkqFO225diarMKlEVIhdViXmVtriGLMV1kSayhhTW6RrytASWsVWel3nWll0P0ArWA1mneOJSrZR6PK2MPSZRqLpKs6JIFG9RufiDBiCeBgQgHCgAgsA9gXtIn7_EcbbtrdEedRcGNrvE1mHpu3Y8OrJOlXTePTvz0iusm4ftbspnYaxF4f_zBiWjVfXg_TkePXAgcDhKP4ztSpgTgUNwPP-5O1sTDjYChxiyI3CIUf8bAAD__wMf9dI">