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

    <tr>
        <th>Summary</th>
        <td>
            Clang incorrectly parses template type parameter as a concept name
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    When specializing a class from another namespace, if a type parameter has the same name as a concept in that namespace, Clang mistakenly parses the type parameter name as being the concept name.

For `m` below, the specialization is in the same namespace, the bug does not occur. `MTypeParam` is parsed as the type parameter.

For `n` below, the specialization is outside of the namespace, and `NTypeParam` is treated as the `n::NTypeParam` concept instead of the specialization's `NTypeParam` type parameter in the function parameter list.

https://godbolt.org/z/47ahesrbn

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

namespace m {

template <class T>
struct M;
template <class T>
concept MTypeParam = true;

template <C MTypeParam>
struct M<MTypeParam> {
    static void f(const MTypeParam&) {}
};

}

namespace n {
template <class T>
struct N;
template <class T>
concept NTypeParam = true;
}

template <C NTypeParam>
struct n::N<NTypeParam> {
 static void f(const NTypeParam&) {}   // error: expected 'auto' or 'decltype(auto)' after concept name
};

int main() {
 m::M<int>::f(2);
    n::N<int>::f(2);
}
```

Broken on Clang 16 and HEAD.
Works on GCC and MSVC.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUlUGPozgThn-NuZQmIoYAOXBIk8n3XTpaaUc758JUgqfBRraZ2Z5fvzKEBrLpVq8UJQpl3nrqdbmM1sqrIsrZ7ontjgH2rtYmr1Dhy4-g1NVr_r0mBbYjIbGRv6W6AoJo0Fq4GN0CKu1qMqCwJduhIMYLkBdAcK8dQYcGW3JkoEYLriaw2NKwGtB6Ka0EdQ6kAlejW-sUDaortNI6fCHVvHo5S6POnfykWJJH9AsmZR_ZsPDIwsP4fdIGWBK2LAmhpEb_8qkGtKlKdFIrkHakWjC_kfmnZX-FSpMFpR1oIXqz8brP3147-sOD-QTSjtAV4CPuR2DqE2C6d1ZWBPoyLFixoaq8zPmewxlCN4MMmaIDiw7rlfOOWEdYTSnWDIyn9t9J7vbk5t6lV2LgniONtG5Veu1cZz0NPzF-uuqq1I3baHNl_PSb8VOcYk3WlGr5EkvC8SO6bnziqO0adAQsKsYm_cair2NsqqsAFh3BmZ5Y9LSUezMRWmDpKvSRrnWmFw6e39Q-AzE3yXs0S5Visf5B3mIVndkBAKxDJwX81LKCC-OZ0Mou0zOeML4f3kmPt_zp8Y5lDt0ZpeZkn7Do_J8sOn9k0Rpo7dX5Xa-mfmdRcX7Hssd-nR_7BQBjwwIZow2LDkB_dyT8KWM8xd5pxlPwx5qnFYnGHxDGszGw9zG8-POwnFXvbYJUDlqUivFsIhiR27Eq3whSOV_z8N_Tc58lWrTDwoEP184GT2dsifJk9Asp0Oo2obfJMHT-__VwvJ3q79q8WL_gf8U4kJ7__Ku4xYIqj6p9tMeA8m2yDzlPeJIFdY6i2qbbjCjZ7cSu3EZZll2qXRxXUZQmXAQy5yGPwpTH2_02jbNNHO0JMUsoEVklMs7ikFqUzaZpfrZ-fATS2p7yJA4zHjRYUmOHu45zRb9gCDLO_dVncv_Ol7K_WhaHfkDZWcVJ11A-FiuV0MaQcIv7aOq_uwG4uuH83ga9afK7WSdd3ZcboVvGTz7h7edLZ_QPEo7x04BpGT8NZfwTAAD__2kLX8w">