<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/126283>126283</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] `bugprone-unchecked-optional-access` false positive when analyzing optional field of object accessed via chain of getters
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-tidy,
            false-positive
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          BaLiKfromUA
      </td>
    </tr>
</table>

<pre>
    ### Problem

The next code snippet:
```cpp
#include <optional>
#include <string>
#include <iostream>

class A {
private:
 std::optional<std::string> d_field;

public:
  const std::optional<std::string>& field() const {
        return d_field;
  } 
};

class B {
private:
    A d_a;

public:
   const A& a() const {
 return d_a;
   } 
};

void foo(const B& data) {
    if (data.a().field().has_value()) {
        std::cout << data.a().field().value();
    }
}
```

produces a false positive warning from clang-tidy:
```
clang-tidy (trunk) x86-64 clang 18.1.0 (Editor #1, Compiler #1)
-checks=bugprone-unchecked-optional-access
[<source>:27:22: warning: unchecked access to optional value [bugprone-unchecked-optional-access]](javascript:;)
   27 | std::cout << data.a().field().value();
      |                      ^
1 warning generated.
```

The next workaround could solve this issue:
```cpp
void bar(const B& data) {
    const std::optional<std::string>& field = data.a().field();
    if (field.has_value()) {
        std::cout << field.value();
 }
}
```
But it is easy to forget it, especially if such pattern is frequent in the codebase.

[Compiler explorer link](https://godbolt.org/z/P1bafhraa)

### Similar issues

I've checked existing open issues and one is similar-ish to mine -- https://github.com/llvm/llvm-project/issues/93194

Seems like it is fixed now and I cannot reproduce it on my side. I assume that the bug is connected to the _"chaining"_ of calls.

[Compiler explorer link](https://godbolt.org/z/hKoG9bM8a)

------

**I am happy to contribute the fix to this issue if someone could give me initial suggestions about a proper solution and possible places to look** :)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVlFv2zgM_jXKC5HAkWs7echD0iyHYnfAgN09F7RE21plySfJWbtff5DlpN3a4oZhgtDGokV-JD-SRu9Va4h2rDiw4rjAMXTW7Q74p_rYONv_s1_UVj7tGM_Thk_O1pp6lu1Ztv-7IzD0GEBYSeCNGgYKLI8iVmZpi2GIjzxXRuhRErD81g5BWYOa5R9eyXxwyrRvSZT1wRH2syzbC43ewx5YdWDZfnDqjIGSefBBxl_5_tnW7fXsagPkfaNIS5YfksphrLUSsw4Q1vjwk6oYLyHp4hvGt_PdBA3m5SiMznxvFIBVR4jWq-MVRvLs8KZnALAHeY_vYJ4N7yMefAvLFQReALyF4GyVhMZaxjfp9iEqlBgwKnx2SzXA-Caer2ZrqxdRWHXo78-oR0rP39-N6xpIYccQs8zyW3hX3UtVF_AR_Qz-Be3m0DgrR0EeEBrUnmCwXgV1JviKzijTQmQ5CI2mXQYln34gb0rFLIuOBjeah-jF46ZcljfpJqw3q_Uqi_IPUgXrgPF8zfgt3Np-UJouB1uW7ZeiI_HgWX6sx3Zw1tByNNMZyeWFYUsUgryPUIpDpJsdnaDIsnzPq_iHs3x_cSL-vOqAdBWChYs2mMIGrDj8hMniGDfffMEzeuHUMBV0fkjoAYBXwKrb35E4mBS9uVgRa3x9TVNLhhwGkqvXSb52oa_WPaCzo5Eg7KgleKvPBKFTHpT3I73Zmiam1-j-j-m_1AyA5cd3o_IciVRFk-gXSybdfR3m94rjMAZQAZQHQv8U2dJY11I8jMQlP5BQqPVTxOZH0cGAIZAz8Urj6N-RTABlIHQ0tf8aPa1SQlhxuBKfHgdtHTnQyjwkZnUhDD56wE-Mn1ora6vDyrqW8dM3xk-f1jU2nUNMlEtzYB4_n1WvNLqUTp-kd4xXZ4IL_-lR-RA5Ywcy84uARoI1FMH7pGKpfBfd7pUhWC7hB1QqdGO9ErZn_KT1-fJvOTj7hURg_DRD4Kdtvt7eJCifiXoPWj3QHNxGPZIEY79OCO5AoDE2gKO5M8XXrIH-CbyStII7QO_HPpIWwxTbemyjImGNIRFIRszx_J5xLjpUUwPg_B5sAwK19r8nCd1H-8e2_mvznITltC4JifsOsIcOh2Hij7AmOFWPgSZ8jXpMUC_FNxHJ9hTTkMqzjY24J1BGBYUa_Ni25GNZecA6khthcHYgFyt5jIIpjIP1XtWaYNAYm3uwoK19SKBgcmq7kLtcbvMtLmi3rvLNtuBVWS66XVE1QvKyIrHOBFW8wqLJcsRqXedlleULteMZLzKeVesNL7NyJYuiaJDWcltsMxKc3WTUo9KrSIgYssXk327NS77JFxpr0n76ouL8xWThnPFbxvk0iJaXQRSPi-PC7SZ21WPr2U2mlQ_-WX1QQU-faC-0FUdgZfYT_bzMXo2-jmIcUT99S2UyT4nUsGwDto4UnwcJSTgrhIlqUdhSbAN-MTq9-_WamWN13vH_AgAA__8XFDfw">