https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96003
--- Comment #25 from Martin Liška <marxin at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #24) > 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? I see the pattern in libyui-3.12.2 package. > > 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 (); */ dynamic_cast<C&>(*p).f (); */ works for me as a workaround of the issue.