noderef was failing to trigger warnings in some cases related to c++ style casting. This patch addresses them.
Warning on this seems reasonable for static_cast and dynamic_cast, but should reinterpret_cast (or the reinterpret_cast interpretation of a C-style cast) warn? Presumably we want to leave open some type system holes for the case where the programmer really does know what they're doing.
Are there any static_cast cases that don't get here? I'm also a little surprised that static_cast would get here but the static_cast interpretation of a C-style or functional cast would not.
My initial idea for this was that users could explicitly disable the warning with -Wno-noderef or pragmas for line-level granularity, but I can see how this could be less convenient/not consistent with other casts. Will update to allow C-style + reinterpret_casts.
I'll double check on this. The reason I added this here was because the cast in static_cast_from_same_ptr_type() triggered 2 of the warn_noderef_to_dereferenceable_pointer warnings and one of them was triggered here.
|211 ↗||(On Diff #256428)|
Woops. Will update the name.
Please use UpperCamelCase for local variables.
Should we be checking this for a C-style cast? You previously said you were going to turn off the checks for C-style casts. Did you change your mind on that?
As above, should we be checking this for a C-style cast? (It also looks like we're doing this check twice in C++.)
I see, this is only reached for the part of static_cast that considers implicit conversion sequences. OK.
I expect there's similar overlap for all the other kinds of cast too. Should we be suppressing this check for *all* casts, given that we perform the check in SemaCast instead?
No, you're right. I accidentally left this in.
Also accidentally left this in.
Hmm. I think for this particular location, static_cast contexts are all we need to suppress it for to prevent duplicate warnings from showing.
We don't need to suppress for these since the attribute is allowed to pass through these:
We perform the check for implicit casts here since (AFAICT) only explicit casts (C-style, functional, and C++ style) seem to be covered in SemaCast:
This would cover cases like int *ptr = noderef_ptr;.
I'm not sure about these ones, but none of the cases I have seem to fail if I suppress only them:
It could be though that there's a particular case I'm not covering in my tests.