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