diff --git a/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp b/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp --- a/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp @@ -685,12 +685,18 @@ const BindArgument &ObjPtr = FunctionCallArgs.front(); Stream << " { "; - if (!isa(ignoreTemporariesAndPointers(ObjPtr.E))) { - Stream << ObjPtr.UsageIdentifier; - Stream << "->"; + if (!MethodDecl->getReturnType()->isVoidType()) { + Stream << "return "; + } + if (MethodDecl->getOverloadedOperator() == OO_Call) { + Stream << "(*" << ObjPtr.UsageIdentifier << ')'; + } else { + if (!isa(ignoreTemporariesAndPointers(ObjPtr.E))) { + Stream << ObjPtr.UsageIdentifier; + Stream << "->"; + } + Stream << MethodDecl->getNameAsString(); } - - Stream << MethodDecl->getName(); } else { Stream << " { return "; switch (LP.Callable.CE) { diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize-avoid-bind.cpp @@ -43,6 +43,7 @@ struct D { D() = default; void operator()(int x, int y) const {} + operator bool() const { return true; } void MemberFunction(int x) {} @@ -340,6 +341,7 @@ struct E { void MemberFunction(int x) {} + int operator()(int x, int y) const { return x + y; } void testMemberFunctions() { D *d; @@ -360,6 +362,26 @@ auto DDD = std::bind(&D::MemberFunction, _1, 1); // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind // CHECK-FIXES: auto DDD = [](auto && PH1) { PH1->MemberFunction(1); }; + + auto EEE = std::bind(&D::operator(), d, 1, 2); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind + // CHECK-FIXES: auto EEE = [d] { (*d)(1, 2); } + + auto FFF = std::bind(&D::operator(), &dd, 1, 2); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind + // CHECK-FIXES: auto FFF = [ObjectPtr = &dd] { (*ObjectPtr)(1, 2); } + + auto GGG = std::bind(&D::operator(), _1, 1, 2); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind + // CHECK-FIXES: auto GGG = [](auto && PH1) { (*PH1)(1, 2); }; + + auto HHH = std::bind(&D::operator bool, d); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind + // CHECK-FIXES: auto HHH = [d] { return d->operator bool(); } + + auto III = std::bind(&E::operator(), this, 1, 2); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind + // CHECK-FIXES: auto III = [this] { return (*this)(1, 2); } } };