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; |
7 | struct 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 |
12 | struct 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; |
17 | struct X1 { |
18 | enum X1 { }; // expected-error{{member 'X1' has the same name as its class}} |
19 | }; |
20 | |
21 | struct X1a { |
22 | struct X1a; // expected-error{{member 'X1a' has the same name as its class}} |
23 | }; |
24 | |
25 | struct X2 { |
26 | typedef int X2; // expected-error{{member 'X2' has the same name as its class}} |
27 | }; |
28 | |
29 | struct 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 | |
35 | struct X2b { |
36 | template<typename T> struct X2b; // expected-error{{member 'X2b' has the same name as its class}} |
37 | }; |
38 | struct X2c { |
39 | template<typename T> void X2c(); // expected-error{{constructor cannot have a return type}} |
40 | }; |
41 | struct X2d { |
42 | template<typename T> static int X2d; // expected-error{{member 'X2d' has the same name as its class}} |
43 | }; |
44 | struct 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 |
49 | struct X3 { |
50 | enum E { |
51 | X3 // expected-error{{member 'X3' has the same name as its class}} |
52 | }; |
53 | }; |
54 | struct 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. |
61 | struct X4 { // expected-note{{previous}} |
62 | union { |
63 | int X; |
64 | union { |
65 | float Y; |
66 | unsigned X4; // expected-error{{redeclares 'X4'}} |
67 | }; |
68 | }; |
69 | }; |
70 | |
71 | // This includes such things inherited from base classes. |
72 | struct B { |
73 | static int D0; |
74 | int Da() {}; |
75 | enum D1 {}; |
76 | struct D1a; |
77 | typedef int D2; |
78 | using D2a = int; |
79 | template<typename T> struct D2b; |
80 | template<typename T> void D2c(); |
81 | template<typename T> static int D2d; |
82 | template<typename T> using D2e = int; |
83 | union { int D4; }; |
84 | int Dtemplate; |
85 | int Dtemplate_with_ctors; |
86 | }; |
87 | struct B2 { int Dtemplate(); }; |
88 | |
89 | struct D0 : B { using B::D0; }; // expected-error {{member 'D0' has the same name as its class}} |
90 | struct Da : B { using B::Da; }; // expected-error {{member 'Da' has the same name as its class}} |
91 | struct D1 : B { using B::D1; }; // expected-error {{member 'D1' has the same name as its class}} |
92 | struct D1a : B { using B::D1a; }; // expected-error {{member 'D1a' has the same name as its class}} |
93 | struct D2 : B { using B::D2; }; // expected-error {{member 'D2' has the same name as its class}} |
94 | struct D2a : B { using B::D2a; }; // expected-error {{member 'D2a' has the same name as its class}} |
95 | struct D2b : B { using B::D2b; }; // expected-error {{member 'D2b' has the same name as its class}} |
96 | struct D2c : B { using B::D2c; }; // expected-error {{member 'D2c' has the same name as its class}} |
97 | struct D2d : B { using B::D2d; }; // expected-error {{member 'D2d' has the same name as its class}} |
98 | struct D2e : B { using B::D2e; }; // expected-error {{member 'D2e' has the same name as its class}} |
99 | struct D4 : B { using B::D4; }; // expected-error {{member 'D4' has the same name as its class}} |
100 | |
101 | template<typename B> struct Dtemplate : B { |
102 | using B::Dtemplate; // expected-error {{member 'Dtemplate' has the same name as its class}} |
103 | }; |
104 | Dtemplate<B> ok; |
105 | Dtemplate<B2> error; // expected-note {{in instantiation of}} |
106 | |
107 | template<typename B> struct Dtemplate_with_ctors : B { |
108 | Dtemplate_with_ctors(); |
109 | using B::Dtemplate_with_ctors; // expected-error {{member 'Dtemplate_with_ctors' has the same name as its class}} |
110 | }; |
111 | |
112 | template<typename B> struct CtorDtorName : B { |
113 | using B::CtorDtorName; // expected-error {{member 'CtorDtorName' has the same name as its class}} |
114 | CtorDtorName(); |
115 | ~CtorDtorName(); // expected-error {{expected the class name after '~' to name a destructor}} |
116 | }; |
117 | |