1a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %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
12a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// (Cannot be tested)
13a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
14a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every member of class T that is itself a type;
15a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X1 { // expected-note{{previous use is here}}
16a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  enum X1 { }; // expected-error{{use of 'X1' with tag type that does not match previous declaration}}
17a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
18a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
19a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X2 {
202fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  typedef int X2; // expected-error{{member 'X2' has the same name as its class}}
21a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
22a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
23a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every enumerator of every member of class T that is an enumerated type; and
24a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X3 {
25a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  enum E {
26a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    X3 // expected-error{{member 'X3' has the same name as its class}}
27a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  };
28a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
29a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
30a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor// - every member of every anonymous union that is a member of class T.
31a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregorstruct X4 {
32a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  union {
33a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    int X;
34a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    union {
35a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor      float Y;
36a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor      unsigned X4; // expected-error{{member 'X4' has the same name as its class}}
37a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor    };
38a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor  };
39a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor};
40a6e937ce32474934778346f4d51c3beec40e77ecDouglas Gregor
41