[clang-tidy] Utilize comparison operation implemented in APInt
authorDanny Mösch <danny.moesch@icloud.com>
Sun, 27 Mar 2022 14:41:32 +0000 (16:41 +0200)
committerDanny Mösch <danny.moesch@icloud.com>
Mon, 28 Mar 2022 21:32:58 +0000 (23:32 +0200)
This is a fix for #53963.

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D122544

clang-tools-extra/clang-tidy/bugprone/SizeofExpressionCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/bugprone-sizeof-expression.cpp

index 5bdf01c098dc6d13424549ba232708aa6e7f4576..4c537afd3347bd6dfce9823a5280b27df99d02e4 100644 (file)
@@ -20,7 +20,7 @@ namespace bugprone {
 namespace {
 
 AST_MATCHER_P(IntegerLiteral, isBiggerThan, unsigned, N) {
-  return Node.getValue().getZExtValue() > N;
+  return Node.getValue().ugt(N);
 }
 
 AST_MATCHER_P2(Expr, hasSizeOfDescendant, int, Depth,
index 2d144aae75e654111fc4be2e9aeeaa6478df5333..729bb3bbd7365c8c560179f960d6cd93dd495766 100644 (file)
@@ -122,6 +122,9 @@ Changes in existing checks
 - Fixed a false positive in :doc:`misc-redundant-expression <clang-tidy/checks/misc-redundant-expression>`
   involving overloaded comparison operators.
 
+- Fixed a crash in :doc:`bugprone-sizeof-expression <clang-tidy/checks/bugprone-sizeof-expression>` when
+  `sizeof(...)` is compared agains a `__int128_t`.
+
 Removed checks
 ^^^^^^^^^^^^^^
 
index 21d4532294aafa6d2ffbe17ed4b1d6365596b240..605243cf7a78201e81268f921e49abe6f3d16047 100644 (file)
@@ -172,7 +172,10 @@ int Foo() { int A[T]; return sizeof(T); }
 template <typename T>
 int Bar() { T A[5]; return sizeof(A[0]) / sizeof(T); }
 // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: suspicious usage of sizeof pointer 'sizeof(T)/sizeof(T)'
-int Test3() { return Foo<42>() + Bar<char>(); }
+template <__int128_t N> 
+bool Baz() { return sizeof(A) < N; }
+// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: suspicious comparison of 'sizeof(expr)' to a constant
+int Test3() { return Foo<42>() + Bar<char>() + Baz<-1>(); }
 
 static const char* kABC = "abc";
 static const wchar_t* kDEF = L"def";