52 lines · cpp
1// RUN: %clang_cc1 -std=c++17 -verify -Wno-defaulted-function-deleted %s -triple x86_64-windows-msvc2 3// MSVC emits the complete destructor as if it were its own special member.4// Clang attempts to do the same. This affects the diagnostics clang emits,5// because deleting a type with a user declared constructor implicitly6// references the destructors of virtual bases, which might be deleted or access7// controlled.8 9namespace t1 {10struct A {11 ~A() = delete; // expected-note {{deleted here}}12};13struct B {14 B() = default;15 A o; // expected-note {{destructor of 'B' is implicitly deleted because field 'o' has a deleted destructor}}16};17struct C : virtual B {18 ~C(); // expected-error {{attempt to use a deleted function}}19};20void delete1(C *p) { delete p; } // expected-note {{in implicit destructor for 't1::C' first required here}}21void delete2(C *p) { delete p; }22}23 24namespace t2 {25struct A {26private:27 ~A();28};29struct B {30 B() = default;31 A o; // expected-note {{destructor of 'B' is implicitly deleted because field 'o' has an inaccessible destructor}}32};33struct C : virtual B {34 ~C(); // expected-error {{attempt to use a deleted function}}35};36void useCompleteDtor(C *p) { delete p; } // expected-note {{in implicit destructor for 't2::C' first required here}}37}38 39namespace t3 {40template <unsigned N>41class Base { ~Base(); }; // expected-note 1{{declared private here}}42// No diagnostic.43class Derived0 : virtual Base<0> { ~Derived0(); };44class Derived1 : virtual Base<1> {};45// Emitting complete dtor causes a diagnostic.46struct Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}}47 virtual Base<2> {48 ~Derived2();49};50void useCompleteDtor(Derived2 *p) { delete p; } // expected-note {{in implicit destructor for 't3::Derived2' first required here}}51}52