<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/114069>114069</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang] Class fields with placeholder names cause incorrect instantiation of in-class initializers
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          groundswellaudio
      </td>
    </tr>
</table>

<pre>
    MRE : 

https://godbolt.org/z/Mjdnz8G31

```cpp
#include <cassert>

template <class T>
struct A {
    T _ = 5;
    T _ = 4;
};

int main() {
    A<int> a;
    auto [x, y] = a;
 assert( y == 4 );
}
```

`assert( y == 4 )` fails because Clang finds the in-class init pattern like this (in Sema::BuildCXXDefaultInitExpr) : 

```cpp
CXXRecordDecl *ClassPattern = ParentRD->getTemplateInstantiationPattern();
DeclContext::lookup_result Lookup = ClassPattern->lookup(Field->getDeclName());

FieldDecl *Pattern = nullptr;
for (auto *L : Lookup) {
  if ((Pattern = dyn_cast<FieldDecl>(L)))
    break;
}
```

Obviously this cannot works with `_`. I think to remedy this imply keeping track of the pattern of an instantiated field with a placeholder name in some auxiliary structure? The entry would only need to be temporary until its consumed by Sema::BuildCXXDefaultInitExpr. 

Also I think a warning should be emitted that we're using a C++26 feature before its time? 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVU1v4zYQ_TX0ZRBDoixbPujgj7hYINsutjnkFlDiyOKaIgVyuI7z6wtKWsdOW7RAwNj0zLx5855Gwnt1NIgly7cs389EoNa68uhsMNKfUWsRpLKzyspL-fX7I7BsAyzZs2Qzni1R71m2YfzA-OFoZWU1za07Mn54Z_zw9Yc078VvWXqbxJbJ-Ff3_XTDM2VqHSQCy3a18B4dsezxNouw67WgMUIL7-H5GuHJhZpgA2y1HW8AAJ7hFVi2h5xl_3C7uN6y1f7j83AqQ9AJZRgvGF_fV92wbKdM7A7EXWERyALLt2-M7-DC8v0AcxMz0eIFXOJPQxPA-PqukfsJfRrbv1ZYJtAIpT1UWIvgEXZamCM0ykgP1CIo8zAOTRlF0AsidAa0OiFQqzwwXigDf2InoprZZhuUlruXlz02Imj6YhQ9vvVumMYnD_xdzt3Ly3esrZN7rDUwvtlF6G8TaOz6m3Bo6Pv-gWWPR6TnSdsvxpMwpAQpa6b4UYPrjGLJnTWEbzR2qq09hf7VoQ-a4Gn4NmDcgkacMZDx4qBQywk5lvtddDih3IoxnEPsLxq3DEzQuid3DW-si0McTcA3T8OYnibIOwupBga04racvJjXWnhi2e4KGe3Ni6epL77-sFrlUJz-p23-qH4qG7y-jELXwhhLcLbu5OGsqAW2TF7ZMpnDlxhhTkAWHHYopwzV9foCJ8RemSOQE_UJbDO46pePbAPCgLqqhxKayGIEENBrUWNrtUQHRnTRjuBthyDCm9JKuAuMj3BwyLIDPLcIaMhd4GyDlmCNvoBBlLG3CiHuAutiWjCkNCjyUFvjQ4cSqst_-3h-5-CN9vbKXsBZOBOp-nYArxCwUxRJUSsIzsj4yiEEH4ME7BjfMr7lS2hQRAZQYWMdDl2R6gZGM1lmcp2txQzLdJUlPF2kBZ-1Jc9lI1dYiHWRJkuxrqtFLatllckckaeLmSp5whdpwtdpnmRJOuc8X6JMV3lRrXhTr9kiwU4oPdf6Zxd370x5H7BM00WyXM-0qFD7YcNzXse1wDiPy96VMeGhCkfPFolWnvxHCVKkh9fCmJFPj9Mo62Scz6pGc8Xdo0xtncOabhyh7OCSuzWkhFbv6PwsOF1-epMoakM1r23H-CE2Nf176J39gTUxfhhIesYPE8-fJf8rAAD__2pGFW4">