[PATCH] D102325: [clang-tidy] cppcoreguidelines-virtual-base-class-destructor: a new check

Nathan James via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 12 08:17:42 PDT 2021


njames93 added a comment.

Whats the intended behaviour for derived classes and their destructors? Can test be added to demonstrate that behaviour?



================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:44
+         "making it public and virtual or protected and non-virtual")
+        << (MatchedClassOrStruct->isClass() ? "class" : "struct")
+        << MatchedClassOrStruct;
----------------
Printing `class` or `struct` here isn't necessary, but if you really feel it should be included use `%select{class|struct}0` instead.


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:51
+  // Implicit destructors are public and non-virtual for classes and structs.
+  std::string TypeAndVirtuality = "public and non-virtual";
+  FixItHint Fix;
----------------
This can no be made a bool, see below for the Diag.


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:68
+  diag(MatchedClassOrStruct->getLocation(),
+       "destructor of %0 %1 is %2. It should either be public and virtual or "
+       "protected and non-virtual")
----------------



================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:70
+       "protected and non-virtual")
+      << (MatchedClassOrStruct->isClass() ? "class" : "struct")
+      << MatchedClassOrStruct << TypeAndVirtuality << Fix;
----------------
Again this can be removed.


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:74
+
+CharSourceRange VirtualBaseClassDestructorCheck::getVirtualKeywordRange(
+    const CXXDestructorDecl &Destructor, const SourceManager &SM,
----------------
This doesn't need to be part of the class and should just be a static function in this file.


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:101
+
+  auto ParentIndentation =
+      SourceManager.getExpansionColumnNumber(StructOrClass.getBeginLoc()) -
----------------
Eugene.Zelenko wrote:
> Please don't use auto unless type is spelled in same statement or iterator.
Again, don't worry about indentation, clang-format does that.


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:129
+
+AccessSpecDecl *VirtualBaseClassDestructorCheck::getPublicASDecl(
+    const CXXRecordDecl &StructOrClass) const {
----------------
Can be made static again. Also should probably return a `const AccessSpecDecl *`


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualBaseClassDestructorCheck.cpp:143-145
+std::string VirtualBaseClassDestructorCheck::indent(int Indentation) const {
+  return std::string().append(Indentation, ' ');
+}
----------------
As clang-format handles indentation, we can just remove this function.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D102325/new/

https://reviews.llvm.org/D102325



More information about the cfe-commits mailing list