diff options
author | Ben Hamilton <benhamilton@google.com> | 2018-02-02 15:34:33 +0000 |
---|---|---|
committer | Ben Hamilton <benhamilton@google.com> | 2018-02-02 15:34:33 +0000 |
commit | c29d57843fbf33f5ec24fce7f1bd5a34e072868f (patch) | |
tree | bfaa3de45fdc93dc4a6e8cb6106ad02f27d6e946 /clang-tidy/performance | |
parent | 60bd726ae3e6f38dd76e8747d56018b53a60b800 (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.cpp | 4 |
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()))), |