1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s
2
3// If T is the name of a class, then each of the following shall have
4// a name different from T:
5
6// - every static data member of class T;
7struct X0 {
8  static int X0; // expected-error{{member 'X0' has the same name as its class}}
9};
10
11// - every member function of class T
12struct Xa {
13  int Xa() {} // expected-error{{constructor cannot have a return type}}
14};
15
16// - every member of class T that is itself a type;
17struct X1 {
18  enum X1 { }; // expected-error{{member 'X1' has the same name as its class}}
19};
20
21struct X1a {
22  struct X1a; // expected-error{{member 'X1a' has the same name as its class}}
23};
24
25struct X2 {
26  typedef int X2; // expected-error{{member 'X2' has the same name as its class}}
27};
28
29struct X2a {
30  using X2a = int; // expected-error{{member 'X2a' has the same name as its class}}
31};
32
33// - every member template of class T
34
35struct X2b {
36  template<typename T> struct X2b; // expected-error{{member 'X2b' has the same name as its class}}
37};
38struct X2c {
39  template<typename T> void X2c(); // expected-error{{constructor cannot have a return type}}
40};
41struct X2d {
42  template<typename T> static int X2d; // expected-error{{member 'X2d' has the same name as its class}}
43};
44struct X2e {
45  template<typename T> using X2e = int; // expected-error{{member 'X2e' has the same name as its class}}
46};
47
48// - every enumerator of every member of class T that is an unscoped enumerated type; and
49struct X3 {
50  enum E {
51    X3 // expected-error{{member 'X3' has the same name as its class}}
52  };
53};
54struct X3a {
55  enum class E {
56    X3a // ok
57  };
58};
59
60// - every member of every anonymous union that is a member of class T.
61struct X4 {
62  union {
63    int X;
64    union {
65      float Y;
66      unsigned X4; // expected-error{{member 'X4' has the same name as its class}}
67    };
68  };
69};
70