summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp14
-rw-r--r--clang-tools-extra/test/clang-tidy/modernize-avoid-bind.cpp9
2 files changed, 18 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp b/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp
index c7c51a25e99..2b9a4827d12 100644
--- a/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp
@@ -108,8 +108,9 @@ void AvoidBindCheck::registerMatchers(MatchFinder *Finder) {
return;
Finder->addMatcher(
- callExpr(callee(namedDecl(hasName("::std::bind"))),
- hasArgument(0, declRefExpr(to(functionDecl().bind("f")))))
+ callExpr(
+ callee(namedDecl(hasName("::std::bind"))),
+ hasArgument(0, declRefExpr(to(functionDecl().bind("f"))).bind("ref")))
.bind("bind"),
this);
}
@@ -148,14 +149,17 @@ void AvoidBindCheck::check(const MatchFinder::MatchResult &Result) {
bool HasCapturedArgument = llvm::any_of(
Args, [](const BindArgument &B) { return B.Kind == BK_Other; });
-
+ const auto *Ref = Result.Nodes.getNodeAs<DeclRefExpr>("ref");
Stream << "[" << (HasCapturedArgument ? "=" : "") << "]";
addPlaceholderArgs(Args, Stream);
- Stream << " { return " << F->getName() << "(";
+ Stream << " { return ";
+ Ref->printPretty(Stream, nullptr, Result.Context->getPrintingPolicy());
+ Stream<< "(";
addFunctionCallArgs(Args, Stream);
Stream << "); };";
- Diag << FixItHint::CreateReplacement(MatchedDecl->getSourceRange(), Stream.str());
+ Diag << FixItHint::CreateReplacement(MatchedDecl->getSourceRange(),
+ Stream.str());
}
} // namespace modernize
diff --git a/clang-tools-extra/test/clang-tidy/modernize-avoid-bind.cpp b/clang-tools-extra/test/clang-tidy/modernize-avoid-bind.cpp
index 40b5fc2b95f..1c78b9e6305 100644
--- a/clang-tools-extra/test/clang-tidy/modernize-avoid-bind.cpp
+++ b/clang-tools-extra/test/clang-tidy/modernize-avoid-bind.cpp
@@ -68,3 +68,12 @@ void m() {
// CHECK-FIXES: auto clj = std::bind(add, 1, add(2, 5));
}
+namespace C {
+ int add(int x, int y){ return x + y; }
+}
+
+void n() {
+ auto clj = std::bind(C::add, 1, 1);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
+ // CHECK-FIXES: auto clj = [] { return C::add(1, 1); };
+}
OpenPOWER on IntegriCloud