p5-0x.cpp revision 6c4c36c4ed1007143f5b8655eb68b313a7e12e76
1// RUN: %clang_cc1 -verify -std=c++11 %s
2
3struct NonTrivDtor {
4  ~NonTrivDtor();
5};
6struct DeletedDtor {
7  ~DeletedDtor() = delete; // expected-note 5 {{deleted here}}
8};
9class InaccessibleDtor {
10  ~InaccessibleDtor() = default;
11};
12
13// A defaulted destructor for a class X is defined as deleted if:
14
15// -- X is a union-like class that has a variant member with a non-trivial
16// destructor.
17union A1 {
18  A1();
19  NonTrivDtor n; // expected-note {{destructor of union 'A1' is implicitly deleted because field 'n' has a non-trivial destructor}}
20};
21A1 a1; // expected-error {{deleted function}}
22struct A2 {
23  A2();
24  union {
25    NonTrivDtor n; // expected-note {{because field 'n' has a non-trivial destructor}}
26  };
27};
28A2 a2; // expected-error {{deleted function}}
29union A3 {
30  A3();
31  NonTrivDtor n[3]; // expected-note {{because field 'n' has a non-trivial destructor}}
32};
33A3 a3; // expected-error {{deleted function}}
34struct A4 {
35  A4();
36  union {
37    NonTrivDtor n[3]; // expected-note {{because field 'n' has a non-trivial destructor}}
38  };
39};
40A4 a4; // expected-error {{deleted function}}
41
42// -- any of the non-static data members has class type M (or array thereof) and
43// M has a deleted or inaccessible destructor.
44struct B1 {
45  B1();
46  DeletedDtor a; // expected-note {{because field 'a' has a deleted destructor}}
47};
48B1 b1; // expected-error {{deleted function}}
49struct B2 {
50  B2();
51  InaccessibleDtor a; // expected-note {{because field 'a' has an inaccessible destructor}}
52};
53B2 b2; // expected-error {{deleted function}}
54struct B3 {
55  B3();
56  DeletedDtor a[4]; // expected-note {{because field 'a' has a deleted destructor}}
57};
58B3 b3; // expected-error {{deleted function}}
59struct B4 {
60  B4();
61  InaccessibleDtor a[4]; // expected-note {{because field 'a' has an inaccessible destructor}}
62};
63B4 b4; // expected-error {{deleted function}}
64union B5 {
65  B5();
66  // FIXME: Describe the anonymous union member better than ''.
67  union { // expected-note {{because field '' has a deleted destructor}}
68    DeletedDtor a; // expected-note {{because field 'a' has a deleted destructor}}
69  };
70};
71B5 b5; // expected-error {{deleted function}}
72union B6 {
73  B6();
74  union { // expected-note {{because field '' has a deleted destructor}}
75    InaccessibleDtor a; // expected-note {{because field 'a' has an inaccessible destructor}}
76  };
77};
78B6 b6; // expected-error {{deleted function}}
79
80// -- any direct or virtual base class has a deleted or inaccessible destructor.
81struct C1 : DeletedDtor { C1(); } c1; // expected-error {{deleted function}} expected-note {{base class 'DeletedDtor' has a deleted destructor}}
82struct C2 : InaccessibleDtor { C2(); } c2; // expected-error {{deleted function}} expected-note {{base class 'InaccessibleDtor' has an inaccessible destructor}}
83struct C3 : virtual DeletedDtor { C3(); } c3; // expected-error {{deleted function}} expected-note {{base class 'DeletedDtor' has a deleted destructor}}
84struct C4 : virtual InaccessibleDtor { C4(); } c4; // expected-error {{deleted function}} expected-note {{base class 'InaccessibleDtor' has an inaccessible destructor}}
85
86// -- for a virtual destructor, lookup of the non-array deallocation function
87// results in an ambiguity or a function that is deleted or inaccessible.
88class D1 {
89  void operator delete(void*);
90public:
91  virtual ~D1() = default;
92} d1; // ok
93struct D2 : D1 { // expected-note {{deleted here}}
94  // implicitly-virtual destructor
95} d2; // expected-error {{deleted function}}
96struct D3 {
97  virtual ~D3() = default; // expected-note {{deleted here}}
98  void operator delete(void*, double = 0.0);
99  void operator delete(void*, char = 0);
100} d3; // expected-error {{deleted function}}
101struct D4 {
102  virtual ~D4() = default; // expected-note {{deleted here}}
103  void operator delete(void*) = delete;
104} d4; // expected-error {{deleted function}}
105