// RUN: %clang_cc1 -fsyntax-only -verify %s -Wshadow-all // Basic cases, ambiguous paths, and fields with different access class A { public: int x; // expected-note 2{{declared here}} protected: int y; // expected-note 2{{declared here}} private: int z; }; struct B : A { }; struct C : A { }; struct W { int w; // expected-note {{declared here}} }; struct U : W { }; struct V : W { }; class D { public: char w; // expected-note {{declared here}} private: char x; }; // Check direct inheritance and multiple paths to the same base. class E : B, C, D, U, V { unsigned x; // expected-warning {{non-static data member 'x' of 'E' shadows member inherited from type 'A'}} char y; // expected-warning {{non-static data member 'y' of 'E' shadows member inherited from type 'A'}} double z; char w; // expected-warning {{non-static data member 'w' of 'E' shadows member inherited from type 'D'}} expected-warning {{non-static data member 'w' of 'E' shadows member inherited from type 'W'}} }; // Virtual inheritance struct F : virtual A { }; struct G : virtual A { }; class H : F, G { int x; // expected-warning {{non-static data member 'x' of 'H' shadows member inherited from type 'A'}} int y; // expected-warning {{non-static data member 'y' of 'H' shadows member inherited from type 'A'}} int z; }; // Indirect inheritance struct I { union { int x; // expected-note {{declared here}} int y; }; }; struct J : I { int x; // expected-warning {{non-static data member 'x' of 'J' shadows member inherited from type 'I'}} }; // non-access paths class N : W { }; struct K { int y; }; struct L : private K { }; struct M : L { int y; int w; }; // Multiple ambiguous paths with different accesses struct A1 { int x; // expected-note {{declared here}} }; class B1 : A1 { }; struct B2 : A1 { }; struct C1 : B1, B2 { }; class D1 : C1 { }; struct D2 : C1 { }; class D3 : C1 { }; struct E1 : D1, D2, D3{ int x; // expected-warning {{non-static data member 'x' of 'E1' shadows member inherited from type 'A1'}} };