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
47
58// C++0x [class.access]p4:
69
@@ -139,7 +142,7 @@ namespace test3 {
139142 A local; // expected-error {{variable of type 'test3::A' has private destructor}}
140143 }
141144
142- #if __cplusplus < 201103L
145+ #if __cplusplus < 201103L && !defined(_MSC_VER)
143146 template <unsigned N> class Base { ~Base (); }; // expected-note 14 {{declared private here}}
144147 class Base2 : virtual Base<2 > { ~Base2 (); }; // expected-note 3 {{declared private here}} \
145148 // expected-error {{base class 'Base<2>' has private destructor}}
@@ -161,15 +164,43 @@ namespace test3 {
161164
162165 class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \
163166 // 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}}
165168 Base<0 >, // expected-error 2 {{base class 'Base<0>' has private destructor}}
166169 virtual Base<1 >, // expected-error 2 {{base class 'Base<1>' has private destructor}}
167170 Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}}
168171 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)
173204 template <unsigned N> class Base { ~Base (); }; // expected-note 4{{declared private here}}
174205 class Base2 : virtual Base<2 > { ~Base2 (); }; // expected-note 1{{declared private here}}
175206 class Base3 : virtual Base<3 > { public: ~Base3 (); };
@@ -193,8 +224,40 @@ namespace test3 {
193224 virtual Base<1 >,
194225 Base2,
195226 virtual Base3
196- {};
227+ {};
197228 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"
198261#endif
199262}
200263
0 commit comments