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 Smithvoid 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