1// RUN: %clang_cc1 -verify -fsyntax-only -fblocks -Wshadow %s
2
3int i;          // expected-note 3 {{previous declaration is here}}
4
5void foo() {
6  int pass1;
7  int i;        // expected-warning {{declaration shadows a variable in the global scope}} \
8                // expected-note {{previous declaration is here}}
9  {
10    int pass2;
11    int i;      // expected-warning {{declaration shadows a local variable}} \
12                // expected-note {{previous declaration is here}}
13    {
14      int pass3;
15      int i;    // expected-warning {{declaration shadows a local variable}}
16    }
17  }
18
19  int sin; // okay; 'sin' has not been declared, even though it's a builtin.
20}
21
22// <rdar://problem/7677531>
23void (^test1)(int) = ^(int i) { // expected-warning {{declaration shadows a variable in the global scope}} \
24                                 // expected-note{{previous declaration is here}}
25  {
26    int i; // expected-warning {{declaration shadows a local variable}} \
27           // expected-note{{previous declaration is here}}
28
29    (^(int i) { return i; })(i); //expected-warning {{declaration shadows a local variable}}
30  }
31};
32
33
34struct test2 {
35  int i;
36};
37
38void test3(void) {
39  struct test4 {
40    int i;
41  };
42}
43
44void test4(int i) { // expected-warning {{declaration shadows a variable in the global scope}}
45}
46
47// Don't warn about shadowing for function declarations.
48void test5(int i);
49void test6(void (*f)(int i)) {}
50void test7(void *context, void (*callback)(void *context)) {}
51
52extern int bob; // expected-note {{previous declaration is here}}
53
54// rdar://8883302
55void rdar8883302() {
56  extern int bob; // don't warn for shadowing.
57}
58
59void test8() {
60  int bob; // expected-warning {{declaration shadows a variable in the global scope}}
61}
62