diff options
author | Jonas Toth <jonas.toth@gmail.com> | 2019-02-07 11:00:59 +0000 |
---|---|---|
committer | Jonas Toth <jonas.toth@gmail.com> | 2019-02-07 11:00:59 +0000 |
commit | 4d8ed1900ae0ccd37b5c1d1d92ff4ab4dbcd0c34 (patch) | |
tree | 35086c2120e5ac721308dadaf0d2d3a483ab691d | |
parent | 5acf26a46ec0493424d55165817ace5ad583759a (diff) | |
download | clang-tools-extra-4d8ed1900ae0ccd37b5c1d1d92ff4ab4dbcd0c34.tar.gz |
[clang-tidy] Fixed a std::bind() transformation
There was an extra semicolon that was somehow working in some contexts.
Patch by oleg.smolsky.
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@353389 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | clang-tidy/modernize/AvoidBindCheck.cpp | 2 | ||||
-rw-r--r-- | test/clang-tidy/modernize-avoid-bind.cpp | 44 |
2 files changed, 45 insertions, 1 deletions
diff --git a/clang-tidy/modernize/AvoidBindCheck.cpp b/clang-tidy/modernize/AvoidBindCheck.cpp index 44174243..c51b6e86 100644 --- a/clang-tidy/modernize/AvoidBindCheck.cpp +++ b/clang-tidy/modernize/AvoidBindCheck.cpp @@ -169,7 +169,7 @@ void AvoidBindCheck::check(const MatchFinder::MatchResult &Result) { Ref->printPretty(Stream, nullptr, Result.Context->getPrintingPolicy()); Stream << "("; addFunctionCallArgs(Args, Stream); - Stream << "); };"; + Stream << "); }"; Diag << FixItHint::CreateReplacement(MatchedDecl->getSourceRange(), Stream.str()); diff --git a/test/clang-tidy/modernize-avoid-bind.cpp b/test/clang-tidy/modernize-avoid-bind.cpp index 1c78b9e6..721801be 100644 --- a/test/clang-tidy/modernize-avoid-bind.cpp +++ b/test/clang-tidy/modernize-avoid-bind.cpp @@ -77,3 +77,47 @@ void n() { // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind // CHECK-FIXES: auto clj = [] { return C::add(1, 1); }; } + +// 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 Thing {}; +void UseThing(Thing *); + +struct Callback { + Callback(); + Callback(std::function<void()>); + void Reset(std::function<void()>); +}; + +void test(Thing *t) { + Callback cb; + if (t) + cb.Reset(std::bind(UseThing, t)); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind + // CHECK-FIXES: cb.Reset([=] { return UseThing(t); }); +} |