1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -Wshadow-all |
2 | |
3 | // Basic cases, ambiguous paths, and fields with different access |
4 | class A { |
5 | public: |
6 | int x; // expected-note 2{{declared here}} |
7 | protected: |
8 | int y; // expected-note 2{{declared here}} |
9 | private: |
10 | int z; |
11 | }; |
12 | |
13 | struct B : A { |
14 | }; |
15 | |
16 | struct C : A { |
17 | }; |
18 | |
19 | struct W { |
20 | int w; // expected-note {{declared here}} |
21 | }; |
22 | |
23 | struct U : W { |
24 | }; |
25 | |
26 | struct V : W { |
27 | }; |
28 | |
29 | class D { |
30 | public: |
31 | char w; // expected-note {{declared here}} |
32 | private: |
33 | char x; |
34 | }; |
35 | |
36 | // Check direct inheritance and multiple paths to the same base. |
37 | class E : B, C, D, U, V |
38 | { |
39 | unsigned x; // expected-warning {{non-static data member 'x' of 'E' shadows member inherited from type 'A'}} |
40 | char y; // expected-warning {{non-static data member 'y' of 'E' shadows member inherited from type 'A'}} |
41 | double z; |
42 | 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'}} |
43 | }; |
44 | |
45 | // Virtual inheritance |
46 | struct F : virtual A { |
47 | }; |
48 | |
49 | struct G : virtual A { |
50 | }; |
51 | |
52 | class H : F, G { |
53 | int x; // expected-warning {{non-static data member 'x' of 'H' shadows member inherited from type 'A'}} |
54 | int y; // expected-warning {{non-static data member 'y' of 'H' shadows member inherited from type 'A'}} |
55 | int z; |
56 | }; |
57 | |
58 | // Indirect inheritance |
59 | struct I { |
60 | union { |
61 | int x; // expected-note {{declared here}} |
62 | int y; |
63 | }; |
64 | }; |
65 | |
66 | struct J : I { |
67 | int x; // expected-warning {{non-static data member 'x' of 'J' shadows member inherited from type 'I'}} |
68 | }; |
69 | |
70 | // non-access paths |
71 | class N : W { |
72 | }; |
73 | |
74 | struct K { |
75 | int y; |
76 | }; |
77 | |
78 | struct L : private K { |
79 | }; |
80 | |
81 | struct M : L { |
82 | int y; |
83 | int w; |
84 | }; |
85 | |
86 | // Multiple ambiguous paths with different accesses |
87 | struct A1 { |
88 | int x; // expected-note {{declared here}} |
89 | }; |
90 | |
91 | class B1 : A1 { |
92 | }; |
93 | |
94 | struct B2 : A1 { |
95 | }; |
96 | |
97 | struct C1 : B1, B2 { |
98 | }; |
99 | |
100 | class D1 : C1 { |
101 | }; |
102 | |
103 | struct D2 : C1 { |
104 | }; |
105 | |
106 | class D3 : C1 { |
107 | }; |
108 | |
109 | struct E1 : D1, D2, D3{ |
110 | int x; // expected-warning {{non-static data member 'x' of 'E1' shadows member inherited from type 'A1'}} |
111 | }; |
112 | |
113 | |
114 | |
115 | |