1 // RUN: %clang_cc1 -verify -fsyntax-only -std=c++17 -Wshadow-all %s
4 int i
; // expected-note {{previous declaration is here}}
5 static int s
; // expected-note {{previous declaration is here}}
10 int j
; // expected-note {{previous declaration is here}}
11 typedef int jj
; // expected-note 2 {{previous declaration is here}}
12 using jjj
=int; // expected-note 2 {{previous declaration is here}}
28 using namespace one::two
;
33 int i
; // expected-warning {{declaration shadows a variable in namespace '(anonymous)'}}
34 int j
; // expected-warning {{declaration shadows a variable in namespace 'one::two'}}
35 static int s
; // expected-warning {{declaration shadows a variable in namespace '(anonymous)'}}
42 static int data
; // expected-note 1 {{previous declaration}}
43 // expected-note@+1 1 {{previous declaration}}
45 int f1
, f2
, f3
, f4
; // expected-note 9 {{previous declaration is here}}
47 typedef int a1
; // expected-note 2 {{previous declaration}}
48 using a2
=int; // expected-note 2 {{previous declaration}}
50 // The initialization is safe, but the modifications are not.
51 A(int f1
, int f2
, int f3
, int f4
) // expected-note-re 4 {{variable 'f{{[0-4]}}' is declared here}}
53 f1
= 3; // expected-warning {{modifying constructor parameter 'f1' that shadows a field of 'A'}}
54 f1
= 4; // one warning per shadow
55 f2
++; // expected-warning {{modifying constructor parameter 'f2' that shadows a field of 'A'}}
56 --f3
; // expected-warning {{modifying constructor parameter 'f3' that shadows a field of 'A'}}
57 f4
+= 2; // expected-warning {{modifying constructor parameter 'f4' that shadows a field of 'A'}}
60 // The initialization is safe, but the modifications are not.
61 // expected-warning-re@+1 4 {{constructor parameter 'f{{[0-4]}}' shadows the field 'f{{[0-9]}}' of 'A'}}
62 A(int f1
, int f2
, int f3
, int f4
, double overload_dummy
) {}
65 char *field
; // expected-warning {{declaration shadows a field of 'A'}}
66 char *data
; // expected-warning {{declaration shadows a static data member of 'A'}}
67 char *a1
; // no warning
68 char *a2
; // no warning
69 char *jj
; // no warning
70 char *jjj
; // no warning
71 static char *f1
; // expected-warning {{declaration shadows a field of 'A'}}
75 typedef char field
; // no warning
76 typedef char data
; // no warning
77 typedef char a1
; // expected-warning {{declaration shadows a typedef in 'A'}}
78 typedef char a2
; // expected-warning {{declaration shadows a type alias in 'A'}}
79 typedef char jj
; // expected-warning {{declaration shadows a typedef in namespace 'one::two'}}
80 typedef char jjj
; // expected-warning {{declaration shadows a type alias in namespace 'one::two'}}
84 using field
=char; // no warning
85 using data
=char; // no warning
86 using a1
=char; // expected-warning {{declaration shadows a typedef in 'A'}}
87 using a2
=char; // expected-warning {{declaration shadows a type alias in 'A'}}
88 using jj
=char; // expected-warning {{declaration shadows a typedef in namespace 'one::two'}}
89 using jjj
=char; // expected-warning {{declaration shadows a type alias in namespace 'one::two'}}
94 using value_type
= char;
95 typedef char value_type2
;
97 using value_type
= path
; // no warning
98 typedef path value_type2
; // no warning
103 // TODO: this should warn
109 namespace rdar8900456
{
119 double Bar
= 12; // Don't warn.
123 typedef int Bar
; // Don't warn.
127 using Bar
=int; // Don't warn.
131 // http://llvm.org/PR9160
146 extern int bob
; // expected-note 1 {{previous declaration is here}}
147 typedef int bob1
; // expected-note 2 {{previous declaration is here}}
148 using bob2
=int; // expected-note 2 {{previous declaration is here}}
151 extern int bob
; // don't warn for shadowing.
155 int bob
; // expected-warning {{declaration shadows a variable in the global namespace}}
156 int bob1
; //no warning
157 int bob2
; // no warning
161 typedef int bob
; // no warning
162 typedef int bob1
; // expected-warning {{declaration shadows a typedef in the global namespace}}
163 typedef int bob2
; // expected-warning {{declaration shadows a type alias in the global namespace}}
167 using bob
=int; // no warning
168 using bob1
=int; // expected-warning {{declaration shadows a typedef in the global namespace}}
169 using bob2
=int; // expected-warning {{declaration shadows a type alias in the global namespace}}
172 namespace rdar29067894
{
174 void avoidWarningWhenRedefining(int b
) { // expected-note {{previous definition is here}}
175 int a
= 0; // expected-note {{previous definition is here}}
176 int a
= 1; // expected-error {{redefinition of 'a'}}
177 int b
= 2; // expected-error {{redefinition of 'b'}}
179 using c
=char; // expected-note {{previous definition is here}}
180 using c
=int; // expected-error {{type alias redefinition with different types ('int' vs 'char')}}
182 typedef char d
; // expected-note {{previous definition is here}}
183 typedef int d
; // expected-error {{typedef redefinition with different types ('int' vs 'char')}}
185 using e
=char; // expected-note {{previous definition is here}}
186 typedef int e
; // expected-error {{type alias redefinition with different types ('int' vs 'char')}}
188 int f
; // expected-note {{previous definition is here}}
189 using f
=int; // expected-error {{redefinition of 'f'}}
191 using g
=int; // expected-note {{previous definition is here}}
192 int g
; // expected-error {{redefinition of 'g'}}
194 typedef int h
; // expected-note {{previous definition is here}}
195 int h
; // expected-error {{redefinition of 'h'}}
197 int k
; // expected-note {{previous definition is here}}
198 typedef int k
; // expected-error {{redefinition of 'k'}}
200 using l
=char; // no warning or error.
201 using l
=char; // no warning or error.
202 typedef char l
; // no warning or error.
204 typedef char n
; // no warning or error.
205 typedef char n
; // no warning or error.
206 using n
=char; // no warning or error.
212 typedef int externC
; // expected-note {{previous declaration is here}}
214 void handleLinkageSpec() {
215 typedef void externC
; // expected-warning {{declaration shadows a typedef in the global namespace}}
229 int B
; // expected-note 2 {{declared here}}
233 void D(int B
) {} // expected-warning {{parameter 'B' shadows member inherited from type 'A'}}
235 extern void f(int B
); // Ok
237 void F(int B
); // Ok, declaration; not definition.
241 void C::G(int B
) { // expected-warning {{parameter 'B' shadows member inherited from type 'A'}}
247 class Derived
: Private
{
248 void D(int B
) {} // Ok
255 struct Derived2
: Static
{
261 enum class X
{ PR24718
}; // Ok, not shadowing
266 PR24718_1
// Does not shadow a type.
270 namespace structured_binding_tests
{
271 int x
; // expected-note {{previous declaration is here}}
272 int y
; // expected-note {{previous declaration is here}}
278 const auto [x
, y
] = S(); // expected-warning 2 {{declaration shadows a variable in namespace 'structured_binding_tests'}}
282 int a
; // expected-note {{previous declaration is here}}
283 bool b
; // expected-note {{previous declaration is here}}
285 auto [a
, b
] = S(); // expected-warning 2 {{declaration shadows a local variable}}
291 int m_a
; // expected-note {{previous declaration is here}}
292 int m_b
; // expected-note {{previous declaration is here}}
295 auto [m_a
, m_b
] = S(); // expected-warning 2 {{declaration shadows a field of 'structured_binding_tests::A'}}
300 const auto [a
, b
] = S(); // expected-note 3 {{previous declaration is here}}
302 int a
= 4; // expected-warning {{declaration shadows a structured binding}}
305 const auto [a
, b
] = S(); // expected-warning 2 {{declaration shadows a structured binding}}
309 }; // namespace structured_binding_tests
314 char *foo(); // expected-note {{previous declaration is here}} \
315 // expected-note {{previous definition is here}}
316 enum Outer_E
{ foo
}; // expected-error {{redefinition of 'foo'}} \
317 // expected-warning {{declaration shadows a static data member of 'GH62588::Outer'}}
320 enum Inner_E
{ foo
}; // ok
323 } // namespace GH62588