[PATCH] D44295: [clang-tidy] Detects and fixes calls to grand-...parent virtual methods instead of calls to parent's virtual methods

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 20 10:37:56 PDT 2018


aaron.ballman added inline comments.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:128
+      diag(Member->getQualifierLoc().getSourceRange().getBegin(),
+           "'%0' is a grand-parent's method, not parent's. Did you mean %1?")
+      << CalleeName << ParentsStr;
----------------
zinovy.nis wrote:
> aaron.ballman wrote:
> > zinovy.nis wrote:
> > > aaron.ballman wrote:
> > > > The diagnostic should not contain punctuation aside from the question mark.
> > > > 
> > > > Also, the diagnostic uses some novel terminology in "grandparent's method". How about: "qualified function name %0 refers to a function that is not defined by a direct base class; did you mean %1?"
> > > "is not defined by a direct base class" is not a correct proposal. Issues that this check finds are all about calling a grand-parent's method instead of parent's whether base class defines this method or not.
> > > 
> > > How about 
> > > 
> > > > Qualified function name %0 refers to a function not from a direct base class; did you mean %1?
> > > 
> > > ?
> > Not keen on "from", but we could use `"qualified function name %q0 refers to a function that is not explicitly declared by a direct base class; did you mean %1?"`
> Changed to  
> 
> > qualified name %0 refers to a member which was overridden in subclass%1"
> 
> 
Please use `%q0` rather than calling your custom qualified name function. The diagnostics engine will handle printing the qualified name appropriately for you.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:39
+                                           const CXXMethodDecl &MemberDecl) {
+  BasesVector result;
+  for (auto &Base : ThisClass.bases()) {
----------------
Local variables should be capitalized.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:40-41
+  BasesVector result;
+  for (auto &Base : ThisClass.bases()) {
+    auto *BaseDecl = Base.getType()->getAsCXXRecordDecl();
+    const auto *ActualMemberDecl =
----------------
Please add the `const` qualifier to both of these.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:42-43
+    auto *BaseDecl = Base.getType()->getAsCXXRecordDecl();
+    const auto *ActualMemberDecl =
+        MemberDecl.getCorrespondingMethodInClass(BaseDecl);
+    if (!ActualMemberDecl)
----------------
Do not use `auto` here.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:49-53
+    auto *TypePtr =
+        ActualMemberDecl->getThisType(ActualMemberDecl->getASTContext())
+            .getTypePtr();
+    assert(TypePtr);
+    auto *Type = TypePtr->getPointeeCXXRecordDecl();
----------------
Do not use `auto` here as the type is not explicitly spelled out in the initialization. Also, please do not name the local variable `Type` as 1) it seem to be a declaration, and 2) `Type` is a type name.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:54
+    auto *Type = TypePtr->getPointeeCXXRecordDecl();
+    assert(Type);
+    if (Type->getCanonicalDecl()->isDerivedFrom(&GrandParent))
----------------
Please add a message to your asserts so that if they trigger, the user gets something more helpful as the diagnostic. Same elsewhere.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:89
+
+  auto *Member = Result.Nodes.getNodeAs<MemberExpr>("member");
+  assert(Member);
----------------
Please put appropriate explicit qualifiers on all of the `auto` uses (here and elsewhere).


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:93
+  auto *MemberDecl = dyn_cast<CXXMethodDecl>(Member->getMemberDecl());
+  assert(MemberDecl);
+
----------------
Instead of `dyn_cast` followed by `assert()`, you should just use `cast<>`, but only if you're certain you cannot get anything other than a `CXXMethodDecl` out of the expression.


================
Comment at: clang-tidy/bugprone/ParentVirtualCallCheck.cpp:98
+
+  auto *ThisType = ThisTypePtr->getPointeeCXXRecordDecl();
+  assert(ThisType);
----------------
Do not use `auto` here.


================
Comment at: docs/clang-tidy/checks/bugprone-parent-virtual-call.rst:6
+
+Detects and fixes calls to grand-...parent virtual methods instead of calls
+to parent's virtual methods.
----------------
This formulation is a bit odd because of the `grand-...parent` part. I would reword to be more along the lines of: detects calls to qualified function names that refer to a function that is not explicitly declared by a direct base class.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D44295





More information about the cfe-commits mailing list