xref: /aosp_15_r20/external/clang/test/SemaCXX/defaulted-private-dtor.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -std=c++11 %s -fcxx-exceptions
2*67e74705SXin Li 
3*67e74705SXin Li class BadDtor {
4*67e74705SXin Li   // A private, but nonetheless trivial, destructor.
5*67e74705SXin Li   ~BadDtor() = default; // expected-note 9{{here}}
6*67e74705SXin Li   friend class K;
7*67e74705SXin Li };
f()8*67e74705SXin Li void f() {
9*67e74705SXin Li   BadDtor *p = new BadDtor[3]; // expected-error {{private destructor}}
10*67e74705SXin Li   delete [] p; // expected-error {{private destructor}}
11*67e74705SXin Li   const BadDtor &dd2 = BadDtor(); // expected-error {{private destructor}}
12*67e74705SXin Li   BadDtor dd; // expected-error {{private destructor}}
13*67e74705SXin Li   throw dd; // expected-error {{private destructor}}
14*67e74705SXin Li }
15*67e74705SXin Li struct V {
16*67e74705SXin Li   V();
17*67e74705SXin Li   BadDtor bd; // expected-note {{inaccessible destructor}}
18*67e74705SXin Li };
19*67e74705SXin Li V v; // expected-error {{deleted function}}
20*67e74705SXin Li struct W : BadDtor { // expected-note {{inaccessible destructor}}
21*67e74705SXin Li   W();
22*67e74705SXin Li };
23*67e74705SXin Li W w; // expected-error {{deleted function}}
24*67e74705SXin Li struct X : BadDtor { // expected-error {{private destructor}}
~XX25*67e74705SXin Li   ~X() {}
26*67e74705SXin Li };
27*67e74705SXin Li struct Y {
28*67e74705SXin Li   BadDtor dd; // expected-error {{private destructor}}
~YY29*67e74705SXin Li   ~Y() {}
30*67e74705SXin Li };
31*67e74705SXin Li struct Z : virtual BadDtor { // expected-error {{private destructor}}
~ZZ32*67e74705SXin Li   ~Z() {}
33*67e74705SXin Li };
34*67e74705SXin Li BadDtor dd; // expected-error {{private destructor}}
35*67e74705SXin Li 
36*67e74705SXin Li class K : BadDtor {
f()37*67e74705SXin Li   void f() {
38*67e74705SXin Li     BadDtor *p = new BadDtor[3];
39*67e74705SXin Li     delete [] p;
40*67e74705SXin Li     const BadDtor &dd2 = BadDtor();
41*67e74705SXin Li     BadDtor dd;
42*67e74705SXin Li     throw dd;
43*67e74705SXin Li 
44*67e74705SXin Li     {
45*67e74705SXin Li       BadDtor x;
46*67e74705SXin Li       goto dont_call_dtor;
47*67e74705SXin Li     }
48*67e74705SXin Li dont_call_dtor:
49*67e74705SXin Li     ;
50*67e74705SXin Li   }
51*67e74705SXin Li   struct Z : virtual BadDtor {
~ZK::Z52*67e74705SXin Li     ~Z() {}
53*67e74705SXin Li   };
54*67e74705SXin Li   BadDtor dd;
55*67e74705SXin Li   ~K();
56*67e74705SXin Li };
57