<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">