brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 78a36df Raw
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