Hans Wennborg | c9bd88e | 2014-01-14 19:35:09 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify %s |
| 2 | // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify %s |
Eli Friedman | aab1fda | 2010-08-07 23:11:44 +0000 | [diff] [blame] | 3 | // PR7800 |
| 4 | |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 5 | // The Microsoft ABI doesn't have the concept of key functions, so we have different |
| 6 | // expectations about when functions are first required for that case. |
| 7 | |
| 8 | #ifdef MSABI |
| 9 | // expected-note@+2 3 {{declared private here}} |
| 10 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 11 | class NoDestroy { ~NoDestroy(); }; // expected-note 3 {{declared private here}} |
Eli Friedman | aab1fda | 2010-08-07 23:11:44 +0000 | [diff] [blame] | 12 | struct A { |
| 13 | virtual ~A(); |
| 14 | }; |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 15 | |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 16 | #ifdef MSABI |
| 17 | // expected-error@+3 {{field of type 'NoDestroy' has private destructor}} |
| 18 | #endif |
Eli Friedman | aab1fda | 2010-08-07 23:11:44 +0000 | [diff] [blame] | 19 | struct B : public virtual A { |
| 20 | NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}} |
| 21 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 22 | #ifdef MSABI |
| 23 | // expected-note@+3 {{implicit default constructor for 'B' first required here}} |
| 24 | // expected-note@+2 {{implicit destructor for 'B' first required here}} |
| 25 | #endif |
Eli Friedman | aab1fda | 2010-08-07 23:11:44 +0000 | [diff] [blame] | 26 | struct D : public virtual B { |
| 27 | virtual void foo(); |
| 28 | ~D(); |
| 29 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 30 | #ifdef MSABI |
| 31 | D d; // expected-note {{implicit default constructor for 'D' first required here}} |
| 32 | #else |
Richard Smith | f24e6e7 | 2013-06-13 03:34:55 +0000 | [diff] [blame] | 33 | void D::foo() { // expected-note {{implicit destructor for 'B' first required here}} |
Eli Friedman | aab1fda | 2010-08-07 23:11:44 +0000 | [diff] [blame] | 34 | } |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 35 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 36 | |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 37 | #ifdef MSABI |
| 38 | // expected-error@+3 {{field of type 'NoDestroy' has private destructor}} |
| 39 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 40 | struct E : public virtual A { |
| 41 | NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}} |
| 42 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 43 | #ifdef MSABI |
| 44 | // expected-note@+2 {{implicit default constructor for 'E' first required here}} |
| 45 | #endif |
Richard Smith | f24e6e7 | 2013-06-13 03:34:55 +0000 | [diff] [blame] | 46 | struct F : public E { // expected-note {{implicit destructor for 'E' first required here}} |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 47 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 48 | #ifdef MSABI |
| 49 | // expected-note@+2 {{implicit default constructor for 'F' first required here}} |
| 50 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 51 | struct G : public virtual F { |
| 52 | virtual void foo(); |
| 53 | ~G(); |
| 54 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 55 | #ifdef MSABI |
| 56 | G g; // expected-note {{implicit default constructor for 'G' first required here}} |
| 57 | #else |
Richard Smith | f24e6e7 | 2013-06-13 03:34:55 +0000 | [diff] [blame] | 58 | void G::foo() { // expected-note {{implicit destructor for 'F' first required here}} |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 59 | } |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 60 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 61 | |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 62 | #ifdef MSABI |
| 63 | // expected-note@+3 {{'H' declared here}} |
| 64 | // expected-error@+3 {{field of type 'NoDestroy' has private destructor}} |
| 65 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 66 | struct H : public virtual A { |
| 67 | NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}} |
| 68 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 69 | #ifdef MSABI |
| 70 | // expected-error@+3 {{implicit default constructor for 'I' must explicitly initialize the base class 'H' which does not have a default constructor}} |
| 71 | // expected-note@+2 {{implicit destructor for 'H' first required here}} |
| 72 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 73 | struct I : public virtual H { |
| 74 | ~I(); |
| 75 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 76 | #ifdef MSABI |
| 77 | // expected-note@+3 {{implicit default constructor for 'H' first required here}} |
| 78 | // expected-note@+2 {{implicit default constructor for 'I' first required here}} |
| 79 | #endif |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 80 | struct J : public I { |
| 81 | virtual void foo(); |
| 82 | ~J(); |
| 83 | }; |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 84 | #ifdef MSABI |
| 85 | J j; // expected-note {{implicit default constructor for 'J' first required here}} |
| 86 | #else |
Richard Smith | f24e6e7 | 2013-06-13 03:34:55 +0000 | [diff] [blame] | 87 | void J::foo() { // expected-note {{implicit destructor for 'H' first required here}} |
Eli Friedman | 9129b00 | 2010-08-08 05:07:06 +0000 | [diff] [blame] | 88 | } |
Hans Wennborg | 9125b08 | 2014-01-13 19:48:13 +0000 | [diff] [blame] | 89 | #endif |