p5-0x.cpp revision 9a561d539158a30b68fc258b81a994f3fac10212
1// RUN: %clang_cc1 -verify -std=c++11 %s 2 3struct NonTrivDtor { 4 ~NonTrivDtor(); 5}; 6struct DeletedDtor { 7 ~DeletedDtor() = delete; 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 { // expected-note {{here}} 18 A1(); 19 NonTrivDtor n; 20}; 21A1 a1; // expected-error {{deleted function}} 22struct A2 { // expected-note {{here}} 23 A2(); 24 union { 25 NonTrivDtor n; 26 }; 27}; 28A2 a2; // expected-error {{deleted function}} 29union A3 { // expected-note {{here}} 30 A3(); 31 NonTrivDtor n[3]; 32}; 33A3 a3; // expected-error {{deleted function}} 34struct A4 { // expected-note {{here}} 35 A4(); 36 union { 37 NonTrivDtor n[3]; 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 { // expected-note {{here}} 45 B1(); 46 DeletedDtor a; 47}; 48B1 b1; // expected-error {{deleted function}} 49struct B2 { // expected-note {{here}} 50 B2(); 51 InaccessibleDtor a; 52}; 53B2 b2; // expected-error {{deleted function}} 54struct B3 { // expected-note {{here}} 55 B3(); 56 DeletedDtor a[4]; 57}; 58B3 b3; // expected-error {{deleted function}} 59struct B4 { // expected-note {{here}} 60 B4(); 61 InaccessibleDtor a[4]; 62}; 63B4 b4; // expected-error {{deleted function}} 64union B5 { // expected-note {{here}} 65 B5(); 66 union { 67 DeletedDtor a; 68 }; 69}; 70B5 b5; // expected-error {{deleted function}} 71union B6 { // expected-note {{here}} 72 B6(); 73 union { 74 InaccessibleDtor a; 75 }; 76}; 77B6 b6; // expected-error {{deleted function}} 78 79// -- any direct or virtual base class has a deleted or inaccessible destructor. 80struct C1 : DeletedDtor { C1(); } c1; // expected-error {{deleted function}} expected-note {{here}} 81struct C2 : InaccessibleDtor { C2(); } c2; // expected-error {{deleted function}} expected-note {{here}} 82struct C3 : virtual DeletedDtor { C3(); } c3; // expected-error {{deleted function}} expected-note {{here}} 83struct C4 : virtual InaccessibleDtor { C4(); } c4; // expected-error {{deleted function}} expected-note {{here}} 84 85// -- for a virtual destructor, lookup of the non-array deallocation function 86// results in an ambiguity or a function that is deleted or inaccessible. 87class D1 { 88 void operator delete(void*); 89public: 90 virtual ~D1() = default; 91} d1; // ok 92struct D2 : D1 { // expected-note {{deleted here}} 93 // implicitly-virtual destructor 94} d2; // expected-error {{deleted function}} 95struct D3 { 96 virtual ~D3() = default; // expected-note {{deleted here}} 97 void operator delete(void*, double = 0.0); 98 void operator delete(void*, char = 0); 99} d3; // expected-error {{deleted function}} 100struct D4 { 101 virtual ~D4() = default; // expected-note {{deleted here}} 102 void operator delete(void*) = delete; 103} d4; // expected-error {{deleted function}} 104