[clang-tools-extra] 6dcb100 - Optionally exclude bitfield definitions from magic numbers check
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Sat Dec 7 09:34:14 PST 2019
Author: Florin Iucha
Date: 2019-12-07T12:33:10-05:00
New Revision: 6dcb1003f2022cba36e9f5a6d39648c3a3a213a0
URL: https://github.com/llvm/llvm-project/commit/6dcb1003f2022cba36e9f5a6d39648c3a3a213a0
DIFF: https://github.com/llvm/llvm-project/commit/6dcb1003f2022cba36e9f5a6d39648c3a3a213a0.diff
LOG: Optionally exclude bitfield definitions from magic numbers check
Adds the IgnoreBitFieldsWidths option to readability-magic-numbers.
Added:
clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers-bitfields.cpp
Modified:
clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/checks/readability-magic-numbers.rst
clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp b/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
index 39aaf89901f2..6f6366cab6f6 100644
--- a/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
@@ -21,12 +21,12 @@
using namespace clang::ast_matchers;
using namespace clang::ast_type_traits;
-namespace {
+namespace clang {
-bool isUsedToInitializeAConstant(const MatchFinder::MatchResult &Result,
- const DynTypedNode &Node) {
+static bool isUsedToInitializeAConstant(const MatchFinder::MatchResult &Result,
+ const DynTypedNode &Node) {
- const auto *AsDecl = Node.get<clang::DeclaratorDecl>();
+ const auto *AsDecl = Node.get<DeclaratorDecl>();
if (AsDecl) {
if (AsDecl->getType().isConstQualified())
return true;
@@ -34,7 +34,7 @@ bool isUsedToInitializeAConstant(const MatchFinder::MatchResult &Result,
return AsDecl->isImplicit();
}
- if (Node.get<clang::EnumConstantDecl>() != nullptr)
+ if (Node.get<EnumConstantDecl>() != nullptr)
return true;
return llvm::any_of(Result.Context->getParents(Node),
@@ -43,9 +43,18 @@ bool isUsedToInitializeAConstant(const MatchFinder::MatchResult &Result,
});
}
-} // namespace
+static bool isUsedToDefineABitField(const MatchFinder::MatchResult &Result,
+ const DynTypedNode &Node) {
+ const auto *AsFieldDecl = Node.get<FieldDecl>();
+ if (AsFieldDecl && AsFieldDecl->isBitField())
+ return true;
+
+ return llvm::any_of(Result.Context->getParents(Node),
+ [&Result](const DynTypedNode &Parent) {
+ return isUsedToDefineABitField(Result, Parent);
+ });
+}
-namespace clang {
namespace tidy {
namespace readability {
@@ -56,6 +65,7 @@ MagicNumbersCheck::MagicNumbersCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
IgnoreAllFloatingPointValues(
Options.get("IgnoreAllFloatingPointValues", false)),
+ IgnoreBitFieldsWidths(Options.get("IgnoreBitFieldsWidths", true)),
IgnorePowersOf2IntegerValues(
Options.get("IgnorePowersOf2IntegerValues", false)) {
// Process the set of ignored integer values.
@@ -165,6 +175,16 @@ bool MagicNumbersCheck::isSyntheticValue(const SourceManager *SourceManager,
return BufferIdentifier.empty();
}
+bool MagicNumbersCheck::isBitFieldWidth(
+ const clang::ast_matchers::MatchFinder::MatchResult &Result,
+ const IntegerLiteral &Literal) const {
+ return IgnoreBitFieldsWidths &&
+ llvm::any_of(Result.Context->getParents(Literal),
+ [&Result](const DynTypedNode &Parent) {
+ return isUsedToDefineABitField(Result, Parent);
+ });
+}
+
} // namespace readability
} // namespace tidy
} // namespace clang
diff --git a/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h b/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h
index e59ca1759670..0cf7419d703c 100644
--- a/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h
@@ -40,10 +40,17 @@ class MagicNumbersCheck : public ClangTidyCheck {
const FloatingLiteral *) const {
return false;
}
-
bool isSyntheticValue(const clang::SourceManager *SourceManager,
const IntegerLiteral *Literal) const;
+ bool isBitFieldWidth(const clang::ast_matchers::MatchFinder::MatchResult &,
+ const FloatingLiteral &) const {
+ return false;
+ }
+
+ bool isBitFieldWidth(const clang::ast_matchers::MatchFinder::MatchResult &Result,
+ const IntegerLiteral &Literal) const;
+
template <typename L>
void checkBoundMatch(const ast_matchers::MatchFinder::MatchResult &Result,
const char *BoundName) {
@@ -64,6 +71,9 @@ class MagicNumbersCheck : public ClangTidyCheck {
if (isSyntheticValue(Result.SourceManager, MatchedLiteral))
return;
+ if (isBitFieldWidth(Result, *MatchedLiteral))
+ return;
+
const StringRef LiteralSourceText = Lexer::getSourceText(
CharSourceRange::getTokenRange(MatchedLiteral->getSourceRange()),
*Result.SourceManager, getLangOpts());
@@ -74,6 +84,7 @@ class MagicNumbersCheck : public ClangTidyCheck {
}
const bool IgnoreAllFloatingPointValues;
+ const bool IgnoreBitFieldsWidths;
const bool IgnorePowersOf2IntegerValues;
constexpr static unsigned SensibleNumberOfMagicValueExceptions = 16;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 91a196deb6f4..ec56c6d6a784 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -173,6 +173,12 @@ Improvements to clang-tidy
Finds classes, structs, and unions that contain redundant member
access specifiers.
+- Improved :doc:`readability-magic-numbers
+ <clang-tidy/checks/readability-magic-numbers>` check.
+
+ The check now supports the ``IgnoreBitFieldsWidths`` option to suppress
+ the warning for numbers used to specify bit field widths.
+
- New :doc:`readability-make-member-function-const
<clang-tidy/checks/readability-make-member-function-const>` check.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-magic-numbers.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-magic-numbers.rst
index 9968809eef6d..1fac4220abea 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability-magic-numbers.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-magic-numbers.rst
@@ -111,3 +111,8 @@ Options
Boolean value indicating whether to accept all floating point values without
warning. Default value is `false`.
+.. option:: IgnoreBitFieldsWidths
+
+ Boolean value indicating whether to accept magic numbers as bit field widths
+ without warning. This is useful for example for register definitions which
+ are generated from hardware specifications. Default value is `true`.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers-bitfields.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers-bitfields.cpp
new file mode 100644
index 000000000000..3c1fef939c63
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers-bitfields.cpp
@@ -0,0 +1,22 @@
+// RUN: %check_clang_tidy %s readability-magic-numbers %t \
+// RUN: -config='{CheckOptions: \
+// RUN: [{key: readability-magic-numbers.IgnoredIntegerValues, value: "1;2;10;100;"}]}' \
+// RUN: --
+
+struct HardwareGateway {
+ /*
+ * The configuration suppresses the warnings for the bitfields...
+ */
+ unsigned int Some: 5;
+ unsigned int Bits: 7;
+ unsigned int: 7;
+ unsigned int: 0;
+ unsigned int Rest: 13;
+
+ /*
+ * ... but other fields trigger the warning.
+ */
+ unsigned int Another[3];
+ // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
+};
+
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers.cpp
index 3cf9dc52ea2b..055ad76d09b5 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability-magic-numbers.cpp
@@ -2,6 +2,7 @@
// RUN: -config='{CheckOptions: \
// RUN: [{key: readability-magic-numbers.IgnoredIntegerValues, value: "0;1;2;10;100;"}, \
// RUN: {key: readability-magic-numbers.IgnoredFloatingPointValues, value: "3.14;2.71828;9.81;10000.0;101.0;0x1.2p3"}, \
+// RUN: {key: readability-magic-numbers.IgnoreBitFieldsWidths, value: 0}, \
// RUN: {key: readability-magic-numbers.IgnorePowersOf2IntegerValues, value: 1}]}' \
// RUN: --
@@ -79,6 +80,23 @@ int getAnswer() {
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
}
+struct HardwareGateway {
+ unsigned int Some: 5;
+ // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 5 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
+ unsigned int Bits: 7;
+ // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 7 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
+ unsigned int: 6;
+ // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: 6 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
+ unsigned int Flag: 1; // no warning since this is suppressed by IgnoredIntegerValues rule
+ unsigned int: 0; // no warning since this is suppressed by IgnoredIntegerValues rule
+ unsigned int Rest: 13;
+ // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 13 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
+ //
+ unsigned int Another[3];
+ // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]
+};
+
+
/*
* Clean code
*/
More information about the cfe-commits
mailing list