https://github.com/gxyd updated https://github.com/llvm/llvm-project/pull/191432
>From 53379153367e36adf2bb8a36088b78ba6d65ede2 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Fri, 10 Apr 2026 19:55:21 +0530 Subject: [PATCH 1/8] [clang-tidy] Unresolve member function call can't be static readability-convert-member-functions-to-static incorrectly suggests making overloaded member function, with lambda function call, as static (false-positive) Mark usage of "this" as true, when a call to "UnresolveMemberExpr" is obvserved Fixes #171626 --- .../readability/ConvertMemberFunctionsToStaticCheck.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp index 40952b2fc9d0c..8b0debc78bb77 100644 --- a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp @@ -64,6 +64,11 @@ AST_MATCHER(CXXMethodDecl, usesThis) { return false; // Stop traversal. } + bool VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *E) { + Used = true; + return false; + } + // If we enter a class declaration, don't traverse into it as any usages of // `this` will correspond to the nested class. bool TraverseCXXRecordDecl(CXXRecordDecl *RD) { return true; } >From 4087cf9ee29ed167c839c2f4f3cdfc4a68dc3ceb Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Fri, 10 Apr 2026 20:07:06 +0530 Subject: [PATCH 2/8] add tests for overloaded unresolve with lambda call --- ...mber-functions-to-static-deducing-this.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp index a6ca86dd7cefa..790c8f0f927cc 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp @@ -20,3 +20,27 @@ struct Hello { void UnnamedExplicitObjectParam(this Hello &) {} }; + + +class OverloadedUnresolvedWithAutoLambda { +public: + void CallsFunctionVar(); + void CallsOverloadedMethodWithArg(int a); + void OverloadedMethodWithoutArg(); + void OverloadedMethodWithArg(int a) { }; +}; + +void OverloadedUnresolvedWithAutoLambda::CallsFunctionVar() { + // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: method 'CallsFunctionVar' can be made static [readability-convert-member-functions-to-static] + auto fun = [&](auto a) { + var(a); + }; +} + +void OverloadedUnresolvedWithAutoLambda::CallsOverloadedMethodWithArg(int a) { + auto fun = [&](auto b) { + OverloadedMethodWithArg(b); + }; +} + +void Var(int a) { } >From 7e4383da88de69547ca3092d1e375defd001db05 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Sun, 12 Apr 2026 21:16:37 +0530 Subject: [PATCH 3/8] add ReleaseNotes entry --- clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index f70bf9e9f9eb8..0bf56708f2f92 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -480,6 +480,11 @@ Changes in existing checks avoiding false positive on ``const`` member functions to static when they are a part of const/non-const overload pair. +- Improved :doc:`readability-convert-member-functions-to-static + <clang-tidy/checks/readability/convert-member-functions-to-static>` check to + correctly detect ``this`` usage within a member function with a call to an + overloaded method inside a generic lambda. + - Improved :doc:`readability-else-after-return <clang-tidy/checks/readability/else-after-return>` check: >From 914e34f844529ed26995a53ad5d4902a1e9bc123 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Wed, 22 Apr 2026 15:05:57 +0530 Subject: [PATCH 4/8] split release notes entries and improve grammar used claude AI to help improve the grammar and I've ensured that it does look technically correct --- clang-tools-extra/docs/ReleaseNotes.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 0bf56708f2f92..10a8249d318f3 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -476,14 +476,13 @@ Changes in existing checks ``empty`` function. - Improved :doc:`readability-convert-member-functions-to-static - <clang-tidy/checks/readability/convert-member-functions-to-static>` check by - avoiding false positive on ``const`` member functions to static when they are - a part of const/non-const overload pair. + <clang-tidy/checks/readability/convert-member-functions-to-static>` check: -- Improved :doc:`readability-convert-member-functions-to-static - <clang-tidy/checks/readability/convert-member-functions-to-static>` check to - correctly detect ``this`` usage within a member function with a call to an - overloaded method inside a generic lambda. + - Fixing a false positive where ``const`` member functions were incorrectly + flagged when they are part of a const/non-const overload pair. + + - Correctly detecting ``this`` usage when a generic lambda calls an overloaded + member function. - Improved :doc:`readability-else-after-return <clang-tidy/checks/readability/else-after-return>` check: >From d8e71c36167f551647cb4e3d5d747d40e661c8d1 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Thu, 23 Apr 2026 11:27:10 +0530 Subject: [PATCH 5/8] actually overload the methods (this fixes the tests) --- .../convert-member-functions-to-static-deducing-this.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp index 790c8f0f927cc..df0b7e68bbfd2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp @@ -26,8 +26,8 @@ class OverloadedUnresolvedWithAutoLambda { public: void CallsFunctionVar(); void CallsOverloadedMethodWithArg(int a); - void OverloadedMethodWithoutArg(); - void OverloadedMethodWithArg(int a) { }; + void OverloadedMethod(); + void OverloadedMethod(int a) { }; }; void OverloadedUnresolvedWithAutoLambda::CallsFunctionVar() { @@ -39,7 +39,7 @@ void OverloadedUnresolvedWithAutoLambda::CallsFunctionVar() { void OverloadedUnresolvedWithAutoLambda::CallsOverloadedMethodWithArg(int a) { auto fun = [&](auto b) { - OverloadedMethodWithArg(b); + OverloadedMethod(b); }; } >From 3d4b8b47d363495f11193ea9164ff3d2a1f9671f Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Thu, 23 Apr 2026 14:03:38 +0530 Subject: [PATCH 6/8] mark UnresolvedMemberExpr with "this" usage only for implicit access --- .../readability/ConvertMemberFunctionsToStaticCheck.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp index 8b0debc78bb77..21ac0034c67ac 100644 --- a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStaticCheck.cpp @@ -65,8 +65,11 @@ AST_MATCHER(CXXMethodDecl, usesThis) { } bool VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *E) { - Used = true; - return false; + if (E->isImplicitAccess()) { + Used = true; + return false; + } + return true; // Continue traversal. } // If we enter a class declaration, don't traverse into it as any usages of >From 6b65da935eff3b58c25702fe680d50e51b46d71d Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Thu, 23 Apr 2026 14:55:43 +0530 Subject: [PATCH 7/8] add more robust tests --- ...mber-functions-to-static-deducing-this.cpp | 104 +++++++++++++++++- 1 file changed, 98 insertions(+), 6 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp index df0b7e68bbfd2..42e0c39254265 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp @@ -21,26 +21,118 @@ struct Hello { void UnnamedExplicitObjectParam(this Hello &) {} }; +class BaseOverloadedAutoLambdaTest { +public: + void BaseOverloadedMethod(); + void BaseOverloadedMethod(int a) { }; +}; + -class OverloadedUnresolvedWithAutoLambda { +class OverloadedAutoLambdaTest : public BaseOverloadedAutoLambdaTest { public: - void CallsFunctionVar(); - void CallsOverloadedMethodWithArg(int a); + void CallFunVar(); + void LambdaUsesThis1(int a); + void LambdaUsesThis2(int a); + void LambdaUsesThis3(int a); + void LambdaUsesThis4(); + void LambdaUsesThis5(); + + void LambdaNoThis1(int a); + void LambdaNoThis2(int a); + void LambdaNoThis3(int a); + void LambdaNoThis4(int a); + void LambdaNoThis5(int a); + void OverloadedMethod(); void OverloadedMethod(int a) { }; + + template <typename T> + void TemplatedOverloadedMethod(T); + void TemplatedOverloadedMethod(int); }; -void OverloadedUnresolvedWithAutoLambda::CallsFunctionVar() { - // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: method 'CallsFunctionVar' can be made static [readability-convert-member-functions-to-static] +void OverloadedAutoLambdaTest::CallFunVar() { + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: method 'CallFunVar' can be made static [readability-convert-member-functions-to-static] auto fun = [&](auto a) { var(a); }; } -void OverloadedUnresolvedWithAutoLambda::CallsOverloadedMethodWithArg(int a) { +void OverloadedAutoLambdaTest::LambdaUsesThis1(int a) { auto fun = [&](auto b) { OverloadedMethod(b); }; } +void OverloadedAutoLambdaTest::LambdaUsesThis2(int a) { + auto fun = [&](auto b) { + this->OverloadedMethod(b); + }; +} + +void OverloadedAutoLambdaTest::LambdaNoThis1(int a) { + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: method 'LambdaNoThis1' can be made static [readability-convert-member-functions-to-static] + OverloadedAutoLambdaTest f; + auto fun = [&](auto b) { + f.OverloadedMethod(b); + }; +} + +void OverloadedAutoLambdaTest::LambdaUsesThis3(int a) { + OverloadedAutoLambdaTest g; + auto fun1 = [&](auto a) { + auto fun2 = [&](auto b) { + OverloadedMethod(b); + }; + fun2(a); + }; +} + +void OverloadedAutoLambdaTest::LambdaNoThis2(int a) { + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: method 'LambdaNoThis2' can be made static [readability-convert-member-functions-to-static] + OverloadedAutoLambdaTest g; + auto fun1 = [&](auto a) { + auto fun2 = [&](auto b) { + g.OverloadedMethod(b); + }; + fun2(a); + }; +} + +void OverloadedAutoLambdaTest::LambdaUsesThis4() { + auto fun = [&](auto a) { + OverloadedMethod(a); + }; +} + +void OverloadedAutoLambdaTest::LambdaNoThis3(int a) { + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: method 'LambdaNoThis3' can be made static [readability-convert-member-functions-to-static] + OverloadedAutoLambdaTest f; + auto fun = [&](auto b) { + f.OverloadedMethod(b); + }; +} + +void OverloadedAutoLambdaTest::LambdaNoThis4(int a) { + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: method 'LambdaNoThis4' can be made static [readability-convert-member-functions-to-static] + BaseOverloadedAutoLambdaTest f; + auto fun = [&](auto b) { + f.BaseOverloadedMethod(b); + }; +} + +void OverloadedAutoLambdaTest::LambdaNoThis5(int a) { + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: method 'LambdaNoThis5' can be made static [readability-convert-member-functions-to-static] + OverloadedAutoLambdaTest f; + auto fun = [&](auto b) { + f.BaseOverloadedMethod(b); + }; +} + +void OverloadedAutoLambdaTest::LambdaUsesThis5() { + auto fun = [&](auto b) { + TemplatedOverloadedMethod(b); + }; +} + void Var(int a) { } >From fb385f9803dfd45e93e661da5f0635d74618f707 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra <[email protected]> Date: Wed, 6 May 2026 21:29:04 +0530 Subject: [PATCH 8/8] add tests using CHECK-FIXES as well to test `-fix` --- .../convert-member-functions-to-static-deducing-this.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp index 42e0c39254265..0fb7bec28e161 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp @@ -31,6 +31,7 @@ class BaseOverloadedAutoLambdaTest { class OverloadedAutoLambdaTest : public BaseOverloadedAutoLambdaTest { public: void CallFunVar(); + // CHECK-FIXES: static void CallFunVar(); void LambdaUsesThis1(int a); void LambdaUsesThis2(int a); void LambdaUsesThis3(int a); @@ -38,10 +39,15 @@ class OverloadedAutoLambdaTest : public BaseOverloadedAutoLambdaTest { void LambdaUsesThis5(); void LambdaNoThis1(int a); + // CHECK-FIXES: static void LambdaNoThis1(int a); void LambdaNoThis2(int a); + // CHECK-FIXES: static void LambdaNoThis2(int a); void LambdaNoThis3(int a); + // CHECK-FIXES: static void LambdaNoThis3(int a); void LambdaNoThis4(int a); + // CHECK-FIXES: static void LambdaNoThis4(int a); void LambdaNoThis5(int a); + // CHECK-FIXES: static void LambdaNoThis5(int a); void OverloadedMethod(); void OverloadedMethod(int a) { }; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
