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

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy - a dynamic_cast triggers clang-analyzer-core.CallAndMessage warning
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Consider following snippet (https://godbolt.org/z/nb9fheEjq)

~~~~
#define USE_DYNAMIC_CAST
struct base{
    virtual void foo();
    virtual ~base();
};
struct derived:base{};
struct derived2:base{};

void bar(base* b){
    #ifdef USE_DYNAMIC_CAST
    auto* d = dynamic_cast<derived*>(b);
    if(d){
        d->foo();
    }
 #endif
    b->foo();
}
~~~~

depending if `USE_DYNAMIC_CAST` is defined or not, clang-tidy triggers following warning


~~~~
[<source>:39:5: warning: Called C++ object pointer is null [clang-analyzer-core.CallAndMessage]]
   39 |     b->foo();
      | ^
[<source>:34:8: note: Assuming 'd' is null]
   34 |     if(d)
      | ^
[<source>:34:5: note: Taking false branch]
   34 |     if(d)
      | ^
[<source>:39:5: note: Called C++ object pointer is null]
   39 | b->foo();
~~~~

It seems to imply, that if `d` is `nullptr`, then also `b` must have been null, which is not true.

Removing the check `if(d)` also silences the warning, but since `b` does not necessarily point to a `derived` object, it would be the wrong thing to do.

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyslcFu4zYQhp9mfBnYoElLtg46yEoM7GF76G4PPQWUOJK4oUmXpBx4D3n2gpYdJ6mL7qFBAAnmzHz__BxSMgTdW6ISsi1kDzM5xsH5sqNn7WeNU6eydjZoRR47Z4x70bbHYPXhQBGBb4YYDwFEBXwHfNc71TgTF873wHc_ge9sU3QDPf74C3gBrAJWvb6-vqY3LhR12hL-8e3x6eHP36qvX-qnuvr2HVgVoh_biI0MBOstsAoR8ah9HKXBo9MKO-eAb1JR8Xn99Zz2bhHWD9PLpawir4-kQFRXwP0AficCWHXmN9ID30ykCpvEehMKXOhOUXevs7Qux-hSlkIQD6hOVu51-9TKEEHUV3G8AvGYEB961B3wjfpAS39qDuLxjiVJNquSILJKd5dfmzvRU-R1b1il6JBSbI-6Q8jZP1rJGeqA0xYqdB6ti8BrbI20_TxqdcLodd-TD-8m50V6q20_Md4Bsy2IOrjRt5TaFpUoQFQZiOotRVRYS2NIYQ18C3yLrvlBbcSD0zaST3LsaAxCtp1ESCvN6Sf5ees8LVJyZdVXCkH2BNlD-j8bIgqEdY3_Zs1kcYqA7PG-2BWIapMUWhcpPasQxn1qGPhaAV9fxd2YqzfmbU9_mZW9Z32Xz4nUSRMIGy9tO_wPmOIz5pfM_-zpPT9vQ_YlYiDaB4wO9f5gTmmA4iDjZejUZcogZ6n4IXrI2RRDFqUJLi01KWo_hoiDPBI2RHbSwmt8GXQ7nMW5iNGPtJjIv9PeHZNrcSBsB2qfU6WbRTmbygdtyLYUznHXSeQ1NmPEoG1LbwKUo4liqU0j5rU5Te6k7uS5ncvRztnFvVRJR3xxo1HY0ATx7izrLM6hcknxTJVCFaKQMyqXa5EXmVivNrOhVHKd841aSi67XCyX2Uq0nRQrtSnWhWrymS454xlbLrNlxgq2WWwErRhbKS7yNuNNDitGe6nNwpjjPl3cMx3CSOWSC5bnMyMbMuH6dfBlipo3Yx9gxYwOMdzyoo6Gynfnf47yw-12uxD--3xezZ6N3pSfPjI6DmOzaN0e-C7RL4_5wbvJ1d25hQB8d-niWPK_AwAA__-JjA-v">