On 2/24/21 5:25 PM, Martin Sebor wrote:
In r11-6900 (PR 98646 - static_cast confuses -Wnonnull) we decided
that issuing -Wnonnull for dereferencing the result of dynamic_cast
was helpful despite the false positives it causes when the pointer
is guaranteed not to be null because of a prior test.

The test case in PR 99251 along with the feedback I got from Martin
Liska have convinced me it was not the right decision.

The attached patch arranges for dynamic_cast to also suppress -Wnonnull
analogously to static_cast.  Since there already is a helper function
that builds the if-not-null test (ifnonnull) and sets TREE_NO_WARNING,
I factored out the corresponding code from build_base_path that sets
the additional TREE_NO_WARNING bit for static_cast into the function
and called it from both places.  I also renamed the function to make
its purpose clearer and for consistency with other build_xxx APIs.

Let's call it build_if_nonnull, as it builds the COND_EXPR as well as the test.

+  /* The dynamic_cast might fail but so a warning might be justified
+     but not when the operand is guarded.  See pr99251.  */
+  if (B *q = p->bptr ())
+    dynamic_cast<C*>(q)->g ();                // { dg-bogus "\\\[-Wnonnull" }

This guard is no more necessary than it is for static_cast; both cases deal with null arguments. Let's not add these checks to the testcases.

This guard doesn't check for the mentioned case of dynamic_cast failing because the B* does not in fact point to a C.

I think we can just change the dg-warning to dg-bogus. Sure, dynamic_cast might fail, but AFAICT -Wnonnull isn't supposed to warn about arguments that *might* be null, only arguments that are *known* to be null.

Jason

Reply via email to