================
@@ -135,6 +138,42 @@ bool isFinal(const Decl *D) {
   return false;
 }
 
+// A method "overrides" if:
+// 1. It overrides at least one method
+// 2. At least one of the overridden methods is virtual (but NOT pure
+// virtual)
+bool isOverrides(const NamedDecl *ND) {
+  if (const auto *MD = llvm::dyn_cast<CXXMethodDecl>(ND)) {
+    if (MD->size_overridden_methods() == 0)
+      return false;
+
+    for (const auto *Overridden : MD->overridden_methods()) {
+      // Check if the overridden method is virtual but not pure virtual
+      if (Overridden->isVirtual() && !Overridden->isPureVirtual())
----------------
ArcsinX wrote:

I mean that if `MD->isVirtual()` is TRUE, then `Overridden->isVirtual()` must 
be TRUE. That's why we don't need to check `Overridden->isVirtual()` inside the 
loop.
But we can add assert inside the loop for a case when we face a bug in the 
clang.
I.e.
```cpp
  if (const auto *MD = llvm::dyn_cast<CXXMethodDecl>(ND)) {
    if (!MD->isVirtual())
      return false;

    for (const auto *Overridden : MD->overridden_methods()) {
      assert(Overridden->isVirtual());
      if (!Overridden->isPureVirtual()))
      ............
    }
```

https://github.com/llvm/llvm-project/pull/170103
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to