[PATCH] D141310: [clang] add -Wcompare-function-pointers
Adrian Dole via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 13 13:00:01 PST 2023
adriandole updated this revision to Diff 489109.
adriandole added a comment.
- More helpful diagnostic message.
- Check variable and type names are printed in tests.
- Enable `-Wordered-function-pointer-comparison` when this warning is enabled.
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}}
@@ -15,7 +15,9 @@
auto tw0 = a <=> b; // expected-error {{ordered comparison of function pointers}}
bool eq1 = a == c; // expected-error {{comparison of distinct pointer types}}
+ // expected-warning at -1 {{distinct function pointers ('fp0_t' (aka 'void (*)()') and 'fp1_t' (aka 'int (*)()'))}}
bool ne1 = a != c; // expected-error {{comparison of distinct pointer types}}
+ // expected-warning at -1 {{distinct function pointers}}
bool lt1 = a < c; // expected-warning {{ordered comparison of function pointers ('fp0_t' (aka 'void (*)()') and 'fp1_t' (aka 'int (*)()'))}}
// expected-error at -1 {{comparison of distinct pointer types}}
bool le1 = a <= c; // expected-warning {{ordered comparison of function pointers}}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -12711,6 +12711,12 @@
LHS.get()->getSourceRange());
}
+ if (!IsOrdered && LHSType->isFunctionPointerType() &&
+ RHSType->isFunctionPointerType() && !LHSIsNull && !RHSIsNull)
+ 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
@@ -7009,6 +7009,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
@@ -564,6 +564,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
@@ -455,6 +455,8 @@
- Add ``-Wreturn-local-addr``, a GCC alias for ``-Wreturn-stack-address``.
- Clang now suppresses ``-Wlogical-op-parentheses`` on ``(x && a || b)`` and ``(a || b && x)``
only when ``x`` is a string literal.
+- 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.489109.patch
Type: text/x-patch
Size: 4660 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230113/5f3927f5/attachment-0001.bin>
More information about the cfe-commits
mailing list