xref: /llvm-project/clang/test/SemaCXX/defaulted-private-dtor.cpp (revision 852265ff1c19c56a4f7e8324e4b133a6f33e8c8c)
1eec915d6SRichard Smith // RUN: %clang_cc1 -verify -std=c++11 %s -fcxx-exceptions
2eec915d6SRichard Smith 
3eec915d6SRichard Smith class BadDtor {
4eec915d6SRichard Smith   // A private, but nonetheless trivial, destructor.
5273c4e9dSRichard Smith   ~BadDtor() = default; // expected-note 9{{here}}
6eec915d6SRichard Smith   friend class K;
7eec915d6SRichard Smith };
f()8eec915d6SRichard Smith void f() {
9eec915d6SRichard Smith   BadDtor *p = new BadDtor[3]; // expected-error {{private destructor}}
10eec915d6SRichard Smith   delete [] p; // expected-error {{private destructor}}
11eec915d6SRichard Smith   const BadDtor &dd2 = BadDtor(); // expected-error {{private destructor}}
12eec915d6SRichard Smith   BadDtor dd; // expected-error {{private destructor}}
13eec915d6SRichard Smith   throw dd; // expected-error {{private destructor}}
14eec915d6SRichard Smith }
15*852265ffSRichard Smith struct V {
16561fb158SRichard Smith   V();
17*852265ffSRichard Smith   BadDtor bd; // expected-note {{inaccessible destructor}}
18561fb158SRichard Smith };
19273c4e9dSRichard Smith V v; // expected-error {{deleted function}}
20*852265ffSRichard Smith struct W : BadDtor { // expected-note {{inaccessible destructor}}
21561fb158SRichard Smith   W();
22561fb158SRichard Smith };
23273c4e9dSRichard Smith W w; // expected-error {{deleted function}}
24eec915d6SRichard Smith struct X : BadDtor { // expected-error {{private destructor}}
~XX25eec915d6SRichard Smith   ~X() {}
26eec915d6SRichard Smith };
27eec915d6SRichard Smith struct Y {
28eec915d6SRichard Smith   BadDtor dd; // expected-error {{private destructor}}
~YY29eec915d6SRichard Smith   ~Y() {}
30eec915d6SRichard Smith };
31eec915d6SRichard Smith struct Z : virtual BadDtor { // expected-error {{private destructor}}
~ZZ32eec915d6SRichard Smith   ~Z() {}
33eec915d6SRichard Smith };
34eec915d6SRichard Smith BadDtor dd; // expected-error {{private destructor}}
35eec915d6SRichard Smith 
36eec915d6SRichard Smith class K : BadDtor {
f()37eec915d6SRichard Smith   void f() {
38eec915d6SRichard Smith     BadDtor *p = new BadDtor[3];
39eec915d6SRichard Smith     delete [] p;
40eec915d6SRichard Smith     const BadDtor &dd2 = BadDtor();
41eec915d6SRichard Smith     BadDtor dd;
42eec915d6SRichard Smith     throw dd;
43eec915d6SRichard Smith 
44eec915d6SRichard Smith     {
45eec915d6SRichard Smith       BadDtor x;
46eec915d6SRichard Smith       goto dont_call_dtor;
47eec915d6SRichard Smith     }
48eec915d6SRichard Smith dont_call_dtor:
49eec915d6SRichard Smith     ;
50eec915d6SRichard Smith   }
51eec915d6SRichard Smith   struct Z : virtual BadDtor {
~ZK::Z52eec915d6SRichard Smith     ~Z() {}
53eec915d6SRichard Smith   };
54eec915d6SRichard Smith   BadDtor dd;
55eec915d6SRichard Smith   ~K();
56eec915d6SRichard Smith };
57