<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">