aboutsummaryrefslogtreecommitdiff
path: root/clang-tidy/performance
diff options
context:
space:
mode:
authorBen Hamilton <benhamilton@google.com>2018-02-02 15:34:33 +0000
committerBen Hamilton <benhamilton@google.com>2018-02-02 15:34:33 +0000
commitc29d57843fbf33f5ec24fce7f1bd5a34e072868f (patch)
treebfaa3de45fdc93dc4a6e8cb6106ad02f27d6e946 /clang-tidy/performance
parent60bd726ae3e6f38dd76e8747d56018b53a60b800 (diff)
[clang-tidy] ObjC ARC objects should not trigger performance-unnecessary-value-param
Summary: The following Objective-C code currently incorrectly triggers clang-tidy's performance-unnecessary-value-param check: ``` % cat /tmp/performance-unnecessary-value-param-arc.m void foo(id object) { } clang-tidy /tmp/performance-unnecessary-value-param-arc.m -checks=-\*,performance-unnecessary-value-param -- -xobjective-c -fobjc-abi-version=2 -fobjc-arc 1 warning generated. /src/llvm/tools/clang/tools/extra/test/clang-tidy/performance-unnecessary-value-param-arc.m:10:13: warning: the parameter 'object' is copied for each invocation but only used as a const reference; consider making it a const reference [performance-unnecessary-value-param] void foo(id object) { } ~~ ^ const & ``` This is wrong for a few reasons: 1) Objective-C doesn't have references, so `const &` is not going to help 2) ARC heavily optimizes the "expensive" copy which triggers the warning This fixes the issue by disabling the warning for non-C++, as well as disabling it for objects under ARC memory management for Objective-C++. Fixes https://bugs.llvm.org/show_bug.cgi?id=32075 Test Plan: New tests added. Ran tests with `make -j12 check-clang-tools`. Reviewers: alexfh, hokein Reviewed By: hokein Subscribers: stephanemoore, klimek, xazax.hun, cfe-commits, Wizard Differential Revision: https://reviews.llvm.org/D42812 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@324097 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clang-tidy/performance')
-rw-r--r--clang-tidy/performance/UnnecessaryValueParamCheck.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/clang-tidy/performance/UnnecessaryValueParamCheck.cpp b/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
index 0dc47d5d..e277ad34 100644
--- a/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
+++ b/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
@@ -79,6 +79,10 @@ UnnecessaryValueParamCheck::UnnecessaryValueParamCheck(
Options.getLocalOrGlobal("IncludeStyle", "llvm"))) {}
void UnnecessaryValueParamCheck::registerMatchers(MatchFinder *Finder) {
+ // This check is specific to C++ and doesn't apply to languages like
+ // Objective-C.
+ if (!getLangOpts().CPlusPlus)
+ return;
const auto ExpensiveValueParamDecl =
parmVarDecl(hasType(hasCanonicalType(allOf(
unless(referenceType()), matchers::isExpensiveToCopy()))),