[PATCH] D40580: [clang-tidy] Adding Fuchsia checker for multiple inheritance
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 3 07:30:17 PST 2017
aaron.ballman added inline comments.
================
Comment at: clang-tidy/fuchsia/MultipleInheritanceCheck.cpp:60
+ // To be an interface, all base classes must be interfaces as well.
+ for (const auto &I : Node->bases()) {
+ const auto *Ty = I.getType()->getAs<RecordType>();
----------------
juliehockett wrote:
> aaron.ballman wrote:
> > What about virtual bases (`Node->vbases()`)? This would also be worth some test cases.
> Added test cases for virtual, but aren't virtual bases also included in `bases()`?
No, they are separate in `CXXRecordDecl`.
================
Comment at: test/clang-tidy/fuchsia-multiple-inheritance.cpp:48
+};
+
+// Inherits from multiple concrete classes.
----------------
The virtual base test cases I was thinking of were:
```
struct Base { virtual void foo() = 0; };
struct V1 : virtual Base {};
struct V2 : virtual Base {};
struct D : V1, V2 {}; // Should be fine
---
struct Base { virtual void foo(); };
struct V1 : virtual Base {};
struct V2 : virtual Base {};
struct D : V1, V2 {}; // Should be fine (there's only one concrete base)?
---
struct Base {};
struct V1 : virtual Base { virtual void f(); }
struct V2 : virtual Base { virtual void g(); }
struct D : V1, V2 {}; // Not okay
---
struct Base {};
struct V1 : virtual Base { virtual void f() = 0; }
struct V2 : virtual Base { virtual void g() = 0; }
struct D : V1, V2 {}; // Okay
---
struct Base { virtual void f(); };
struct V1 : virtual Base { virtual void f(); }
struct V2 : virtual base { virtual void g() = 0; }
struct D : V1, V2 {}; // Should be okay (V1::f() overrides Base::f() which is only inherited once)?
```
https://reviews.llvm.org/D40580
More information about the cfe-commits
mailing list