1// RUN: %clang_cc1 -verify -fsyntax-only -Wshadow %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  int field; // expected-note {{previous declaration}}
33
34  void test() {
35    char *field; // expected-warning {{declaration shadows a field of 'A'}}
36    char *data; // expected-warning {{declaration shadows a static data member of 'A'}}
37  }
38};
39
40// TODO: this should warn, <rdar://problem/5018057>
41class B : A {
42  int data;
43  static int field;
44};
45
46// rdar://8900456
47namespace rdar8900456 {
48struct Foo {
49  static void Baz();
50private:
51  int Bar;
52};
53
54void Foo::Baz() {
55  double Bar = 12; // Don't warn.
56}
57}
58
59// http://llvm.org/PR9160
60namespace PR9160 {
61struct V {
62  V(int);
63};
64struct S {
65  V v;
66  static void m() {
67    if (1) {
68      V v(0);
69    }
70  }
71};
72}
73
74extern int bob; // expected-note {{previous declaration is here}}
75
76// rdar://8883302
77void rdar8883302() {
78  extern int bob; // don't warn for shadowing.
79}
80
81void test8() {
82  int bob; // expected-warning {{declaration shadows a variable in the global namespace}}
83}
84