On Fri, 2020-07-17 at 13:00 -0600, Martin Sebor via Gcc-patches wrote:
> The recent enhancement to treat the implicit this pointer argument
> as nonnull in member functions triggers spurious -Wnonnull for
> the synthesized conditional expression the C++ front end replaces
> the pointer with in some static_cast expressions.  The front end
> already sets the no-warning bit for the test but not for the whole
> conditional expression, so the attached fix extends the same solution
> to it.
> 
> The consequence of this fix is that user-written code like this:
> 
>    static_cast<T*>(p ? p : 0)->f ();
> or
>    static_cast<T*>(p ? p : nullptr)->f ();
> 
> don't trigger the warning because they are both transformed into
> the same expression as:
> 
>    static_cast<T*>(p)->f ();
> 
> What still does trigger it is this:
> 
>    static_cast<T*>(p ? p : (T*)0)->f ();
> 
> because here it's the inner COND_EXPR's no-warning bit that's set
> (the outer one is clear), whereas in the former expressions it's
> the other way around.  It would be nice if this worked consistently
> but I didn't see an easy way to do that and more than a quick fix
> seems outside the scope for this bug.
> 
> Another case reported by someone else in the same bug involves
> a dynamic_cast.  A simplified test case goes something like this:
> 
>    if (dynamic_cast<T*>(p))
>      dynamic_cast<T*>(p)->f ();
> 
> The root cause is the same: the front end emitting the COND_EXPR
> 
>    ((p != 0) ? ((T*)__dynamic_cast(p, (& _ZTI1B), (& _ZTI1C), 0)) : 0)
> 
> I decided not to suppress the warning in this case because doing
> so would also suppress it in unconditional calls with the result
> of the cast:
> 
>    dynamic_cast<T*>(p)->f ();
> 
> and that doesn't seem helpful.  Instead, I'd suggest to make
> the second cast in the if statement to reference to T&:
> 
>    if (dynamic_cast<T*>(p))
>      dynamic_cast<T&>(*p).f ();
Hmmm, I wonder if this would fix a handful of errors I got when doing the 
testing
of the Ranger work for Aldy.  Let me throw the new version into the tester and
respin just the failing packages. 

Jeff
> 

Reply via email to