// RUN: %clang_cc1 -fsyntax-only -verify -Wreserved-identifier -Wno-visibility %s

#define __oof foo__ // expected-warning {{macro name is a reserved identifier}}

int foo__bar() { return 0; }    // no-warning
static int _bar() { return 0; } // expected-warning {{identifier '_bar' is reserved because it starts with '_' at global scope}}
static int _Bar() { return 0; } // expected-warning {{identifier '_Bar' is reserved because it starts with '_' followed by a capital letter}}
int _foo() { return 0; }        // expected-warning {{identifier '_foo' is reserved because it starts with '_' at global scope}}

// This one is explicitly skipped by -Wreserved-identifier
void *_; // no-warning

void foo(unsigned int _Reserved) { // expected-warning {{identifier '_Reserved' is reserved because it starts with '_' followed by a capital letter}}
  unsigned int __1 =               // expected-warning {{identifier '__1' is reserved because it starts with '__'}}
      _Reserved;                   // no-warning
  goto __reserved;                 // expected-warning {{identifier '__reserved' is reserved because it starts with '__'}}
__reserved: // expected-warning {{identifier '__reserved' is reserved because it starts with '__'}}
            ;
  goto _not_reserved;
_not_reserved: ;
}

void foot(unsigned int _not_reserved) {} // no-warning

enum __menu { // expected-warning {{identifier '__menu' is reserved because it starts with '__'}}
  __some,     // expected-warning {{identifier '__some' is reserved because it starts with '__'}}
  _Other,     // expected-warning {{identifier '_Other' is reserved because it starts with '_' followed by a capital letter}}
  _other      // expected-warning {{identifier '_other' is reserved because it starts with '_' at global scope}}
};

struct __babar { // expected-warning {{identifier '__babar' is reserved because it starts with '__'}}
};

struct _Zebulon;   // expected-warning {{identifier '_Zebulon' is reserved because it starts with '_' followed by a capital letter}}
struct _Zebulon2 { // expected-warning {{identifier '_Zebulon2' is reserved because it starts with '_' followed by a capital letter}}
} * p;
struct _Zebulon3 *pp; // expected-warning {{identifier '_Zebulon3' is reserved because it starts with '_' followed by a capital letter}}

typedef struct {
  int _Field; // expected-warning {{identifier '_Field' is reserved because it starts with '_' followed by a capital letter}}
  int _field; // no-warning
} _Typedef;   // expected-warning {{identifier '_Typedef' is reserved because it starts with '_' followed by a capital letter}}

int foobar() {
  return foo__bar(); // no-warning
}

struct _reserved { // expected-warning {{identifier '_reserved' is reserved because it starts with '_' at global scope}}
  int a;
} cunf(void) {
  return (struct _reserved){1};
}

// FIXME: According to clang declaration context layering, _preserved belongs to
// the translation unit, so we emit a warning. It's unclear that's what the
// standard mandate, but it's such a corner case we can live with it.
void func(struct _preserved { int a; } r) {} // expected-warning {{identifier '_preserved' is reserved because it starts with '_' at global scope}}

extern char *_strdup(const char *); // expected-warning {{identifier '_strdup' is reserved because it starts with '_' at global scope}}

// Don't warn on redecleration
extern char *_strdup(const char *); // no-warning

void ok() {
  void _ko();           // expected-warning {{identifier '_ko' is reserved because it starts with '_' at global scope}}
  extern int _ko_again; // expected-warning {{identifier '_ko_again' is reserved because it starts with '_' at global scope}}
}
