diff options
| author | Zachary Turner <zturner@roblox.com> | 2019-11-20 11:27:14 -0800 |
|---|---|---|
| committer | Zachary Turner <zturner@roblox.com> | 2019-12-02 15:36:26 -0800 |
| commit | 64f74bf72eb484aa32e1104050cb54745116decf (patch) | |
| tree | 16787356f6c7c67b23b603098880a12eb55fca28 /clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp | |
| parent | 87f146767ed709f6e354fe46f325c5b6848ad428 (diff) | |
| download | bcm5719-llvm-64f74bf72eb484aa32e1104050cb54745116decf.tar.gz bcm5719-llvm-64f74bf72eb484aa32e1104050cb54745116decf.zip | |
[clang-tidy] Rewrite modernize-avoid-bind check.
This represents largely a full re-write of modernize-avoid-bind, adding
significant new functionality in the process. In particular:
* Both boost::bind and std::bind are now supported
* Function objects are supported in addition to functions
* Member functions are supported
* Nested calls are supported using capture-init syntax
* std::ref() and boost::ref() are now recognized, and will capture by reference.
* Rather than capturing with a global =, we now build up an individual
capture list that is both necessary and sufficient for the call.
* Fixits are supported in a much larger variety of scenarios than before.
All previous tests pass under the re-write, but a large number of new
tests have been added as well.
Differential Revision: https://reviews.llvm.org/D70368
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp new file mode 100644 index 00000000000..6c81a6e9ab9 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind-permissive-parameter-list.cpp @@ -0,0 +1,58 @@ +// RUN: %check_clang_tidy -std=c++14-or-later %s modernize-avoid-bind %t -- \ +// RUN: -config="{CheckOptions: [ \ +// RUN: {key: modernize-avoid-bind.PermissiveParameterList, value: 1}]}" -- + +namespace std { +inline namespace impl { +template <class Fp, class... Arguments> +class bind_rt {}; + +template <class Fp, class... Arguments> +bind_rt<Fp, Arguments...> bind(Fp &&, Arguments &&...); +} // namespace impl + +template <typename T> +T ref(T &t); +} // namespace std + +int add(int x, int y) { return x + y; } + +// Let's fake a minimal std::function-like facility. +namespace std { +template <typename _Tp> +_Tp declval(); + +template <typename _Functor, typename... _ArgTypes> +struct __res { + template <typename... _Args> + static decltype(declval<_Functor>()(_Args()...)) _S_test(int); + + template <typename...> + static void _S_test(...); + + using type = decltype(_S_test<_ArgTypes...>(0)); +}; + +template <typename> +struct function; + +template <typename... _ArgTypes> +struct function<void(_ArgTypes...)> { + template <typename _Functor, + typename = typename __res<_Functor, _ArgTypes...>::type> + function(_Functor) {} +}; +} // namespace std + +struct placeholder {}; +placeholder _1; + +void testLiteralParameters() { + auto AAA = std::bind(add, 2, 2); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind [modernize-avoid-bind] + // CHECK-FIXES: auto AAA = [](auto && ...) { return add(2, 2); }; + + auto BBB = std::bind(add, _1, 2); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind [modernize-avoid-bind] + // CHECK-FIXES: auto BBB = [](auto && PH1, auto && ...) { return add(PH1, 2); }; +} |

