<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63464>63464</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] readability-const-return-type conflicts with cert-dcl21-cpp for postfix operators
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ecorm
</td>
</tr>
</table>
<pre>
[`cert-dcl21-cpp`](https://clang.llvm.org/extra/clang-tidy/checks/cert/dcl21-cpp.html) wants postfix increment/decrement operators to return a `const` value, because otherwise:
> any modifications made to the resulting object from calling operator++(int) would be modifying a temporary object
But [`readability-const-return-type`](https://clang.llvm.org/extra/clang-tidy/checks/readability/const-return-type.html) prohibits returning `const`value types, because
> Such use of _const_ is usually superfluous, and can prevent valuable compiler optimizations.
The `readability-const-return-type` check should be relaxed for postfix increment/decrement operators, because avoiding bugs should take precedence over a minor readability warning.
Example program:
```c++
struct Foo
{
int value = 0;
};
struct Bar
{
// warning: overloaded 'operator++' returns a non-constant object
// instead of a constant object type [cert-dcl21-cpp]
Bar operator++(int)
{
auto temp = *this;
++foo.value;
return temp;
}
Foo foo;
};
struct Baz
{
// warning: return type 'const Baz' is 'const'-qualified at the top
// level, which may reduce code readability without improving const
// correctness [readability-const-return-type]
const Baz operator++(int)
{
auto temp = *this;
++foo.value;
return temp;
}
Foo foo;
};
int main()
{
Bar bar;
bar++;
Baz baz;
baz++;
return 0;
}
```
Godbolt demo: https://godbolt.org/z/E64zeKvzr
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk2T4jYT_jXi0gVlZLDhwGF4Gd5Djsl9qy21sbKy5egDBn59SrJhDJtsTaqSLWrHllr98TxPt4zOqVNHtGPrPVsfZhh8Y-yOhLHtrDLymjaKTJD1cyk0X85F37MiY-sD45vG-96x_I3xI-NHobE7LbQ-twtjT4wf6cNbvG_MvZLX-NKQ-O7iA1nP-PHhddH4VjO-hQt23kFvnK_VB6hOWGqpS7Y0PoPpyaI31oE3YMkH2wFCzNR0zrMigzPqQIz_DyoSGByB8Q3Zi3IUE84OLLv_n78DdldojVS1EuiV6Ry0KCn69g2BJRe0V90JTPU7CQ-1NS0I1Dqtjakwvk-_jYq5buFigpZQ0eD4Gk0RPLW9sWivo6tpIvvgYYDbEkqslFb-Ok8FzYcS5_7a07-D_iREXH4N8iCjt6ZRlfJuRDmWMYE5oQzxhJtg_Qrvr0E0kDio4Vs6-g2Ug-ACan0FF3qytQ4mJCfYSRDYQW_pHLmOMbDSBMK0vdJkwfReteo2ULWYRvutIfgCgJBwANfcObKk8YMk1MZ-VXlTbeHZKBmhqcLJ3d16_E6xCEGSOkFgzmQBoVWdsTDJEC6YcH0q5P0D217H8-ZksX3VbJENPzGqLq06b4PwcDRmtCrHDQAANSJJwPIDZCzf340On89TN3u0f-FmENs9ZZa_pbK0QUkSGC9fu6EcdeMAoTPdwAZGHCf6nzhWnfOEMioF4cU46Sy2yMs4Wh8-3ezR_l1HTmJNK4r_MMRWp7ZP4DD-5hvlHrDcrQZ_tTGLYbi87o9zKPp52osQT_CNBEFtzFcouH2JgnvgBA8vE2zpMC9jn92XGC_nfwTUqlYkAX0abt70P7jWdCYd9X1plGigxStYkkHEFpT0rF3lGxM8qLa35hxbYAj16lIYa0n4jpyLDP68QaeEPor5J7T-h3y-kgnwBT5j87WoOsY3j4yfOI2yrdB-hokvQ535k9kNKrw9rcX3Hy3H3J_7_Hl2TBP8v5GV0R4ktSYq6vluOQ2748VyY_z4Xqxu9Mv5Zmdyl8ttvsUZ7ZbFplxtt3xTzJrdUmBZ55uyKuWqXubE83or83Ip80qgpPVM7XjG86zgebZebbJiQaJellmGxbLebIu6ZquMWlT6canNlHOBdkW-KlYzjRVpl75POO_oAmmTcR6_Y-wunpnHacxWmVbOu08vXnmdvngmN-P6AD-VZJRhrZXwLikenifQ07XxuCBmwerdC5DKN6FaCNMyfowJjX_mvTVpHPJjKiPe0KnMPwMAAP__X7b6bA">