1
- // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s
2
- // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s
3
- // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
1
+ // RUN: %clang_cc1 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s
2
+ // RUN: %clang_cc1 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s
3
+ // RUN: %clang_cc1 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
4
+ // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility-version=19 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s
5
+ // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility-version=19 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s
6
+ // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility-version=19 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
4
7
5
8
// C++0x [class.access]p4:
6
9
@@ -139,7 +142,7 @@ namespace test3 {
139
142
A local; // expected-error {{variable of type 'test3::A' has private destructor}}
140
143
}
141
144
142
- #if __cplusplus < 201103L
145
+ #if __cplusplus < 201103L && !defined(_MSC_VER)
143
146
template <unsigned N> class Base { ~Base (); }; // expected-note 14 {{declared private here}}
144
147
class Base2 : virtual Base<2 > { ~Base2 (); }; // expected-note 3 {{declared private here}} \
145
148
// expected-error {{base class 'Base<2>' has private destructor}}
@@ -161,15 +164,43 @@ namespace test3 {
161
164
162
165
class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \
163
166
// expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}} \
164
- // expected-note 2{{implicit default constructor}}
167
+ // expected-note 2{{implicit default constructor}}
165
168
Base<0 >, // expected-error 2 {{base class 'Base<0>' has private destructor}}
166
169
virtual Base<1 >, // expected-error 2 {{base class 'Base<1>' has private destructor}}
167
170
Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}}
168
171
virtual Base3
169
- {};
170
- Derived3 d3; // expected-note 3{{implicit default constructor}}\
171
- // expected-note{{implicit destructor}}}
172
- #else
172
+ {};
173
+ Derived3 d3; // expected-note{{implicit destructor}}} \
174
+ // expected-note 3 {{implicit default constructor}}
175
+ #elif __cplusplus < 201103L && defined(_MSC_VER)
176
+ template <unsigned N> class Base { ~Base (); }; // expected-note 14 {{declared private here}}
177
+ class Base2 : virtual Base<2 > { ~Base2 (); }; // expected-note 3 {{declared private here}} \
178
+ // expected-error {{base class 'Base<2>' has private destructor}}
179
+ class Base3 : virtual Base<3 > { public: ~Base3 (); }; // expected-error {{base class 'Base<3>' has private destructor}}
180
+
181
+ // These don't cause diagnostics because we don't need the destructor.
182
+ class Derived0 : Base<0 > { ~Derived0 (); };
183
+ class Derived1 : Base<1 > { };
184
+
185
+ class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \
186
+ // expected-error {{inherited virtual base class 'Base<3>' has private destructor}}
187
+ Base<0 >, // expected-error {{base class 'Base<0>' has private destructor}}
188
+ virtual Base<1 >, // expected-error {{base class 'Base<1>' has private destructor}}
189
+ Base2, // expected-error {{base class 'test3::Base2' has private destructor}}
190
+ virtual Base3
191
+ {
192
+ ~Derived2 () {} // expected-note 2{{in implicit destructor}}
193
+ };
194
+
195
+ class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \
196
+ // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}}
197
+ Base<0 >, // expected-error 2 {{base class 'Base<0>' has private destructor}}
198
+ virtual Base<1 >, // expected-error 2 {{base class 'Base<1>' has private destructor}}
199
+ Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}}
200
+ virtual Base3
201
+ {};
202
+ Derived3 d3; // expected-note{{implicit destructor}}} expected-note {{implicit default constructor}}
203
+ #elif __cplusplus >= 201103L && !defined(_MSC_VER)
173
204
template <unsigned N> class Base { ~Base (); }; // expected-note 4{{declared private here}}
174
205
class Base2 : virtual Base<2 > { ~Base2 (); }; // expected-note 1{{declared private here}}
175
206
class Base3 : virtual Base<3 > { public: ~Base3 (); };
@@ -193,8 +224,40 @@ namespace test3 {
193
224
virtual Base<1 >,
194
225
Base2,
195
226
virtual Base3
196
- {};
227
+ {};
197
228
Derived3 d3; // expected-error {{implicitly-deleted default constructor}}
229
+ #elif __cplusplus >= 201103L && defined(_MSC_VER)
230
+ template <unsigned N> class Base { ~Base (); }; // expected-note 6{{declared private here}}
231
+ // expected-error@+1 {{inherited virtual base class 'Base<2>' has private destructor}}
232
+ class Base2 : virtual Base<2 > { ~Base2 (); }; // expected-note 1{{declared private here}}
233
+ // expected-error@+1 {{inherited virtual base class 'Base<3>' has private destructor}}
234
+ class Base3 : virtual Base<3 > { public: ~Base3 (); };
235
+
236
+ // These don't cause diagnostics because we don't need the destructor.
237
+ class Derived0 : Base<0 > { ~Derived0 (); };
238
+ class Derived1 : Base<1 > { };
239
+
240
+ class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \
241
+ // expected-error {{inherited virtual base class 'Base<3>' has private destructor}}
242
+ Base<0 >, // expected-error {{base class 'Base<0>' has private destructor}}
243
+ virtual Base<1 >, // expected-error {{base class 'Base<1>' has private destructor}}
244
+ Base2, // expected-error {{base class 'test3::Base2' has private destructor}}
245
+ virtual Base3
246
+ {
247
+ // expected-note@+2 {{in implicit destructor for 'test3::Base2' first required here}}
248
+ // expected-note@+1 {{in implicit destructor for 'test3::Base3' first required here}}
249
+ ~Derived2 () {}
250
+ };
251
+
252
+ class Derived3 :
253
+ Base<0 >, // expected-note {{deleted because base class 'Base<0>' has an inaccessible destructor}}
254
+ virtual Base<1 >,
255
+ Base2,
256
+ virtual Base3
257
+ {};
258
+ Derived3 d3; // expected-error {{implicitly-deleted default constructor}}
259
+ #else
260
+ #error "missing case of MSVC cross C++ versions"
198
261
#endif
199
262
}
200
263
0 commit comments