[PATCH] D141310: [clang] add -Wcompare-function-pointers
Adrian Dole via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 19 14:57:06 PST 2023
adriandole updated this revision to Diff 490671.
adriandole added a comment.
Only trigger this warning when comparing function pointers of the same type, since comparing distinct types is already an error.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141310/new/
https://reviews.llvm.org/D141310
Files:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/compare-function-pointer.cpp
Index: clang/test/SemaCXX/compare-function-pointer.cpp
===================================================================
--- clang/test/SemaCXX/compare-function-pointer.cpp
+++ clang/test/SemaCXX/compare-function-pointer.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s
+// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify -Wcompare-function-pointers %s
using fp0_t = void (*)();
using fp1_t = int (*)();
@@ -6,8 +6,8 @@
extern fp0_t a, b;
extern fp1_t c;
-bool eq0 = a == b;
-bool ne0 = a != b;
+bool eq0 = a == b; // expected-warning {{distinct function pointers ('fp0_t' (aka 'void (*)()') and 'fp0_t')}}
+bool ne0 = a != b; // expected-warning {{distinct function pointers}}
bool lt0 = a < b; // expected-warning {{ordered comparison of function pointers ('fp0_t' (aka 'void (*)()') and 'fp0_t')}}
bool le0 = a <= b; // expected-warning {{ordered comparison of function pointers}}
bool gt0 = a > b; // expected-warning {{ordered comparison of function pointers}}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -12714,6 +12714,13 @@
LHS.get()->getSourceRange());
}
+ if (!IsOrdered && LHSType->isFunctionPointerType() &&
+ RHSType->isFunctionPointerType() && !LHSIsNull && !RHSIsNull &&
+ RHSType == LHSType)
+ Diag(Loc, diag::warn_typecheck_comparison_of_function_pointers)
+ << LHSType << RHSType
+ << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
+
if (IsOrdered && LHSType->isFunctionPointerType() &&
RHSType->isFunctionPointerType()) {
// Valid unless a relational comparison of function pointers
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -7010,6 +7010,10 @@
"%0 is %select{|in}2complete and "
"%1 is %select{|in}3complete">,
InGroup<C11>;
+def warn_typecheck_comparison_of_function_pointers : Warning<
+ "distinct function pointers (%0 and %1) may compare equal "
+ "when using identical code folding">,
+ InGroup<CompareFunctionPointers>, DefaultIgnore;
def warn_typecheck_ordered_comparison_of_function_pointers : Warning<
"ordered comparison of function pointers (%0 and %1)">,
InGroup<OrderedCompareFunctionPointers>;
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -565,6 +565,7 @@
def DeprecatedObjCIsaUsage : DiagGroup<"deprecated-objc-isa-usage">;
def ExplicitInitializeCall : DiagGroup<"explicit-initialize-call">;
def OrderedCompareFunctionPointers : DiagGroup<"ordered-compare-function-pointers">;
+def CompareFunctionPointers : DiagGroup<"compare-function-pointers", [OrderedCompareFunctionPointers]>;
def PackedNonPod : DiagGroup<"packed-non-pod">;
def Packed : DiagGroup<"packed", [PackedNonPod]>;
def Padded : DiagGroup<"padded">;
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -465,6 +465,8 @@
- Clang now automatically adds ``[[clang::lifetimebound]]`` to the parameters of
``std::move, std::forward`` et al, this enables Clang to diagnose more cases
where the returned reference outlives the object.
+- Add ``-Wcompare-function-pointers`` to warn about comparisons that may have their behavior
+ change when enabling the identical code folding optimization feature of some linkers.
Non-comprehensive list of changes in this release
-------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141310.490671.patch
Type: text/x-patch
Size: 3908 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230119/3f27b9db/attachment-0001.bin>
More information about the cfe-commits
mailing list