1 // RUN: %clang_cc1 -verify -fsyntax-only -fblocks -Wshadow %s
2 
3 int i;          // expected-note 3 {{previous declaration is here}}
4 
foo()5 void 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>
23 void (^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 
34 struct test2 {
35   int i;
36 };
37 
test3(void)38 void test3(void) {
39   struct test4 {
40     int i;
41   };
42 }
43 
test4(int i)44 void test4(int i) { // expected-warning {{declaration shadows a variable in the global scope}}
45 }
46 
47 // Don't warn about shadowing for function declarations.
48 void test5(int i);
test6(void (* f)(int i))49 void test6(void (*f)(int i)) {}
test7(void * context,void (* callback)(void * context))50 void test7(void *context, void (*callback)(void *context)) {}
51 
52 extern int bob; // expected-note {{previous declaration is here}}
53 
54 // rdar://8883302
rdar8883302()55 void rdar8883302() {
56   extern int bob; // don't warn for shadowing.
57 }
58 
test8()59 void test8() {
60   int bob; // expected-warning {{declaration shadows a variable in the global scope}}
61 }
62 
63 enum PR24718_1{pr24718}; // expected-note {{previous declaration is here}}
PR24718(void)64 void PR24718(void) {
65   enum PR24718_2{pr24718}; // expected-warning {{declaration shadows a variable in the global scope}}
66 }
67 
68 struct PR24718_3;
69 struct PR24718_4 {
70   enum {
71     PR24718_3 // Does not shadow a type.
72   };
73 };
74