[PATCH] D98738: [clang-tidy] performance-* checks: Match AllowedTypes against qualified type names when they contain "::".
Felix Berger via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 16 13:13:25 PDT 2021
flx created this revision.
flx added reviewers: ymandel, aaron.ballman.
Herald added a subscriber: xazax.hun.
flx requested review of this revision.
Herald added a project: clang-tools-extra.
This allows users to be more precise and exclude a type in a specific namespace
from triggering the check instead of excluding all types with the same
unqualified name.
This change should not interfere with correctly configured clang-tidy setups
since an AllowedType with "::" would never match.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D98738
Files:
clang-tools-extra/clang-tidy/utils/Matchers.h
clang-tools-extra/docs/clang-tidy/checks/performance-for-range-copy.rst
clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-copy-initialization.rst
clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-value-param.rst
clang-tools-extra/test/clang-tidy/checkers/performance-for-range-copy-allowed-types.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/performance-for-range-copy-allowed-types.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/performance-for-range-copy-allowed-types.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/performance-for-range-copy-allowed-types.cpp
@@ -1,5 +1,5 @@
// RUN: %check_clang_tidy %s performance-for-range-copy %t -- \
-// RUN: -config="{CheckOptions: [{key: performance-for-range-copy.AllowedTypes, value: '[Pp]ointer$;[Pp]tr$;[Rr]ef(erence)?$'}]}" \
+// RUN: -config="{CheckOptions: [{key: performance-for-range-copy.AllowedTypes, value: '[Pp]ointer$;[Pp]tr$;[Rr]ef(erence)?$;fully::Qualified'}]}" \
// RUN: -- -fno-delayed-template-parsing
template <typename T>
@@ -63,6 +63,14 @@
typedef SomeComplexTemplate<int> NotTooComplexRef;
+namespace fully {
+
+struct Qualified {
+ ~Qualified();
+};
+
+} // namespace fully
+
void negativeSmartPointer() {
for (auto P : View<Iterator<SmartPointer>>()) {
auto P2 = P;
@@ -124,3 +132,13 @@
auto R2 = R;
}
}
+
+void negativeFullyQualified() {
+ for (auto Q : View<Iterator<fully::Qualified>>()) {
+ auto Q2 = Q;
+ }
+ using fully::Qualified;
+ for (auto Q : View<Iterator<Qualified>>()) {
+ auto Q2 = Q;
+ }
+}
Index: clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-value-param.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-value-param.rst
+++ clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-value-param.rst
@@ -66,4 +66,7 @@
A semicolon-separated list of names of types allowed to be passed by value.
Regular expressions are accepted, e.g. `[Rr]ef(erence)?$` matches every type
- with suffix `Ref`, `ref`, `Reference` and `reference`. The default is empty.
+ with suffix `Ref`, `ref`, `Reference` and `reference`. The default is
+ empty. If a name in the list contains the sequence `::` it is matched against
+ the qualified typename (i.e. `namespace::Type`, otherwise it is matched
+ against only the type name (i.e. `Type`).
Index: clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-copy-initialization.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-copy-initialization.rst
+++ clang-tools-extra/docs/clang-tidy/checks/performance-unnecessary-copy-initialization.rst
@@ -43,5 +43,7 @@
A semicolon-separated list of names of types allowed to be initialized by
copying. Regular expressions are accepted, e.g. `[Rr]ef(erence)?$` matches
- every type with suffix `Ref`, `ref`, `Reference` and `reference`. The
- default is empty.
+ every type with suffix `Ref`, `ref`, `Reference` and `reference`. The default
+ is empty. If a name in the list contains the sequence `::` it is matched
+ against the qualified typename (i.e. `namespace::Type`, otherwise it is
+ matched against only the type name (i.e. `Type`).
Index: clang-tools-extra/docs/clang-tidy/checks/performance-for-range-copy.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/performance-for-range-copy.rst
+++ clang-tools-extra/docs/clang-tidy/checks/performance-for-range-copy.rst
@@ -31,4 +31,6 @@
A semicolon-separated list of names of types allowed to be copied in each
iteration. Regular expressions are accepted, e.g. `[Rr]ef(erence)?$` matches
every type with suffix `Ref`, `ref`, `Reference` and `reference`. The default
- is empty.
+ is empty. If a name in the list contains the sequence `::` it is matched
+ against the qualified typename (i.e. `namespace::Type`, otherwise it is
+ matched against only the type name (i.e. `Type`).
Index: clang-tools-extra/clang-tidy/utils/Matchers.h
===================================================================
--- clang-tools-extra/clang-tidy/utils/Matchers.h
+++ clang-tools-extra/clang-tidy/utils/Matchers.h
@@ -52,8 +52,11 @@
AST_MATCHER_P(NamedDecl, matchesAnyListedName, std::vector<std::string>,
NameList) {
return llvm::any_of(NameList, [&Node](const std::string &Name) {
- return llvm::Regex(Name).match(Node.getName());
- });
+ if (Name.find("::") != std::string::npos) {
+ return llvm::Regex(Name).match(Node.getQualifiedNameAsString());
+ }
+ return llvm::Regex(Name).match(Node.getName());
+ });
}
} // namespace matchers
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98738.331076.patch
Type: text/x-patch
Size: 4562 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210316/36db24a9/attachment.bin>
More information about the cfe-commits
mailing list