[PATCH] D89332: [clang-tidy] performance-unnecessary-copy-initialization: Always allow std::function to be copied.
Felix Berger via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 20 14:21:26 PDT 2020
flx updated this revision to Diff 299471.
flx added a comment.
Use hasName matcher on the declaration of the canonical type.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D89332/new/
https://reviews.llvm.org/D89332
Files:
clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
@@ -405,3 +405,41 @@
ExpensiveToCopyType Orig;
const ExpensiveToCopyType Copy = freeFunctionWithDefaultArg(&Orig);
}
+
+namespace std {
+inline namespace __1 {
+
+template <class>
+class function;
+template <class R, class... Args>
+class function<R(Args...)> {
+public:
+ function();
+ function(const function &other);
+ R operator()(Args &&...args) const;
+};
+
+} // namespace __1
+} // namespace std
+
+void negativeStdFunction() {
+ std::function<int()> Orig;
+ std::function<int()> Copy = Orig;
+ int i = Orig();
+}
+
+using Functor = std::function<int()>;
+
+void negativeAliasedStdFunction() {
+ Functor Orig;
+ Functor Copy = Orig;
+ int i = Orig();
+}
+
+typedef std::function<int()> TypedefFunc;
+
+void negativeTypedefedStdFunction() {
+ TypedefFunc Orig;
+ TypedefFunc Copy = Orig;
+ int i = Orig();
+}
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
@@ -40,7 +40,8 @@
AllowedTypes(
utils::options::parseStringList(Options.get("AllowedTypes", ""))) {}
-void UnnecessaryCopyInitialization::registerMatchers(MatchFinder *Finder) {
+void UnnecessaryCopyInitialization::registerMatchers(
+ internal::MatchFinder *Finder) {
auto ConstReference = referenceType(pointee(qualType(isConstQualified())));
// Match method call expressions where the `this` argument is only used as
@@ -57,17 +58,20 @@
unless(callee(cxxMethodDecl())))
.bind("initFunctionCall");
- auto localVarCopiedFrom = [this](const internal::Matcher<Expr> &CopyCtorArg) {
+ auto localVarCopiedFrom = [this](const Matcher<Expr> &CopyCtorArg) {
return compoundStmt(
forEachDescendant(
declStmt(
has(varDecl(hasLocalStorage(),
hasType(qualType(
- hasCanonicalType(
- matchers::isExpensiveToCopy()),
+ hasCanonicalType(allOf(
+ matchers::isExpensiveToCopy(),
+ unless(hasDeclaration(namedDecl(
+ hasName("::std::function")))))),
unless(hasDeclaration(namedDecl(
- matchers::matchesAnyListedName(
- AllowedTypes)))))),
+ anyOf(matchers::matchesAnyListedName(
+ AllowedTypes),
+ isStdFunction())))))),
unless(isImplicit()),
hasInitializer(traverse(
ast_type_traits::TK_AsIs,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89332.299471.patch
Type: text/x-patch
Size: 3469 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201020/49596705/attachment.bin>
More information about the cfe-commits
mailing list