summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Szecsi <szepet95@gmail.com>2017-09-12 09:40:13 +0000
committerPeter Szecsi <szepet95@gmail.com>2017-09-12 09:40:13 +0000
commit2087113f6c844c9a7101eff08091225be6532908 (patch)
tree20c114297f166618b47779c66df8927890e12a97
parent38029d3c890747b019594eb4c43b4fb739bdc93e (diff)
downloadbcm5719-llvm-2087113f6c844c9a7101eff08091225be6532908.tar.gz
bcm5719-llvm-2087113f6c844c9a7101eff08091225be6532908.zip
[clang-tidy] SuspiciousEnumUsageCheck bugfix
iThere is a reported bug on the checker not handling the some APSInt values correctly: https://bugs.llvm.org/show_bug.cgi?id=34400 This patch aims to fix it. Differential Revision: https://reviews.llvm.org/D37572 llvm-svn: 313016
-rw-r--r--clang-tools-extra/clang-tidy/misc/SuspiciousEnumUsageCheck.cpp6
-rw-r--r--clang-tools-extra/test/clang-tidy/misc-suspicious-enum-usage.cpp8
2 files changed, 11 insertions, 3 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/SuspiciousEnumUsageCheck.cpp b/clang-tools-extra/clang-tidy/misc/SuspiciousEnumUsageCheck.cpp
index 501e2b24ea1..416a418a44f 100644
--- a/clang-tools-extra/clang-tidy/misc/SuspiciousEnumUsageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/SuspiciousEnumUsageCheck.cpp
@@ -42,7 +42,8 @@ struct ValueRange {
const auto MinMaxVal = std::minmax_element(
EnumDec->enumerator_begin(), EnumDec->enumerator_end(),
[](const EnumConstantDecl *E1, const EnumConstantDecl *E2) {
- return E1->getInitVal() < E2->getInitVal();
+ return llvm::APSInt::compareValues(E1->getInitVal(),
+ E2->getInitVal()) < 0;
});
MinVal = MinMaxVal.first->getInitVal();
MaxVal = MinMaxVal.second->getInitVal();
@@ -57,7 +58,8 @@ static int enumLength(const EnumDecl *EnumDec) {
static bool hasDisjointValueRange(const EnumDecl *Enum1,
const EnumDecl *Enum2) {
ValueRange Range1(Enum1), Range2(Enum2);
- return (Range1.MaxVal < Range2.MinVal) || (Range2.MaxVal < Range1.MinVal);
+ return llvm::APSInt::compareValues(Range1.MaxVal, Range2.MinVal) < 0 ||
+ llvm::APSInt::compareValues(Range2.MaxVal, Range1.MinVal) < 0;
}
static bool isNonPowerOf2NorNullLiteral(const EnumConstantDecl *EnumConst) {
diff --git a/clang-tools-extra/test/clang-tidy/misc-suspicious-enum-usage.cpp b/clang-tools-extra/test/clang-tidy/misc-suspicious-enum-usage.cpp
index 27e78f5c73e..52d666dfcb8 100644
--- a/clang-tools-extra/test/clang-tidy/misc-suspicious-enum-usage.cpp
+++ b/clang-tools-extra/test/clang-tidy/misc-suspicious-enum-usage.cpp
@@ -54,7 +54,7 @@ int trigger() {
int emptytest = EmptyVal | B;
if (bestDay() | A)
return 1;
- // CHECK-MESSAGES: :[[@LINE-2]]:17: warning: enum values are from different enum types
+ // CHECK-MESSAGES: :[[@LINE-2]]:17: warning: enum values are from different enum types
if (I | Y)
return 1;
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: enum values are from different enum types
@@ -88,3 +88,9 @@ int dont_trigger() {
return 1;
return 42;
}
+
+namespace PR34400 {
+enum { E1 = 0 };
+enum { E2 = -1 };
+enum { l = E1 | E2 };
+}
OpenPOWER on IntegriCloud