From 06e39a3aed315950d58617f6f9c1f208c356fd02 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Tue, 8 Nov 2016 00:45:34 +0000 Subject: [PATCH] [clang-tidy] Don't warn implicit variables in peformance-unnecessary-copy-initialization. Summary: This will prevent the check warning the variables which have been implicitly added by compiler, like the following case (in for-range loop): the variable '__end' is copy-constructed from a const reference... Reviewers: alexfh Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25911 llvm-svn: 286186 --- .../performance/UnnecessaryCopyInitialization.cpp | 1 + .../performance-unnecessary-copy-initialization.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp index e486350..66773a6 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -57,6 +57,7 @@ void UnnecessaryCopyInitialization::registerMatchers(MatchFinder *Finder) { declStmt( has(varDecl(hasLocalStorage(), hasType(matchers::isExpensiveToCopy()), + unless(isImplicit()), hasInitializer( cxxConstructExpr( hasDeclaration(cxxConstructorDecl( 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 b8c22ee..50dcfd8 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 @@ -368,3 +368,22 @@ void WarningOnlyMultiDeclStmt() { // CHECK-MESSAGES: [[@LINE-1]]:23: warning: local copy 'copy' of the variable 'orig' is never modified; consider avoiding the copy [performance-unnecessary-copy-initialization] // CHECK-FIXES: ExpensiveToCopyType copy = orig, copy2; } + +class Element {}; +class Container { +public: + class Iterator { + public: + void operator++(); + Element operator*(); + bool operator!=(const Iterator &); + WeirdCopyCtorType c; + }; + const Iterator &begin() const; + const Iterator &end() const; +}; + +void implicitVarFalsePositive() { + for (const Element &E : Container()) { + } +} -- 2.7.4