HomePhabricator

[clang-tidy] misc-unused-parameters: Don't remove parameter from lambda

Authored by mgehre on Apr 7 2020, 2:36 PM.

Description

[clang-tidy] misc-unused-parameters: Don't remove parameter from lambda

Summary:
Previously, the check would fix

using fn = void(int);
void f(fn *);
void test() {
  // CHECK-MESSAGES: :[[@LINE+2]]:12: warning: parameter 'I' is unused
  // CHECK-FIXES: {{^}}  f([](int  /*I*/) {
  f([](int I) { return; });
}

into
f([]() { return; }); which breaks compilation. Now the check is disabled from Lambdas.

The AST is not so easy to use. For

auto l = [](int) {  return;  };
f(l);

one gets

`-CallExpr <line:7:5, col:8> 'void'
     |-ImplicitCastExpr <col:5> 'void (*)(fn *)' <FunctionToPointerDecay>
     | `-DeclRefExpr <col:5> 'void (fn *)' lvalue Function 0x55a91a545e28 'f' 'void (fn *)'
     `-ImplicitCastExpr <col:7> 'void (*)(int)' <UserDefinedConversion>
       `-CXXMemberCallExpr <col:7> 'void (*)(int)'
         `-MemberExpr <col:7> '<bound member function type>' .operator void (*)(int) 0x55a91a546850
           `-ImplicitCastExpr <col:7> 'const (lambda at line:6:14)' lvalue <NoOp>
             `-DeclRefExpr <col:7> '(lambda at line:6:14)':'(lambda at line:6:14)' lvalue Var 0x55a91a5461c0 'l' '(lambda at line:6:14)':'(lambda at line:6:14)'

There is no direct use of the operator()(int I) of the lambda, so the !Indexer->getOtherRefs(Function).empty()
does not fire. In the future, we might be able to use the conversion operator operator void (*)(int) to mark
the call operator as having an "other ref".

Reviewers: aaron.ballman, alexfh, hokein, njames93

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D77680