1// RUN: %clang_cc1 -verify -fsyntax-only -Wshadow-all %s
2
3namespace {
4  int i; // expected-note {{previous declaration is here}}
5}
6
7namespace one {
8namespace two {
9  int j; // expected-note {{previous declaration is here}}
10}
11}
12
13namespace xx {
14  int m;
15}
16namespace yy {
17  int m;
18}
19
20using namespace one::two;
21using namespace xx;
22using namespace yy;
23
24void 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
30class 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.
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'}}
48  A(int f1, int f2, int f3, int f4, double overload_dummy) {}
49
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>
57class B : A {
58  int data;
59  static int field;
60};
61
62// rdar://8900456
63namespace rdar8900456 {
64struct Foo {
65  static void Baz();
66private:
67  int Bar;
68};
69
70void Foo::Baz() {
71  double Bar = 12; // Don't warn.
72}
73}
74
75// http://llvm.org/PR9160
76namespace PR9160 {
77struct V {
78  V(int);
79};
80struct S {
81  V v;
82  static void m() {
83    if (1) {
84      V v(0);
85    }
86  }
87};
88}
89
90extern int bob; // expected-note {{previous declaration is here}}
91
92// rdar://8883302
93void rdar8883302() {
94  extern int bob; // don't warn for shadowing.
95}
96
97void test8() {
98  int bob; // expected-warning {{declaration shadows a variable in the global namespace}}
99}
100