187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s
2a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
3a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// If T is the name of a class, then each of the following shall have
4a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// a name different from T:
5a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
6a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every static data member of class T;
7a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X0 {
8a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  static int X0; // expected-error{{member 'X0' has the same name as its class}}
9a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
10a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
11a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every member function of class T
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct Xa {
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int Xa() {} // expected-error{{constructor cannot have a return type}}
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
15a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
16a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every member of class T that is itself a type;
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X1 {
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  enum X1 { }; // expected-error{{member 'X1' has the same name as its class}}
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X1a {
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct X1a; // expected-error{{member 'X1a' has the same name as its class}}
23a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
24a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
25a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X2 {
262fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  typedef int X2; // expected-error{{member 'X2' has the same name as its class}}
27a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
28a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X2a {
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  using X2a = int; // expected-error{{member 'X2a' has the same name as its class}}
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// - every member template of class T
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X2b {
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<typename T> struct X2b; // expected-error{{member 'X2b' has the same name as its class}}
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X2c {
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<typename T> void X2c(); // expected-error{{constructor cannot have a return type}}
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X2d {
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<typename T> static int X2d; // expected-error{{member 'X2d' has the same name as its class}}
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X2e {
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<typename T> using X2e = int; // expected-error{{member 'X2e' has the same name as its class}}
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// - every enumerator of every member of class T that is an unscoped enumerated type; and
49a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X3 {
50a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  enum E {
51a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    X3 // expected-error{{member 'X3' has the same name as its class}}
52a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  };
53a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct X3a {
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  enum class E {
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    X3a // ok
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
59a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
60a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every member of every anonymous union that is a member of class T.
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct X4 { // expected-note{{previous}}
62a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  union {
63a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    int X;
64a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    union {
65a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor      float Y;
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      unsigned X4; // expected-error{{redeclares 'X4'}}
67a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    };
68a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  };
69a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
70