PiotrZSL updated this revision to Diff 547475. PiotrZSL edited the summary of this revision. PiotrZSL added a comment.
Properly handle situation when class is forward-declared as struct. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D157190/new/ https://reviews.llvm.org/D157190 Files: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp Index: clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp @@ -707,3 +707,13 @@ task ImplicitDeclTest(async_obj &a_object) { co_await a_object; // CHECK-MESSAGES-NOT: warning: invalid case style for local variable } + +// Test scenario when canonical declaration will be a forward declaration +struct class_with_forward_decl; +// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for class 'class_with_forward_decl' [readability-identifier-naming] +// CHECK-FIXES: {{^}}struct CClassWithForwardDecl; +// CHECK-FIXES: {{^}}class CClassWithForwardDecl { +class class_with_forward_decl { + int __value; +}; + Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ clang-tools-extra/docs/ReleaseNotes.rst @@ -163,6 +163,10 @@ <clang-tidy/checks/bugprone/reserved-identifier>`, so that it does not warn on macros starting with underscore and lowercase letter. +- Improved the :doc:`readability-identifier-naming + <clang-tidy/checks/readability/identifier-naming>` check to emit proper + warnings when a type forward declaration precedes its definition. + Removed checks ^^^^^^^^^^^^^^ Index: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -1140,30 +1140,28 @@ if (Decl->isAnonymousStructOrUnion()) return SK_Invalid; - if (!Decl->getCanonicalDecl()->isThisDeclarationADefinition()) - return SK_Invalid; - - if (Decl->hasDefinition() && Decl->isAbstract() && - NamingStyles[SK_AbstractClass]) - return SK_AbstractClass; + if (const auto *Definition = Decl->getDefinition()) { + if (Definition->isAbstract() && NamingStyles[SK_AbstractClass]) + return SK_AbstractClass; - if (Decl->isStruct() && NamingStyles[SK_Struct]) - return SK_Struct; + if (Definition->isStruct() && NamingStyles[SK_Struct]) + return SK_Struct; - if (Decl->isStruct() && NamingStyles[SK_Class]) - return SK_Class; + if (Definition->isStruct() && NamingStyles[SK_Class]) + return SK_Class; - if (Decl->isClass() && NamingStyles[SK_Class]) - return SK_Class; + if (Definition->isClass() && NamingStyles[SK_Class]) + return SK_Class; - if (Decl->isClass() && NamingStyles[SK_Struct]) - return SK_Struct; + if (Definition->isClass() && NamingStyles[SK_Struct]) + return SK_Struct; - if (Decl->isUnion() && NamingStyles[SK_Union]) - return SK_Union; + if (Definition->isUnion() && NamingStyles[SK_Union]) + return SK_Union; - if (Decl->isEnum() && NamingStyles[SK_Enum]) - return SK_Enum; + if (Definition->isEnum() && NamingStyles[SK_Enum]) + return SK_Enum; + } return SK_Invalid; }
Index: clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp @@ -707,3 +707,13 @@ task ImplicitDeclTest(async_obj &a_object) { co_await a_object; // CHECK-MESSAGES-NOT: warning: invalid case style for local variable } + +// Test scenario when canonical declaration will be a forward declaration +struct class_with_forward_decl; +// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for class 'class_with_forward_decl' [readability-identifier-naming] +// CHECK-FIXES: {{^}}struct CClassWithForwardDecl; +// CHECK-FIXES: {{^}}class CClassWithForwardDecl { +class class_with_forward_decl { + int __value; +}; + Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ clang-tools-extra/docs/ReleaseNotes.rst @@ -163,6 +163,10 @@ <clang-tidy/checks/bugprone/reserved-identifier>`, so that it does not warn on macros starting with underscore and lowercase letter. +- Improved the :doc:`readability-identifier-naming + <clang-tidy/checks/readability/identifier-naming>` check to emit proper + warnings when a type forward declaration precedes its definition. + Removed checks ^^^^^^^^^^^^^^ Index: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -1140,30 +1140,28 @@ if (Decl->isAnonymousStructOrUnion()) return SK_Invalid; - if (!Decl->getCanonicalDecl()->isThisDeclarationADefinition()) - return SK_Invalid; - - if (Decl->hasDefinition() && Decl->isAbstract() && - NamingStyles[SK_AbstractClass]) - return SK_AbstractClass; + if (const auto *Definition = Decl->getDefinition()) { + if (Definition->isAbstract() && NamingStyles[SK_AbstractClass]) + return SK_AbstractClass; - if (Decl->isStruct() && NamingStyles[SK_Struct]) - return SK_Struct; + if (Definition->isStruct() && NamingStyles[SK_Struct]) + return SK_Struct; - if (Decl->isStruct() && NamingStyles[SK_Class]) - return SK_Class; + if (Definition->isStruct() && NamingStyles[SK_Class]) + return SK_Class; - if (Decl->isClass() && NamingStyles[SK_Class]) - return SK_Class; + if (Definition->isClass() && NamingStyles[SK_Class]) + return SK_Class; - if (Decl->isClass() && NamingStyles[SK_Struct]) - return SK_Struct; + if (Definition->isClass() && NamingStyles[SK_Struct]) + return SK_Struct; - if (Decl->isUnion() && NamingStyles[SK_Union]) - return SK_Union; + if (Definition->isUnion() && NamingStyles[SK_Union]) + return SK_Union; - if (Decl->isEnum() && NamingStyles[SK_Enum]) - return SK_Enum; + if (Definition->isEnum() && NamingStyles[SK_Enum]) + return SK_Enum; + } return SK_Invalid; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits