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

    <tr>
        <th>Summary</th>
        <td>
            Clang "error: requires clause differs in template redeclaration" on out-of-class definition of class template specialization member
        </td>
    </tr>

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

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

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

<pre>
    At least with recent Clang 17 trunk:
```
$ cat test.cc
template<typename T> concept C1 = requires(T t) { --t; };
template<typename T> concept C2 = C1<T> && requires(T t) { *t; };
template<typename T> requires C1<T> struct S { void f(); };
template<typename T> requires C2<T> struct S<T> { void f(); };
template<typename T> requires C1<T> void S<T>::f() {}
template<typename T> requires C2<T> void S<T>::f() {}
```
```
$ clang++ -std=c++20 -fsyntax-only test.cc
test.cc:22:48: error: redefinition of 'f'
template<typename T> requires C1<T> void S<T>::f() {}
 ^
test.cc:21:48: note: previous definition is here
template<typename T> requires C1<T> void S<T>::f() {}
 ^
1 error generated.
```
(This causes issues with libstdc++, see <https://gcc.gnu.org/pipermail/libstdc++/2023-February/055442.html> "Re: &lt;ranges&gt; error: requires clause differs in template redeclaration".)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8lN-OqzYQxp9mcjMigjHhzwUXJDk8QLsvYMxA3Jo_tc226dNXhux2m_ZI2x71SJESE_k3H998M9I5PUzMFZzOcLoe5Opvs62cb9kOo5ymQzt396r2aFg6j79qf0PLiiePFyOnAZMcvV2nn0HUEF8hriGLH5_9SCkq6dGz80el9oeex8VIzyAu_r7wJEfGFxBfUM2T4sXjJUEQV7T8y6otO6DiBT1QiZCfMYo8iDNCfgVx_iyQNuAlAXHZ_gDKgLKvVACqP1_iDfEB7rxdlccfN9jrrDvsgQqg8j9A6Rn6_gbfzn4XvHHeyKGVon5QQ5lA_ddyP4l8jss_pCfkDOgMdMbI-Q7EVe1HijHq3X3y8rdonsz9OWT7QdREIOq0AFEjWzvb8MNyx72etNfzhHOPQHkPlP9v1iGcvvxNV_Kua5pDtRoXy696Xh1-UKcd3tjyd5CW7P7gwBNb6bk7fqUrxctNO1RydexQO7ey23eD0a3z3aM_QBd0zAjicvN-cUECNUDNoNRxmNbjbAegZtEL21FqA9Q83W8oJhE13NpV2jtQE59OaUrHmx_NPsX0w-YbUGbCyFo5DWGas2Eb4A_tfrijTBCNne57tg71hG-ObpFQRloZXAeiI1B56CrRlaKUB66SLM-oTNOiPNyqU94VqlAlc1aeRJa1-amUKpPJiVXRkzjoKmiPKRGJoISKY8ad4DzvOhWLtBQC0pjDWx-NeR2DFYfNyCqL8zg9GNmycdteJurWxWgVuk4EdAGix1BQWNq2CoSoXQcHaWy08-5PptfecLXvaiD6JkMwjMrqo7mPlJHuLyGde9yfvd92Cystjf59u44jjy3bw2pN9RQG7W9re1TzGPpvXt--osXOP7HyQM2eMKBm8-aPAAAA___IFAK9">