<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/142087>142087</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] error recovery not recognizing out-of-line definition
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:diagnostics
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mizvekov
</td>
</tr>
</table>
<pre>
Consider: https://compiler-explorer.com/z/eqb4oqWqP
```C++
template<class T> class A;
template<class T>
typename A<T>::Z A<T>::X = 0; // #1
template<class T>
typename A<T>::Z A<T>::X::Y = 0; // #2
```
We recognize that `#1` is an out-of-line definition attempt, and produce a sensible diagnostic that A<T> has no definition.
Now add one more component to the nested name specifier, as in `#2`, and now clang tries a name lookup into `A<T>`, and complains it can't find `X`, even though there is no definition at all.
This is otherwise a valid out of line definition for an example like: https://compiler-explorer.com/z/Wh84qvaY4
```C++
template<class T> class A {
class X {
static int Y;
};
using Z = int;
};
template<class T>
typename A<T>::Z A<T>::X::Y = 0;
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VMFu5DYM_Rr5QsxAkeyMc_DBmXSORQ8LJNmbbNE2G1lyJNnZ5OsL2bM7s0F7aNEdGNCYfiQfyUepEKi3iBUr7lnxkKk5Ds5XI30s-OKWrHH6vTo6G0ijZ7KGIcYpMFkzcWLi1LpxIoN-h98m4zz6fetGJk4fTJzwtcnd6-PrH4zX7JZvz5GJ-_TwOuI4GRWRyWNrVAjwhcnfYPtbM5kg_4RK9vcJrRoxQY-rTdZM1l8_vT8Bkw_AmbwHANg4AxPy5v-Jvh3PlySXDOK66i3bI4LH1vWWPhDioCKkT4nMLQcKoCy4Oe5ctzNkETR2ZCmSs6BiYhqZOIKyGibv9NwiKAhoAzUGQZPqrQuR2i3yd6IwqADWXQXbb2R-d2-gtAZnEUbnEdIonUUbITqIA4LFEFHD2ocwYUsdoV8pBCB75i7WY6Nl3Vuan-0hesIAavM1zr3ME5CNLjn9aOHFMaU2imwAitAqy8QhQkdWJ_zTGYgLWoiDm_sh0fOYWvZTZaAiKGPOBX4ZKCSIS-A3CqldizKkU5PBdfC5yZ3zaQT4TY2TQTD0gv9O8I9Dmb8u6jn_D4IHdkiYpNLN8nRlSb8QVRou2QjP23asij48XF7mQLaHr6saycbzDn1H_AK5X9eZ6UrqO3mnMqxuDnlZlDIXPBuqg1ZFWZa3rRQNvxOKt6JoCtnkN51sDkWZUSW4KHghOS_kgfO91Fo0WkjNsbtry47lHEdFZm_MMu6d7zMKYcbqJhe8PGRGNWjCeoEJseqPyfqyD4EJkW42XyX3XTP3geXcUIjhEjBSNOsduPkXD4DeO7_u64L-HayLP5Y3dfnvFzWbval-FkxPcZibs0pSvvOxm7z7E9vIxGmtJjBxOhe0VOKvAAAA__-A6bKV">