From 8d228dda413a3c4b40cf0480f06b0edb232ba2c4 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Wed, 30 Dec 2015 11:35:50 +0000 Subject: [PATCH] [clang-tidy] Use hasLocalStorage() to identify unnecessary copy initializations to exclude static local variables. Summary: Since local static variables can outlive other local variables exclude them from the unnecessary copy initialization check. Reviewers: alexfh Patch by Felix Berger! Differential Revision: http://reviews.llvm.org/D15822 llvm-svn: 256636 --- .../clang-tidy/performance/UnnecessaryCopyInitialization.cpp | 3 +-- .../performance-unnecessary-copy-initialization.cpp | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp index f1c24f8ca89d..37883e98f728 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -19,7 +19,6 @@ namespace performance { using namespace ::clang::ast_matchers; namespace { -AST_MATCHER(VarDecl, isLocalVarDecl) { return Node.isLocalVarDecl(); } AST_MATCHER(QualType, isPointerType) { return Node->isPointerType(); } } // namespace @@ -43,7 +42,7 @@ void UnnecessaryCopyInitialization::registerMatchers( unless(callee(cxxMethodDecl()))); Finder->addMatcher( varDecl( - isLocalVarDecl(), hasType(isConstQualified()), + hasLocalStorage(), hasType(isConstQualified()), hasType(matchers::isExpensiveToCopy()), hasInitializer(cxxConstructExpr( hasDeclaration(cxxConstructorDecl(isCopyConstructor())), diff --git a/clang-tools-extra/test/clang-tidy/performance-unnecessary-copy-initialization.cpp b/clang-tools-extra/test/clang-tidy/performance-unnecessary-copy-initialization.cpp index 7eb7d2fef67f..aaaeffd652ae 100644 --- a/clang-tools-extra/test/clang-tidy/performance-unnecessary-copy-initialization.cpp +++ b/clang-tools-extra/test/clang-tidy/performance-unnecessary-copy-initialization.cpp @@ -110,6 +110,10 @@ void NegativeFunctionCallTrivialType() { const TrivialToCopyType VarCopyConstructed(TrivialTypeReference()); } +void NegativeStaticLocalVar(const ExpensiveToCopyType &Obj) { + static const auto StaticVar = Obj.reference(); +} + void NegativeFunctionCallExpensiveTypeNonConstVariable() { auto AutoAssigned = ExpensiveTypeReference(); auto AutoCopyConstructed(ExpensiveTypeReference());