<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/57253>57253</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
bugprone-unchecked-optional-access false-positive with absl::nullopt comparison
</td>
</tr>
<tr>
<th>Labels</th>
<td>
bug,
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
gburgessiv
</td>
</tr>
</table>
<pre>
On clang-tidy at bdb859c9a75f0e574ac877c4ca277edcc6db4e46, I believe bugprone-unchecked-optional-access has a false-positive.
```
$ $clang_tidy '-checks=-*,bugprone-unchecked-optional-access' file_name.cpp -- clang++ -x c++ -std=c++17 file_name.cpp
file_name.cpp:19:52: warning: unchecked access to optional value [bugprone-unchecked-optional-access]
return (optional_value != absl::nullopt) ? *optional_value : 0;
```
Creduce'd repro:
```
namespace absl {
namespace a {
enum au { av };
template <au> class aw {};
template <au> class ax {};
template <typename> struct ay { static constexpr au az = av; };
template <typename> struct b { static constexpr au az = av; };
} // namespace a
struct nullopt_t {
} nullopt;
template <typename am>
class optional : a::aw<a::ay<am>::az>, a::ax<a::b<am>::az> {
public:
am operator*();
};
template <typename am> bool operator!=(am, nullopt_t);
} // namespace absl
int c(absl::optional<int> optional_value) {
return (optional_value != absl::nullopt) ? *optional_value : 0;
}
```
Note that if the condition is changed to `return optional_value ? *optional_value : 0;` (and `explicit operator bool() const;` is added to the `optional` class above), the diagnostic is not issued.
cc @ymand
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VdtymzAQ_Rp42cGDBRh44CGJm5m-tJ-Q0WVtq5WBQcKJ8_VdCWzn6qYPnQEhtLezZ7WS6NSx-dmCNLzdJk6rI3AHQomqqGXNy2KTYlHmXFZlKXPJWVmiknKlRI75KmJ38B0EGo0HBDFu-6FrMRlbuUP5G1XS9U53LTcJlxKthR23wGHDjcWk76x2-oCLKF1H6c08rtL5mX5ZDvQGdA8BXcTKJHi3UbZOIkYqd38PTFaw0QYfWr7Hhex7SJIp54jd0gPJE8jT1DpFvuff5RvDCdfrpexmWdNQMBrgkQ-tJr80PcOBOX3XwQkYHLgZEaLi9gvoi_UUFmBANw4tsVCddB5mR2xJoIELayg0Pe1oDOlErIYouyf5zVsLQphG2e01-sN4N6AaJRKHiuITVh_gcyNPi-25xAAGovL23fplEdtxD3z0C8AP9FmfETnc94Y7D_SOj1H2zReMSOSPwfwrmk_XNN2xR4_J61s3jNIBPwYg1nGnJciutQ6f-sED5M8Q-D2Qr09hfuBS_LtHmlO57umBF5xNstnrXNwHd2HSW51qfg0b8D3Bm-QTTect6XcEn3YPf_RczvOjnwer6f_ZT6n1T_Kni674QPWCsR-F0fK8fYCwUHQcuOuG0MoVbdeXPHwhExBdZ1548W1AjkhGCM88vfH7Ab--cYJYt86fBdWllU4EUWwS-pivWyn02CnH_9mj5fpKm_7oiB63o-Nbb-iLfrcp7d2BtiB3dNjRSURHENnNEN9Fu4phlfqceKu8B9rFVErtzsyHOkwVnPb5bEKxuVJTZI-K1s58knjuVNEdPI2-Zl5Jab5tO-t7huzbjnKydkT16q6QEqI8Pe49ohib5WqV1llZpyxWTabqrOax085g84WL6fWVBI_a7d7XifLa93zQtmvjcTDNzrneeo2wmbZkM4oF6dCPMYfTJ6HYv1BSle9DEnQZ3RclK7J410gmhKrkSlZCbZbZZoNMLOucrfJCpWUlYsPpdrUNXRMRY5QHjZ4j-lxubL9WrGPdsJSxtFrWyzqrGFtkqtwImRcplohYF0QW7rk2C49q0Q3beGgCQPJrSWi0dfYipLrobYsYgpN_PrpdNzRbMQ5bokwf4pBOE3L5A1S7iss">