https://github.com/YutongZhuu updated https://github.com/llvm/llvm-project/pull/131523
>From f99d61ef3353e8559450e91ad8201f8fe7592a86 Mon Sep 17 00:00:00 2001 From: Yutong Zhu <y25...@uwaterloo.ca> Date: Sun, 16 Mar 2025 11:15:31 -0400 Subject: [PATCH 1/2] Implement Wpointer-bool-conversion-strict --- clang/docs/ReleaseNotes.rst | 2 ++ clang/include/clang/Basic/DiagnosticGroups.td | 1 + clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 ++++ clang/lib/Sema/SemaChecking.cpp | 3 +++ .../test/Sema/warn-pointer-bool-conversion-strict.c | 13 +++++++++++++ .../Sema/warn-pointer-bool-conversion-strict.cpp | 12 ++++++++++++ 6 files changed, 35 insertions(+) create mode 100644 clang/test/Sema/warn-pointer-bool-conversion-strict.c create mode 100644 clang/test/Sema/warn-pointer-bool-conversion-strict.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 7859871b0493a..5c9783d051de5 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -136,6 +136,8 @@ New Compiler Flags The feature has `existed <https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#running-the-instrumented-program>`_) for a while and this is just a user facing option. +- New Option ``-Wpointer-bool-conversion-strict`` has been added to warn about all implicit pointer-to-bool conversions (#GH9500). This option is ignored by default. + Deprecated Compiler Flags ------------------------- diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index fac80fb4009aa..4b2baa898a918 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -74,6 +74,7 @@ def LiteralConversion : DiagGroup<"literal-conversion">; def StringConversion : DiagGroup<"string-conversion">; def SignConversion : DiagGroup<"sign-conversion">; def PointerBoolConversion : DiagGroup<"pointer-bool-conversion">; +def PointerBoolConversionStrict : DiagGroup<"pointer-bool-conversion-strict">; def UndefinedBoolConversion : DiagGroup<"undefined-bool-conversion">; def BitwiseInsteadOfLogical : DiagGroup<"bitwise-instead-of-logical">; def BoolOperation : DiagGroup<"bool-operation", [BitwiseInsteadOfLogical]>; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 14b0051709625..7f81b8ece55b5 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4337,6 +4337,10 @@ def warn_impcast_pointer_to_bool : Warning< "address of %select{'%1'|function '%1'|array '%1'|lambda function pointer " "conversion operator}0 will always evaluate to 'true'">, InGroup<PointerBoolConversion>; +def warn_impcast_pointer_to_bool_strict: Warning< + "implicit conversion of pointer to bool">, + InGroup<PointerBoolConversionStrict>, + DefaultIgnore; def warn_cast_nonnull_to_bool : Warning< "nonnull %select{function call|parameter}0 '%1' will evaluate to " "'true' on first encounter">, diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 9cac9cf5c4df7..fee5611873232 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -11699,6 +11699,9 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC, DiagnoseAlwaysNonNullPointer(E, Expr::NPCK_NotNull, /*IsEqual*/ false, SourceRange(CC)); } + if (Source->isPointerType()) { + Diag(E->getExprLoc(), diag::warn_impcast_pointer_to_bool_strict); + } } // If the we're converting a constant to an ObjC BOOL on a platform where BOOL diff --git a/clang/test/Sema/warn-pointer-bool-conversion-strict.c b/clang/test/Sema/warn-pointer-bool-conversion-strict.c new file mode 100644 index 0000000000000..5620f054d4354 --- /dev/null +++ b/clang/test/Sema/warn-pointer-bool-conversion-strict.c @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -fsyntax-only -Wpointer-bool-conversion %s +#include <stddef.h> +_Bool f() { + int *p; + if (p) {} // expected-warning {{implicit conversion of pointer to bool}} + return (void *)0; // expected-warning {{implicit conversion of pointer to bool}} +} + +_Bool g() { + int *p = (void *)0; + if (p == NULL) {} // no-warning + return (void *)0 == NULL; // no-warning +} diff --git a/clang/test/Sema/warn-pointer-bool-conversion-strict.cpp b/clang/test/Sema/warn-pointer-bool-conversion-strict.cpp new file mode 100644 index 0000000000000..8e612d2459705 --- /dev/null +++ b/clang/test/Sema/warn-pointer-bool-conversion-strict.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fsyntax-only -Wpointer-bool-conversion %s +bool f() { + int *p; + if (p) {} // expected-warning {{implicit conversion of pointer to bool}} + return (void *)0; // expected-warning {{implicit conversion of pointer to bool}} +} + +bool g() { + int *p = nullptr; + if (p == nullptr) {} // no-warning + return (void *)0 == nullptr; // no-warning +} >From e9ea0be054d60562b443ad89e90e0e36a205ec83 Mon Sep 17 00:00:00 2001 From: Yutong Zhu <y25...@uwaterloo.ca> Date: Sun, 16 Mar 2025 16:46:32 -0400 Subject: [PATCH 2/2] Include sources can decay to pointer type --- clang/lib/Sema/SemaChecking.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index fee5611873232..8be91d54353e5 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -11695,13 +11695,11 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC, diag::warn_impcast_objective_c_literal_to_bool); } if (Source->isPointerType() || Source->canDecayToPointerType()) { + Diag(E->getExprLoc(), diag::warn_impcast_pointer_to_bool_strict); // Warn on pointer to bool conversion that is always true. DiagnoseAlwaysNonNullPointer(E, Expr::NPCK_NotNull, /*IsEqual*/ false, SourceRange(CC)); } - if (Source->isPointerType()) { - Diag(E->getExprLoc(), diag::warn_impcast_pointer_to_bool_strict); - } } // If the we're converting a constant to an ObjC BOOL on a platform where BOOL _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits