Repair various issues with modernize-avoid-bind
authorJeff Trull <edaskel@att.net>
Thu, 25 Jun 2020 11:29:53 +0000 (07:29 -0400)
committerAaron Ballman <aaron@aaronballman.com>
Thu, 25 Jun 2020 11:29:53 +0000 (07:29 -0400)
commit95a3550dc89a0d424d90e2c0ad30d9ecfa9422cf
tree2dfaf7615dfef9efa070b96d53b6168dec89dcfa
parentc95ffadb2474a4d8c4f598d94d35a9f31d9606cb
Repair various issues with modernize-avoid-bind

In the process of running this check on a large codebase I found a
number of limitations, and thought I would pass on my fixes for
possible integration upstream:

* Templated function call operators are not supported
* Function object constructors are always used directly in the lambda
  body, even if their arguments are not captured
* Placeholders with namespace qualifiers (std::placeholders::_1) are
  not detected
* Lambda arguments should be forwarded to the stored function
* Data members from other classes still get captured with this
* Expressions (as opposed to variables) inside std::ref are not captured
  properly
* Function object templates sometimes have their template arguments
  replaced with concrete types

This patch resolves all those issues and adds suitable unit tests.
clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp
clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp
clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind.cpp