19a561d539158a30b68fc258b81a994f3fac10212Richard Smith// RUN: %clang_cc1 -verify -std=c++11 %s
29a561d539158a30b68fc258b81a994f3fac10212Richard Smith
39a561d539158a30b68fc258b81a994f3fac10212Richard Smithstruct NonTrivDtor {
49a561d539158a30b68fc258b81a994f3fac10212Richard Smith  ~NonTrivDtor();
59a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
69a561d539158a30b68fc258b81a994f3fac10212Richard Smithstruct DeletedDtor {
76c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  ~DeletedDtor() = delete; // expected-note 5 {{deleted here}}
89a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
99a561d539158a30b68fc258b81a994f3fac10212Richard Smithclass InaccessibleDtor {
109a561d539158a30b68fc258b81a994f3fac10212Richard Smith  ~InaccessibleDtor() = default;
119a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
129a561d539158a30b68fc258b81a994f3fac10212Richard Smith
139a561d539158a30b68fc258b81a994f3fac10212Richard Smith// A defaulted destructor for a class X is defined as deleted if:
149a561d539158a30b68fc258b81a994f3fac10212Richard Smith
159a561d539158a30b68fc258b81a994f3fac10212Richard Smith// -- X is a union-like class that has a variant member with a non-trivial
169a561d539158a30b68fc258b81a994f3fac10212Richard Smith// destructor.
176c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion A1 {
189a561d539158a30b68fc258b81a994f3fac10212Richard Smith  A1();
19a2e76f56c60dbd4de3dc0fed02bb01bea4dcff81Richard Smith  NonTrivDtor n; // expected-note {{destructor of 'A1' is implicitly deleted because variant field 'n' has a non-trivial destructor}}
209a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
219a561d539158a30b68fc258b81a994f3fac10212Richard SmithA1 a1; // expected-error {{deleted function}}
226c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct A2 {
239a561d539158a30b68fc258b81a994f3fac10212Richard Smith  A2();
249a561d539158a30b68fc258b81a994f3fac10212Richard Smith  union {
25a2e76f56c60dbd4de3dc0fed02bb01bea4dcff81Richard Smith    NonTrivDtor n; // expected-note {{because variant field 'n' has a non-trivial destructor}}
269a561d539158a30b68fc258b81a994f3fac10212Richard Smith  };
279a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
289a561d539158a30b68fc258b81a994f3fac10212Richard SmithA2 a2; // expected-error {{deleted function}}
296c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion A3 {
309a561d539158a30b68fc258b81a994f3fac10212Richard Smith  A3();
31a2e76f56c60dbd4de3dc0fed02bb01bea4dcff81Richard Smith  NonTrivDtor n[3]; // expected-note {{because variant field 'n' has a non-trivial destructor}}
329a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
339a561d539158a30b68fc258b81a994f3fac10212Richard SmithA3 a3; // expected-error {{deleted function}}
346c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct A4 {
359a561d539158a30b68fc258b81a994f3fac10212Richard Smith  A4();
369a561d539158a30b68fc258b81a994f3fac10212Richard Smith  union {
37a2e76f56c60dbd4de3dc0fed02bb01bea4dcff81Richard Smith    NonTrivDtor n[3]; // expected-note {{because variant field 'n' has a non-trivial destructor}}
389a561d539158a30b68fc258b81a994f3fac10212Richard Smith  };
399a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
409a561d539158a30b68fc258b81a994f3fac10212Richard SmithA4 a4; // expected-error {{deleted function}}
419a561d539158a30b68fc258b81a994f3fac10212Richard Smith
429a561d539158a30b68fc258b81a994f3fac10212Richard Smith// -- any of the non-static data members has class type M (or array thereof) and
439a561d539158a30b68fc258b81a994f3fac10212Richard Smith// M has a deleted or inaccessible destructor.
446c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct B1 {
459a561d539158a30b68fc258b81a994f3fac10212Richard Smith  B1();
466c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  DeletedDtor a; // expected-note {{because field 'a' has a deleted destructor}}
479a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
489a561d539158a30b68fc258b81a994f3fac10212Richard SmithB1 b1; // expected-error {{deleted function}}
496c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct B2 {
509a561d539158a30b68fc258b81a994f3fac10212Richard Smith  B2();
516c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  InaccessibleDtor a; // expected-note {{because field 'a' has an inaccessible destructor}}
529a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
539a561d539158a30b68fc258b81a994f3fac10212Richard SmithB2 b2; // expected-error {{deleted function}}
546c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct B3 {
559a561d539158a30b68fc258b81a994f3fac10212Richard Smith  B3();
566c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  DeletedDtor a[4]; // expected-note {{because field 'a' has a deleted destructor}}
579a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
589a561d539158a30b68fc258b81a994f3fac10212Richard SmithB3 b3; // expected-error {{deleted function}}
596c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct B4 {
609a561d539158a30b68fc258b81a994f3fac10212Richard Smith  B4();
616c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  InaccessibleDtor a[4]; // expected-note {{because field 'a' has an inaccessible destructor}}
629a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
639a561d539158a30b68fc258b81a994f3fac10212Richard SmithB4 b4; // expected-error {{deleted function}}
646c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion B5 {
659a561d539158a30b68fc258b81a994f3fac10212Richard Smith  B5();
666c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  // FIXME: Describe the anonymous union member better than ''.
676c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  union { // expected-note {{because field '' has a deleted destructor}}
686c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith    DeletedDtor a; // expected-note {{because field 'a' has a deleted destructor}}
699a561d539158a30b68fc258b81a994f3fac10212Richard Smith  };
709a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
719a561d539158a30b68fc258b81a994f3fac10212Richard SmithB5 b5; // expected-error {{deleted function}}
726c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion B6 {
739a561d539158a30b68fc258b81a994f3fac10212Richard Smith  B6();
746c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  union { // expected-note {{because field '' has a deleted destructor}}
756c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith    InaccessibleDtor a; // expected-note {{because field 'a' has an inaccessible destructor}}
769a561d539158a30b68fc258b81a994f3fac10212Richard Smith  };
779a561d539158a30b68fc258b81a994f3fac10212Richard Smith};
789a561d539158a30b68fc258b81a994f3fac10212Richard SmithB6 b6; // expected-error {{deleted function}}
799a561d539158a30b68fc258b81a994f3fac10212Richard Smith
809a561d539158a30b68fc258b81a994f3fac10212Richard Smith// -- any direct or virtual base class has a deleted or inaccessible destructor.
816c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct C1 : DeletedDtor { C1(); } c1; // expected-error {{deleted function}} expected-note {{base class 'DeletedDtor' has a deleted destructor}}
826c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct C2 : InaccessibleDtor { C2(); } c2; // expected-error {{deleted function}} expected-note {{base class 'InaccessibleDtor' has an inaccessible destructor}}
836c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct C3 : virtual DeletedDtor { C3(); } c3; // expected-error {{deleted function}} expected-note {{base class 'DeletedDtor' has a deleted destructor}}
846c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct C4 : virtual InaccessibleDtor { C4(); } c4; // expected-error {{deleted function}} expected-note {{base class 'InaccessibleDtor' has an inaccessible destructor}}
859a561d539158a30b68fc258b81a994f3fac10212Richard Smith
869a561d539158a30b68fc258b81a994f3fac10212Richard Smith// -- for a virtual destructor, lookup of the non-array deallocation function
879a561d539158a30b68fc258b81a994f3fac10212Richard Smith// results in an ambiguity or a function that is deleted or inaccessible.
889a561d539158a30b68fc258b81a994f3fac10212Richard Smithclass D1 {
899a561d539158a30b68fc258b81a994f3fac10212Richard Smith  void operator delete(void*);
909a561d539158a30b68fc258b81a994f3fac10212Richard Smithpublic:
910ab5b4c438b40c72252933072d4c9e9a948106f0Richard Smith  virtual ~D1() = default; // expected-note {{here}}
929a561d539158a30b68fc258b81a994f3fac10212Richard Smith} d1; // ok
930ab5b4c438b40c72252933072d4c9e9a948106f0Richard Smithstruct D2 : D1 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}} \
940ab5b4c438b40c72252933072d4c9e9a948106f0Richard Smith                 // expected-error {{deleted function '~D2' cannot override a non-deleted}}
959a561d539158a30b68fc258b81a994f3fac10212Richard Smith  // implicitly-virtual destructor
969a561d539158a30b68fc258b81a994f3fac10212Richard Smith} d2; // expected-error {{deleted function}}
975bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smithstruct D3 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}}
985bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smith  virtual ~D3() = default; // expected-note {{explicitly defaulted function was implicitly deleted here}}
999a561d539158a30b68fc258b81a994f3fac10212Richard Smith  void operator delete(void*, double = 0.0);
1009a561d539158a30b68fc258b81a994f3fac10212Richard Smith  void operator delete(void*, char = 0);
1019a561d539158a30b68fc258b81a994f3fac10212Richard Smith} d3; // expected-error {{deleted function}}
1025bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smithstruct D4 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}}
1035bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smith  virtual ~D4() = default; // expected-note {{implicitly deleted here}}
1049a561d539158a30b68fc258b81a994f3fac10212Richard Smith  void operator delete(void*) = delete;
1059a561d539158a30b68fc258b81a994f3fac10212Richard Smith} d4; // expected-error {{deleted function}}
106