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