From: Nathan James Date: Sat, 24 Jun 2023 14:18:20 +0000 (+0000) Subject: [clang-tidy] Fix false negative in readability-convert-member-functions-to-static X-Git-Tag: upstream/17.0.6~3974 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=67e05d380c2253319c22451d340e2e3c2043b6d8;p=platform%2Fupstream%2Fllvm.git [clang-tidy] Fix false negative in readability-convert-member-functions-to-static A nested class in a member function can erroneously confuse the check into thinking that any CXXThisExpr found relate to the outer class, preventing any warnings. Fix this by not traversing any nested classes. Fixes https://github.com/llvm/llvm-project/issues/56765 Reviewed By: PiotrZSL Differential Revision: https://reviews.llvm.org/D130665 --- diff --git a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp index 0ef7d29..1284df6 100644 --- a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp +++ b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp @@ -61,6 +61,11 @@ AST_MATCHER(CXXMethodDecl, usesThis) { Used = true; return false; // Stop traversal. } + + // 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; } + } UsageOfThis; // TraverseStmt does not modify its argument. diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index e049ff8..0342677 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -412,6 +412,10 @@ Changes in existing checks ``std::array`` objects to default constructed ones. The behavior for this and other relevant classes can now be configured with a new option. +- Fixed a false negative in :doc:`readability-convert-member-functions-to-static + ` when a + nested class in a member function uses a ``this`` pointer. + - Fixed reading `HungarianNotation.CString.*` options in :doc:`readability-identifier-naming ` check. diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static.cpp index 9612fa9..5ec1f22 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static.cpp @@ -45,6 +45,24 @@ class A { static_field = 1; } + void static_nested() { + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'static_nested' can be made static + // CHECK-FIXES: {{^}} static void static_nested() { + struct Nested { + int Foo; + int getFoo() { return Foo; } + }; + } + + void write_nested() { + struct Nested { + int Foo; + int getFoo() { return Foo; } + }; + // Ensure we still detect usages of `this` once we leave the nested class definition. + field = 1; + } + static int already_static() { return static_field; } int already_const() const { return field; }