// RUN: %clang_cc1 -verify -fsyntax-only -fblocks -Wshadow %s

int i;          // expected-note 4 {{previous declaration is here}}
static int s;   // expected-note 2 {{previous declaration is here}}

void foo(void) {
  int pass1;
  int i;        // expected-warning {{declaration shadows a variable in the global scope}} \
                // expected-note {{previous declaration is here}}
  int s;        // expected-warning {{declaration shadows a variable in the global scope}} \
                // expected-note {{previous declaration is here}}
  {
    int pass2;
    int i;      // expected-warning {{declaration shadows a local variable}} \
                // expected-note {{previous declaration is here}}
    int s;      // expected-warning {{declaration shadows a local variable}} \
                // expected-note {{previous declaration is here}}
    {
      int pass3;
      int i;    // expected-warning {{declaration shadows a local variable}}
      int s;    // expected-warning {{declaration shadows a local variable}}
    }
  }

  int sin; // okay; 'sin' has not been declared, even though it's a builtin.
}

void (^test1)(int) = ^(int i) { // expected-warning {{declaration shadows a variable in the global scope}} \
                                 // expected-note{{previous declaration is here}}
  {
    int i; // expected-warning {{declaration shadows a local variable}} \
           // expected-note{{previous declaration is here}}
    
    (^(int i) { return i; })(i); //expected-warning {{declaration shadows a local variable}}
  }
};


struct test2 {
  int i;
};

void test3(void) {
  struct test4 {
    int i;
  };
}

void test4(int i) { // expected-warning {{declaration shadows a variable in the global scope}}
}

// Don't warn about shadowing for function declarations.
void test5(int i);
void test6(void (*f)(int i)) {}
void test7(void *context, void (*callback)(void *context)) {}

extern int bob; // expected-note {{previous declaration is here}}

void rdar8883302(void) {
  extern int bob; // don't warn for shadowing.
}

void test8(void) {
  int bob; // expected-warning {{declaration shadows a variable in the global scope}}
}

enum PR24718_1{pr24718}; // expected-note {{previous declaration is here}}
void PR24718(void) {
  enum PR24718_2{pr24718}; // expected-warning {{declaration shadows a variable in the global scope}}
}

struct PR24718_3;
struct PR24718_4 {
  enum {
    PR24718_3 // Does not shadow a type.
  };
};

void static_locals() {
  static int i; // expected-warning {{declaration shadows a variable in the global scope}}
                // expected-note@-1 {{previous definition is here}}
                // expected-note@-2 {{previous declaration is here}}
  int i;        // expected-error {{non-static declaration of 'i' follows static declaration}}
  static int foo; // expected-note {{previous declaration is here}}
  static int hoge; // expected-note {{previous declaration is here}}
  int s; // expected-warning {{declaration shadows a variable in the global scope}}
  {
    static int foo; // expected-warning {{declaration shadows a local variable}}
                    // expected-note@-1 {{previous declaration is here}}
    static int i; // expected-warning {{declaration shadows a local variable}}
                  // expected-note@-1 {{previous declaration is here}}
    int hoge; // expected-warning {{declaration shadows a local variable}}
    {
      static int foo; // expected-warning {{declaration shadows a local variable}}
      int i; // expected-warning {{declaration shadows a local variable}}
      extern int hoge;
    }
  }
}
