llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: Barnabás Pőcze (pobrn) <details> <summary>Changes</summary> Static member functions can be considered the same way as free functions are, so do that. --- 1. Not sure how many more tests I should add, since this uses the same code paths as free functions. 2. This is the 5th instance of the `isStatic` matcher in `clang-tidy`. --- Full diff: https://github.com/llvm/llvm-project/pull/119974.diff 2 Files Affected: - (modified) clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp (+5-1) - (modified) clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-initialization.cpp (+24) ``````````diff diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp index 034894c11bf2c0..778d1d00250315 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -104,6 +104,10 @@ AST_MATCHER_FUNCTION_P(StatementMatcher, hasArgument(0, hasType(ReceiverType))))); } +namespace { +AST_MATCHER(CXXMethodDecl, isStatic) { return Node.isStatic(); } +} // namespace + AST_MATCHER_FUNCTION(StatementMatcher, isConstRefReturningFunctionCall) { // Only allow initialization of a const reference from a free function if it // has no arguments. Otherwise it could return an alias to one of its @@ -111,7 +115,7 @@ AST_MATCHER_FUNCTION(StatementMatcher, isConstRefReturningFunctionCall) { return callExpr(callee(functionDecl(returns(hasCanonicalType( matchers::isReferenceToConst()))) .bind(FunctionDeclId)), - argumentCountIs(0), unless(callee(cxxMethodDecl()))) + argumentCountIs(0), unless(callee(cxxMethodDecl(unless(isStatic()))))) .bind(InitFunctionCallId); } diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-initialization.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-initialization.cpp index d02bb98cf583cb..b5325776f54c61 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-initialization.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-copy-initialization.cpp @@ -28,6 +28,8 @@ struct ExpensiveToCopyType { template <typename A> const A &templatedAccessor() const; operator int() const; // Implicit conversion to int. + + static const ExpensiveToCopyType &instance(); }; template <typename T> @@ -100,6 +102,28 @@ void PositiveFunctionCall() { VarCopyConstructed.constMethod(); } +void PositiveStaticMethodCall() { + const auto AutoAssigned = ExpensiveToCopyType::instance(); + // CHECK-MESSAGES: [[@LINE-1]]:14: warning: the const qualified variable 'AutoAssigned' is copy-constructed from a const reference; consider making it a const reference [performance-unnecessary-copy-initialization] + // CHECK-FIXES: const auto& AutoAssigned = ExpensiveToCopyType::instance(); + AutoAssigned.constMethod(); + + const auto AutoCopyConstructed(ExpensiveToCopyType::instance()); + // CHECK-MESSAGES: [[@LINE-1]]:14: warning: the const qualified variable 'AutoCopyConstructed' + // CHECK-FIXES: const auto& AutoCopyConstructed(ExpensiveToCopyType::instance()); + AutoCopyConstructed.constMethod(); + + const ExpensiveToCopyType VarAssigned = ExpensiveToCopyType::instance(); + // CHECK-MESSAGES: [[@LINE-1]]:29: warning: the const qualified variable 'VarAssigned' + // CHECK-FIXES: const ExpensiveToCopyType& VarAssigned = ExpensiveToCopyType::instance(); + VarAssigned.constMethod(); + + const ExpensiveToCopyType VarCopyConstructed(ExpensiveToCopyType::instance()); + // CHECK-MESSAGES: [[@LINE-1]]:29: warning: the const qualified variable 'VarCopyConstructed' + // CHECK-FIXES: const ExpensiveToCopyType& VarCopyConstructed(ExpensiveToCopyType::instance()); + VarCopyConstructed.constMethod(); +} + void PositiveMethodCallConstReferenceParam(const ExpensiveToCopyType &Obj) { const auto AutoAssigned = Obj.reference(); // CHECK-MESSAGES: [[@LINE-1]]:14: warning: the const qualified variable 'AutoAssigned' `````````` </details> https://github.com/llvm/llvm-project/pull/119974 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits