[clang-tidy] ObjC ARC objects should not trigger performance-unnecessary-value-param
authorBen Hamilton <benhamilton@google.com>
Fri, 2 Feb 2018 15:34:33 +0000 (15:34 +0000)
committerBen Hamilton <benhamilton@google.com>
Fri, 2 Feb 2018 15:34:33 +0000 (15:34 +0000)
commitb4ab4b631717779e7fc4787b7cbf36b76b32e346
treee34c262c5a5ee6232b844c60b7ce92dbc73f48d7
parent24656332342583c1222d776b0174fd7f2178d9b7
[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

llvm-svn: 324097
clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
clang-tools-extra/clang-tidy/utils/TypeTraits.cpp
clang-tools-extra/test/clang-tidy/performance-unnecessary-value-param-arc.m [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/performance-unnecessary-value-param-arc.mm [new file with mode: 0644]