<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/101330>101330</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang rejects valid friend template function declaration with noexcept specifier in template class
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Rush10233
</td>
</tr>
</table>
<pre>
The following code is rejected by clang for the mismatch of the `noexcept` specifier between the friend declaration and definition of `func`:
```c++
template <typename T>
struct C {
template <int N>
friend void func() noexcept(N == 0);
};
template <int N>
void func() noexcept(N == 0) {}
int main() {
C<int> t;
return 0;
}
```
The diagnostic says that:
```c++
<source>:4:17: error: exception specification in declaration does not match the previous declaration
4 | friend void func() noexcept(N == 0);
| ^
<source>:11:12: note: in instantiation of template class 'C<int>' requested here
11 | C<int> t;
| ^
<source>:8:6: note: previous declaration is here
8 | void func() noexcept(N == 0) {}
```
That is quite unreasonable. It should be clear that the `noexcept` expression of `func` keeps identical between the friend declaration and definition statement. Removing the dependent name `N` in the `noexcept` expression or replacing template class `C` with a non-template one can eliminate the diagnostic.
[https://godbolt.org/z/rPh84Phzn](https://godbolt.org/z/rPh84Phzn)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVV9vozgQ_zSTl1EjsCGEBx7apJHupVqt9gsYMwTfGZu1TbrdT3-yk6Zh29X17qIIMMyf38_z84zwXh0NUQPlA5T7lZjDYF3zdfZDnjHOV63tXppvA2FvtbbPyhxR2o5QeXT0J8lAHbYvKLUwR-ytwzAQjsqPIsgBbZ_WsMmMpR-SpgCbDP1EUvWKHLYUnolMMuqdItNhR1ILJ4KyBkVa98qotLR9jNTPRsImA34P2R6y1-smO_8lsIf4T28DjZMWgRD4LrxMZMRI-A344_mzD26WAXcI1cUBEfHWSZmAT1f7-PUC82RVhwkK2wKr8cqPbZ8Q-B74HjNgNfBLZKj2b8_vwC3zfDZ4wl3tb4PGQKNQ5uK5ILY7JwL-iOGKJX5wFGZnMFuAXW7reRmF0ClxNNYHJdGLF49hEOFTxQC-83Z2kiJPfl8Av88r4PdIzlmXHhLLWOqLRORZB8osZNFZ8mhsJBpFFsUzOTopO_tbuzd-BUK1w_9TveR8jXL7g_LxQ3p5Hi8s0jI2ULyryMQHYYISr4K-ikBq4T0Cq96qBKxCR99n8vGUDeToCibPE5jfVvQd1t_B3AK_39yC_Ggn42lfpMdtiv_fdLqU1KuwRIhZvs8qEM7GkfDWiFbTGv8I6Ac76w7buE0kXNLcR52FfkyOvH_XLPAvosmj6sgEJYX-l43HBxFoJBPW-JVGe4pdMHp2NJGJMTE1FthkTzGZMv-EzaGjSQuZAv2igE22i-bPKgwo0Fhzd7WwhlAKg6TVqEx8ExYHco2LU1g-DCFMPh5OdgB2ONqutTqsrTsCO_wEdnBfhm3xZfhpoNwD237enNWrruFdzWuxoiavGCt4VlVsNTSbXJRUbHpWdLXoWN2XQsq6kGVb96zb9ivVsIwVWcXznJU1Z2tq623GZJeXdV90bQ9FRqNQeq31aYzpV8r7mZo8yznPVlq0pH2aWIylwQOMxeHlmuhw185HD0WmlQ_-LURQQVNznlPnyeXxJHQU8Ln-112Omjn3mRtFpHK8lvNmgsVaLwq4mp1uftlIFYa5XUs7AjtEQJfb3eRsBALskAh6YIcLx1PD_g4AAP__AptR1A">