1213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith// RUN: %clang_cc1 -verify -std=c++11 %s -fcxx-exceptions
2213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith
3213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithclass BadDtor {
4213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  // A private, but nonetheless trivial, destructor.
503f68788036803c0bad3fe6ea9a4ea31ba195a2bRichard Smith  ~BadDtor() = default; // expected-note 9{{here}}
6213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  friend class K;
7213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith};
8213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithvoid f() {
9213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  BadDtor *p = new BadDtor[3]; // expected-error {{private destructor}}
10213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  delete [] p; // expected-error {{private destructor}}
11213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  const BadDtor &dd2 = BadDtor(); // expected-error {{private destructor}}
12213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  BadDtor dd; // expected-error {{private destructor}}
13213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  throw dd; // expected-error {{private destructor}}
14213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith}
156c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct V {
16dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith  V();
176c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  BadDtor bd; // expected-note {{inaccessible destructor}}
18dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith};
1903f68788036803c0bad3fe6ea9a4ea31ba195a2bRichard SmithV v; // expected-error {{deleted function}}
206c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct W : BadDtor { // expected-note {{inaccessible destructor}}
21dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith  W();
22dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith};
2303f68788036803c0bad3fe6ea9a4ea31ba195a2bRichard SmithW w; // expected-error {{deleted function}}
24213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithstruct X : BadDtor { // expected-error {{private destructor}}
25213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  ~X() {}
26213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith};
27213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithstruct Y {
28213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  BadDtor dd; // expected-error {{private destructor}}
29213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  ~Y() {}
30213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith};
31213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithstruct Z : virtual BadDtor { // expected-error {{private destructor}}
32213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  ~Z() {}
33213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith};
34213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard SmithBadDtor dd; // expected-error {{private destructor}}
35213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith
36213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithclass K : BadDtor {
37213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  void f() {
38213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    BadDtor *p = new BadDtor[3];
39213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    delete [] p;
40213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    const BadDtor &dd2 = BadDtor();
41213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    BadDtor dd;
42213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    throw dd;
43213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith
44213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    {
45213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith      BadDtor x;
46213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith      goto dont_call_dtor;
47213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    }
48213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smithdont_call_dtor:
49213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    ;
50213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  }
51213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  struct Z : virtual BadDtor {
52213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith    ~Z() {}
53213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  };
54213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  BadDtor dd;
55213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith  ~K();
56213d70b58b4f48050c3e545ce1bd4b0ec3af74beRichard Smith};
57