brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · aa19010 Raw
208 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify %s2// RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify -std=c++98 %s3// RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify -std=c++11 %s4// RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify %s5// RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify -std=c++98 %s6// RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify -std=c++11 %s7// PR78008 9// The Microsoft ABI doesn't have the concept of key functions, so we have different10// expectations about when functions are first required for that case.11 12class NoDestroy { ~NoDestroy(); };13#if __cplusplus <= 199711L14// expected-note@-2 3 {{declared private here}}15#ifdef MSABI16// expected-note@-4 3 {{declared private here}}17#endif18#endif19 20struct A {21  virtual ~A();22#if __cplusplus >= 201103L23  // expected-note@-2 3 {{overridden virtual function is here}}24#endif25};26 27struct B : public virtual A {28#if __cplusplus >= 201103L29// expected-error@-2 {{deleted function '~B' cannot override a non-deleted function}}30// expected-note@-3 {{overridden virtual function is here}}31#endif32 33  NoDestroy x;34#if __cplusplus <= 199711L35  // expected-error@-2 {{field of type 'NoDestroy' has private destructor}}36#ifdef MSABI37  // expected-error@-4 {{field of type 'NoDestroy' has private destructor}}38#endif39#else40  // expected-note@-7 {{destructor of 'B' is implicitly deleted because field 'x' has an inaccessible destructor}}41#ifdef MSABI42  // expected-note@-9 {{default constructor of 'B' is implicitly deleted because field 'x' has an inaccessible destructor}}43#endif44#endif45};46 47struct D : public virtual B {48#if __cplusplus <= 199711L49#ifdef MSABI50// expected-note@-3 {{implicit default constructor for 'B' first required here}}51// expected-note@-4 {{implicit destructor for 'B' first required here}}52#endif53#else54#ifdef MSABI55// expected-note@-8 {{default constructor of 'D' is implicitly deleted because base class 'B' has a deleted default constructor}}56#endif57#endif58  virtual void foo();59  ~D();60#if __cplusplus >= 201103L61  //expected-error@-2 {{non-deleted function '~D' cannot override a deleted function}}62#endif63};64 65#ifdef MSABI66D d;67#if __cplusplus <= 199711L68// expected-note@-2 2{{implicit default constructor for 'D' first required here}}69#else70// expected-error@-4 {{call to implicitly-deleted default constructor of 'D'}}å71#endif72#else73void D::foo() {74#if __cplusplus <= 199711L75// expected-note@-2 {{implicit destructor for 'B' first required here}}76#endif77}78#endif79 80struct E : public virtual A {81#if __cplusplus >= 201103L82// expected-error@-2 {{deleted function '~E' cannot override a non-deleted function}}83#endif84 85  NoDestroy x;86#if __cplusplus <= 199711L87  // expected-error@-2 {{field of type 'NoDestroy' has private destructor}}88#ifdef MSABI89  // expected-error@-4 {{field of type 'NoDestroy' has private destructor}}90#endif91#else92  // expected-note@-7 {{destructor of 'E' is implicitly deleted because field 'x' has an inaccessible destructor}}93#ifdef MSABI94  // expected-note@-9 {{default constructor of 'E' is implicitly deleted because field 'x' has an inaccessible destructor}}95#endif96#endif97};98 99struct F : public E {100#if __cplusplus <= 199711L101// expected-note@-2 {{implicit destructor for 'E' first required here}}102#ifdef MSABI103// expected-note@-4 {{implicit default constructor for 'E' first required here}}104#endif105#else106// expected-note@-7 {{overridden virtual function is here}}107#ifdef MSABI108// expected-note@-9 {{default constructor of 'F' is implicitly deleted because base class 'E' has a deleted default constructor}}109#endif110#endif111};112 113 114struct G : public virtual F {115#ifdef MSABI116#if __cplusplus <= 199711L117// expected-note@-3 {{implicit default constructor for 'F' first required here}}118// expected-note@-4 {{implicit destructor for 'F' first required here}}119#else120// expected-note@-6 {{default constructor of 'G' is implicitly deleted because base class 'F' has a deleted default constructor}}121#endif122#endif123 124  virtual void foo();125  ~G();126#if __cplusplus >= 201103L127  //expected-error@-2 {{non-deleted function '~G' cannot override a deleted function}}128#endif129};130 131#ifdef MSABI132G g;133#if __cplusplus <= 199711L134// expected-note@-2 2{{implicit default constructor for 'G' first required here}}135#else136// expected-error@-4 {{call to implicitly-deleted default constructor of 'G'}}137#endif138#else139void G::foo() {140#if __cplusplus <= 199711L141// expected-note@-2 {{implicit destructor for 'F' first required here}}142#endif143}144#endif145 146struct H : public virtual A {147#if __cplusplus >= 201103L148// expected-error@-2 {{deleted function '~H' cannot override a non-deleted function}}149// expected-note@-3 {{overridden virtual function is here}}150#endif151 152  NoDestroy x;153#if __cplusplus <= 199711L154  // expected-error@-2 {{field of type 'NoDestroy' has private destructor}}155#ifdef MSABI156  // expected-error@-4 {{field of type 'NoDestroy' has private destructor}}157#endif158#else159  // expected-note@-7 {{destructor of 'H' is implicitly deleted because field 'x' has an inaccessible destructor}}160#ifdef MSABI161  // expected-note@-9 {{default constructor of 'H' is implicitly deleted because field 'x' has an inaccessible destructor}}162#endif163#endif164};165 166struct I : public virtual H {167#ifdef MSABI168#if __cplusplus > 199711L169// expected-note@-3 {{default constructor of 'I' is implicitly deleted because base class 'H' has a deleted default constructor}}170#endif171#endif172 173  ~I();174#if __cplusplus >= 201103L175// expected-error@-2 {{non-deleted function '~I' cannot override a deleted function}}176#endif177};178 179struct J : public I {180#ifdef MSABI181#if __cplusplus <= 199711L182// expected-note@-3 {{implicit default constructor for 'H' first required here}}183// expected-note@-4 {{implicit destructor for 'H' first required here}}184#else185// expected-note@-6 {{default constructor of 'J' is implicitly deleted because base class 'I' has a deleted default constructor}}186#endif187#endif188 189  virtual void foo();190  ~J();191};192 193#ifdef MSABI194J j;195#if __cplusplus <= 199711L196// expected-note@-2 2{{implicit default constructor for 'J' first required here}}197#else198// expected-error@-4 {{call to implicitly-deleted default constructor of 'J'}}199#endif200 201#else202void J::foo() {203#if __cplusplus <= 199711L204// expected-note@-2 {{implicit destructor for 'H' first required here}}205#endif206}207#endif208