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