1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -Wno-inaccessible-base %s 2*67e74705SXin Li struct A { 3*67e74705SXin Li virtual void f() = 0; // expected-note 2{{overridden virtual function}} 4*67e74705SXin Li }; 5*67e74705SXin Li 6*67e74705SXin Li struct Aprime : virtual A { 7*67e74705SXin Li virtual void f(); 8*67e74705SXin Li }; 9*67e74705SXin Li 10*67e74705SXin Li struct B : Aprime { 11*67e74705SXin Li virtual void f(); // expected-note 3{{final overrider of 'A::f'}} 12*67e74705SXin Li }; 13*67e74705SXin Li 14*67e74705SXin Li struct C : virtual A { 15*67e74705SXin Li virtual void f(); // expected-note{{final overrider of 'A::f'}} 16*67e74705SXin Li }; 17*67e74705SXin Li 18*67e74705SXin Li struct D : B, C { }; // expected-error{{virtual function 'A::f' has more than one final overrider in 'D'}} 19*67e74705SXin Li 20*67e74705SXin Li struct B2 : B { }; 21*67e74705SXin Li 22*67e74705SXin Li struct E : B, B2 { }; //expected-error{{virtual function 'A::f' has more than one final overrider in 'E'}} 23*67e74705SXin Li 24*67e74705SXin Li struct F : B, B2 { 25*67e74705SXin Li virtual void f(); // okay 26*67e74705SXin Li }; 27*67e74705SXin Li 28*67e74705SXin Li struct G : F { }; // okay 29*67e74705SXin Li 30*67e74705SXin Li struct H : G, A { }; // okay 31*67e74705SXin Li 32*67e74705SXin Li namespace MultipleSubobjects { 33*67e74705SXin Li struct A { virtual void f(); }; 34*67e74705SXin Li struct B : A { virtual void f(); }; 35*67e74705SXin Li struct C : A { virtual void f(); }; 36*67e74705SXin Li struct D : B, C { }; // okay 37*67e74705SXin Li } 38