[clang] [C] Don't diagnose null pointer macros in -Wimplicit-void-ptr-cast (PR #140724)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue May 20 06:29:02 PDT 2025


================
@@ -9966,8 +9966,13 @@ AssignConvertType Sema::CheckSingleAssignmentConstraints(QualType LHSType,
       // If there is a conversion of some kind, check to see what kind of
       // pointer conversion happened so we can diagnose a C++ compatibility
       // diagnostic if the conversion is invalid. This only matters if the RHS
-      // is some kind of void pointer.
-      if (Kind != CK_NoOp && !getLangOpts().CPlusPlus) {
+      // is some kind of void pointer. We have a carve-out when the RHS is from
+      // a macro expansion because the use of a macro may indicate different
+      // code between C and C++. Consider: char *s = NULL; where NULL is
+      // defined as (void *)0 in C (which would be invalid in C++), but 0 in
+      // C++, which is valid in C++.
+      if (Kind != CK_NoOp && !getLangOpts().CPlusPlus &&
+          !RHS.get()->getBeginLoc().isMacroID()) {
----------------
AaronBallman wrote:

That's kind of the point -- this code is specific to the case of a void pointer conversion from a null pointer constant.

So we do get the pattern, pass that predicate and get to the point of saying "cool, time to diagnose this implicit void * cast" and now we're saying "oh, but the RHS is a macro so nevermind, just be quiet about it because the macro may expand differently in C++ than it did in C".

https://github.com/llvm/llvm-project/pull/140724


More information about the cfe-commits mailing list