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

    <tr>
        <th>Summary</th>
        <td>
            Concept-constrained non-type template parameter pack in a member template of a class template causes a crash
        </td>
    </tr>

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

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

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

<pre>
    Simple code to reproduce the bug [https://godbolt.org/z/97PKnxeqP](https://godbolt.org/z/97PKnxeqP):

```cpp
template<class T>
concept IsFoo = true;

template<class>
struct Struct {
 template<IsFoo auto... xs>
    void method() {}
};

template void Struct<void>::method<>();
```

The crash happens on all currently available versions capable of interpreting constraints.

The actual template parameters of the template installation do not matter, I have chosen the simplest ones.

The code is interpreted correctly by the latest [GCC](https://godbolt.org/z/z7McMjzrj) and [MSVC](https://godbolt.org/z/968W13hEq).

---

A very similar code with equivalent semantics that doesn't cause the crash [https://godbolt.org/z/efG5cnqMn](https://godbolt.org/z/efG5cnqMn):

```cpp
template<class T>
concept IsFoo = true;

template<class>
struct Struct {
 template<auto... xs> requires (... && IsFoo<decltype(xs)>)
    void method() {}
};

template void Struct<void>::method<>();
```

The above example could lead to an assumption that the crash is caused by `IsFoo auto` simply appearing in a parameter pack, but that does not seem to be the case as the following simplification of the code, again, is interpreted as expected [https://godbolt.org/z/eYE995q54](https://godbolt.org/z/eYE995q54):

```cpp
template<class T>
concept IsFoo = true;

struct Struct {
    template<IsFoo auto... xs>
    void method() {}
};

template void Struct::method<>();
```

---

The following example demonstrates that bug is not limited to methods [https://godbolt.org/z/GxKd85r7c](https://godbolt.org/z/GxKd85r7c):

```cpp
template<class T>
concept IsFoo = true;

template<class>
struct Struct {
 template<IsFoo auto... xs>
    static constexpr int field = 0;
};

template constexpr int Struct<void>::field<>;
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVl9vo7oT_TTOyygRMfkDDzy0SVOtVpVWavX76T4aewjuGpvaQzbpp78ypKXt3V5F92FVKQpgPGc8nnMOFiHovUUs2PKaLbcT0VHtfPGovf5psDWT0qlTca-b1iBIpxDIgcfWO9VJBKoRym4PbHldE7WBpVeM7xjf7Z0qnaGZ83vGd8-M7_L1j-_2iE8_2HLLeHb5dJ7HacmWJS__q2T4ybYdRgib1ghClm6kESHAA0tvhlfSWYktwbewcw5YugXyHbL0-i3ix_jX6EC-kwT3w4Wtz1HwJmAAFh252WwGxzEWAODgtIIGqXaK8YzxvMdYb8_J19tPFjIEDmlZuolPETe9YunVGS7dxJEedAR52Zm3mA81gvQi1FCLtkUbwFkQxoDsvEdL5gTiILQRpUE4oA_a2QBStP2Aq0BbQt96JG33IJ0N5IW2FGYfswhJnTCvmwOt8KJBQh8iTOTK6yttAwljBGlnQTmwjqARROgZ38A3qMUBQdYuoO0DQ8_AQOAs_jNxT0wdxpWiAum8RxmrK089RMwbKFL1drO5jITP6zt59_jsH2PnhFUx-O7-fxdG56vs__O0vnliPH-35Ol0-vbxKu76KZaojfBDMb801YBPnT4Ig5YgYCMsaRmAakGgHAbL-JpAii4MOhx6fIESsbpdSvt0Zy8rY5z-xZX4ToPg4-55DMB4FkcZXzG-GrKzdKNQGjq1yHh2DH1lN_H_yylXlO6AgEdxduDOKDAoVPRhYUGE0DVtr6KeGCMRdBi4oSL_2SoZfYqtkkFPJ4iGIHzUtbYgRsFCK-TPqMSyo5FxvUoDYhOTl2fWiYAgQn9fOWPcr4jWw-tKy0HgZ_VHZkdQsRfaxpsPkhUB8NiijPeX8PivmzxfPi0XF_L4dfof4PFndAX4w9-O_8K7D_708K61L1RU2AyfAsKzKcWDgB5IYnSjYxfJnSsIlzT09vhdZUu_lpc1dJz-xY3pX9scSJCWw3cVj62PioBKo1H9UpJxHZ93_H3w782nhzxz4JPuT1SRqjzNxQSL-SrL-TxJsmRSF1W2qJJEZhVXc55XSq1WmKl0vpYZr8rVcqILnvA0Wc_TZJ7MeTIr54usWuSpStZKpTlniwQboc3MmEMTezjRIXRYrNIsXU-MKNGElzOoL-KkadntA1skRgcKYxhpMlhshpZNX08jqMA6O42O_pvzR29ng8U12JToxzmuAgEDI8btjL4Z4nh00knnTfGBi5rqrpxJ1zC-i0s7X6atd48oifFdX15gfNdX-HcAAAD__5vRgjc">