[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:21:30 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:
The predicate already checks that:
```
RHS.get()->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)))
```
so this allows for users who define their own null macros (which does happen): https://sourcegraph.com/search?q=context:global+%23define%5B+%5Ct%5D%2B%5BA-Za-z0-9_%5D%2B+%5B%5C%28%5D%3F%5C%28void%5B+%5Ct%5D*%5C*%5C%290%5B%5C%29%5D%3F&patternType=regexp&case=yes&sm=0
https://github.com/llvm/llvm-project/pull/140724
More information about the cfe-commits
mailing list