<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113511>113511</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang doesn't equate __attribute__((noreturn)) and [[noreturn]]
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
aoates
</td>
</tr>
</table>
<pre>
When `__attribute__((noreturn))` is set on a function pointer, a function marked `[[noreturn]]` cannot be assigned to it.
Original context on gdb-patches mailing list (https://sourceware.org/pipermail/gdb-patches/2024-October/212507.html)
Example:
```
typedef __attribute__((noreturn)) void (*noreturn_ptr)(void);
__attribute__((noreturn)) void function_attr1(void);
[[noreturn]] void function_attr2(void);
void function_noattr(void);
void test(void) {
noreturn_ptr fptr[3];
fptr[0] = &function_attr1; // OK
fptr[1] = &function_attr2; // Should be OK? But is error.
fptr[2] = &function_noattr; // Error
}
```
Compiling:
```
$ clang -c -o /dev/null noreturn_test.c
noreturn_test.c:11:11: error: incompatible function pointer types assigning to 'noreturn_ptr' (aka 'void (*)(void) __attribute__((noreturn))') from 'void (*)(void)' [-Wincompatible-function-pointer-types]
11 | fptr[1] = &function_attr2; // Should be OK? But is error.
| ^ ~~~~~~~~~~~~~~~
noreturn_test.c:12:11: error: incompatible function pointer types assigning to 'noreturn_ptr' (aka 'void (*)(void) __attribute__((noreturn))') from 'void (*)(void)' [-Wincompatible-function-pointer-types]
12 | fptr[2] = &function_noattr; // Error
| ^ ~~~~~~~~~~~~~~~~
2 errors generated.
```
This seems incorrect --- clang should treat `function_attr2` the same as `function_attr1`. As a point of reference, GCC does this (it allows the assignment in the second line).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkVj2TozgT_jVy0gUlhDF2QDD2DG-wwQTvVW04JaBtdAsSJzWzu8n99qsGfGN7PbtzwUVHURjT3U9_PV0tHYI5WcRCZHuRPa70SK3zhXaaMKwq13wvPrdoQWzky4sm8qYaCV9ehNoKtbXOI43eCrXjeyPBBAhI4CxoOI62JuMsDM5YQi_U4fJrr_0XbBh58r3_Gyx75HsjodbWOoIKYQmzAXJgKBbyUciH-fnszclY3UHtLOG3yfepqaJBU91igF6bztgTdCYQCLVtiYYg0gehSqHK4EZf41ftMXb-JFQ5mAE92whVXsAIVSqp1tFzTa7iVEqVqEzmcUt9x7lfRPT0TfdDh-xj_rqRyz39pe8DNniEX9YTXp1pYJI8nCUvA_lJumUhv6X7S98fBD03YdJO7qHdackdU3XH9FrLOtZ7N95JmTDQmwaIfFEBuEwbjpx7tk85mmsUOMskhynSRxBqc5NjugeAuenw_OnGLnnPTl3Z_b91Y9cwIZ8_ibQE2I_ElEfvnY9vMNU9zKUcDLpgPrHtkkz-eJcx8_Pg-mGi8hux7iqrNdSdtieIaogcu2nwVajSjl33VlCueVzPJrcf04ckOT_m3PjF2Nr1gyZTdfjDbAOzOixzyuNG7Dm_pm3OZNZfNEsuuH3F51-PhVA56x29638GNLnL9tHny7ijc9zREnc0xc2MWpoHSQIiP8C_Qw2-ZvTzJbIn-PP6ercp6r_bFHXdlH8-Wx-s_VJ8NVc4wAktek3YxD-ZzN_aae1hH6Z-eI81QRRFyxyGmRrkUROvuxsWbSRQixB0z3vuB4VEbGQM8BBAz30FdwSPR_Roa-Sd-r_DARqHAYjjEGprCHTXua9hAp7b36MlMHZ2hbWzDXTGolC7eNUUabNLd3qFRZKrXZ5KtclXbZFgs9uuN_Va7upjpfI0W--a5qgTmeFuJ6uVKXgpJlKtpUzzdR7nSm3WaZPVWSNVtdViLZGXadx1rz1v2JUJYcQiSdIsSVadrrAL09lDqalYQnFrV75gg6gaT0GsJa_u8AZBhjosDlNtOW8rVE6Af4ya8ANbVdsG7q231ei74vp0cDLUjlVcu16okv0vP9Hg3e9Yk1DllA8fD5aUXgv1VwAAAP__ulDc9A">