1 // RUN: %clang_cc1 -verify -fsyntax-only -Wshadow-all %s
2
3 namespace {
4 int i; // expected-note {{previous declaration is here}}
5 }
6
7 namespace one {
8 namespace two {
9 int j; // expected-note {{previous declaration is here}}
10 }
11 }
12
13 namespace xx {
14 int m;
15 }
16 namespace yy {
17 int m;
18 }
19
20 using namespace one::two;
21 using namespace xx;
22 using namespace yy;
23
foo()24 void foo() {
25 int i; // expected-warning {{declaration shadows a variable in namespace '(anonymous)'}}
26 int j; // expected-warning {{declaration shadows a variable in namespace 'one::two'}}
27 int m;
28 }
29
30 class A {
31 static int data; // expected-note {{previous declaration}}
32 // expected-note@+1 {{previous declaration}}
33 int field;
34 int f1, f2, f3, f4; // expected-note 8 {{previous declaration is here}}
35
36 // The initialization is safe, but the modifications are not.
A(int f1,int f2,int f3,int f4)37 A(int f1, int f2, int f3, int f4) // expected-note-re 4 {{variable 'f{{[0-4]}}' is declared here}}
38 : f1(f1) {
39 f1 = 3; // expected-warning {{modifying constructor parameter 'f1' that shadows a field of 'A'}}
40 f1 = 4; // one warning per shadow
41 f2++; // expected-warning {{modifying constructor parameter 'f2' that shadows a field of 'A'}}
42 --f3; // expected-warning {{modifying constructor parameter 'f3' that shadows a field of 'A'}}
43 f4 += 2; // expected-warning {{modifying constructor parameter 'f4' that shadows a field of 'A'}}
44 }
45
46 // The initialization is safe, but the modifications are not.
47 // expected-warning-re@+1 4 {{constructor parameter 'f{{[0-4]}}' shadows the field 'f{{[0-9]}}' of 'A'}}
A(int f1,int f2,int f3,int f4,double overload_dummy)48 A(int f1, int f2, int f3, int f4, double overload_dummy) {}
49
test()50 void test() {
51 char *field; // expected-warning {{declaration shadows a field of 'A'}}
52 char *data; // expected-warning {{declaration shadows a static data member of 'A'}}
53 }
54 };
55
56 // TODO: this should warn, <rdar://problem/5018057>
57 class B : A {
58 int data;
59 static int field;
60 };
61
62 // rdar://8900456
63 namespace rdar8900456 {
64 struct Foo {
65 static void Baz();
66 private:
67 int Bar;
68 };
69
Baz()70 void Foo::Baz() {
71 double Bar = 12; // Don't warn.
72 }
73 }
74
75 // http://llvm.org/PR9160
76 namespace PR9160 {
77 struct V {
78 V(int);
79 };
80 struct S {
81 V v;
mPR9160::S82 static void m() {
83 if (1) {
84 V v(0);
85 }
86 }
87 };
88 }
89
90 extern int bob; // expected-note {{previous declaration is here}}
91
92 // rdar://8883302
rdar8883302()93 void rdar8883302() {
94 extern int bob; // don't warn for shadowing.
95 }
96
test8()97 void test8() {
98 int bob; // expected-warning {{declaration shadows a variable in the global namespace}}
99 }
100