https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96003
--- Comment #24 from Martin Sebor <msebor at gcc dot gnu.org> ---
I see. Yes, if the types are unrelated, that would be a likely bug. I think
could and should be diagnosed by the C++ front end, by some more targeted
warning than -Wnonnull (as requested in pr38557).
But I didn't actually mean to write that test case in comment #20 (I forgot to
derive one class from the other). The following is what I meant where the
-Wnonnull is strictly a false positive because of the test. It can be avoided
by casting *p to C& which might be argued (as I do in comment #17) makes the
code clearer, but if this is a common idiom we could try to suppress the
warning in these cases as well. Do you see this pattern a lot?
struct A { virtual ~A (); };
struct C: A { virtual ~C (); void f (); };
void g (A *p)
{
if (dynamic_cast<C*>(p))
dynamic_cast<C*>(p)->f (); // -Wnonnull
/* Avoid like so:
if (dynamic_cast<C*>(p))
dynamic_cast<C&>(*p)->f (); */
}