xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/fuchsia/virtual-inheritance.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s fuchsia-virtual-inheritance %t
2*89a1d03eSRichard 
3*89a1d03eSRichard class A {
4*89a1d03eSRichard public:
A(int value)5*89a1d03eSRichard   A(int value) : val(value) {}
6*89a1d03eSRichard 
do_A()7*89a1d03eSRichard   int do_A() { return val; }
8*89a1d03eSRichard 
9*89a1d03eSRichard private:
10*89a1d03eSRichard   int val;
11*89a1d03eSRichard };
12*89a1d03eSRichard 
13*89a1d03eSRichard class B : public virtual A {
14*89a1d03eSRichard   // CHECK-MESSAGES: [[@LINE-1]]:1: warning: direct virtual inheritance is disallowed [fuchsia-virtual-inheritance]
15*89a1d03eSRichard   // CHECK-NEXT: class B : public virtual A {
16*89a1d03eSRichard public:
B()17*89a1d03eSRichard   B() : A(0) {}
do_B()18*89a1d03eSRichard   int do_B() { return 1 + do_A(); }
19*89a1d03eSRichard };
20*89a1d03eSRichard 
21*89a1d03eSRichard class C : public virtual A {
22*89a1d03eSRichard   // CHECK-MESSAGES: [[@LINE-1]]:1: warning: direct virtual inheritance is disallowed [fuchsia-virtual-inheritance]
23*89a1d03eSRichard   // CHECK-NEXT: class C : public virtual A {
24*89a1d03eSRichard public:
C()25*89a1d03eSRichard   C() : A(0) {}
do_C()26*89a1d03eSRichard   int do_C() { return 2 + do_A(); }
27*89a1d03eSRichard };
28*89a1d03eSRichard 
29*89a1d03eSRichard class D : public B, public C {
30*89a1d03eSRichard public:
D(int value)31*89a1d03eSRichard   D(int value) : A(value), B(), C() {}
32*89a1d03eSRichard 
do_D()33*89a1d03eSRichard   int do_D() { return do_A() + do_B() + do_C(); }
34*89a1d03eSRichard };
35*89a1d03eSRichard 
main()36*89a1d03eSRichard int main() {
37*89a1d03eSRichard   A *a = new A(0);
38*89a1d03eSRichard   B *b = new B();
39*89a1d03eSRichard   C *c = new C();
40*89a1d03eSRichard   D *d = new D(0);
41*89a1d03eSRichard   return 0;
42*89a1d03eSRichard }
43