xref: /aosp_15_r20/external/clang/test/CodeGenCXX/thunks-available-externally.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm-only -O3
2*67e74705SXin Li 
3*67e74705SXin Li // Check that we don't assert on this case.
4*67e74705SXin Li namespace Test1 {
5*67e74705SXin Li 
6*67e74705SXin Li struct Incomplete;
7*67e74705SXin Li 
8*67e74705SXin Li struct A {
9*67e74705SXin Li   virtual void f();
10*67e74705SXin Li   virtual void g(Incomplete);
11*67e74705SXin Li   virtual void h();
12*67e74705SXin Li   virtual void i();
13*67e74705SXin Li   int a;
14*67e74705SXin Li };
15*67e74705SXin Li 
16*67e74705SXin Li struct B {
17*67e74705SXin Li   virtual void f();
18*67e74705SXin Li   virtual void g(Incomplete);
19*67e74705SXin Li   virtual void h();
20*67e74705SXin Li   virtual void i();
21*67e74705SXin Li   int b;
22*67e74705SXin Li };
23*67e74705SXin Li 
24*67e74705SXin Li struct C : A, B {
25*67e74705SXin Li   C();
26*67e74705SXin Li 
27*67e74705SXin Li   virtual void f();
28*67e74705SXin Li   virtual void g(Incomplete);
29*67e74705SXin Li   virtual void h();
30*67e74705SXin Li   virtual void i();
31*67e74705SXin Li };
32*67e74705SXin Li 
h()33*67e74705SXin Li void C::h() { }
34*67e74705SXin Li 
C()35*67e74705SXin Li C::C() { }
36*67e74705SXin Li 
i()37*67e74705SXin Li void C::i() { }
38*67e74705SXin Li 
39*67e74705SXin Li }
40*67e74705SXin Li 
41*67e74705SXin Li namespace Test2 {
42*67e74705SXin Li 
43*67e74705SXin Li struct A {
44*67e74705SXin Li   virtual void f();
45*67e74705SXin Li   int a;
46*67e74705SXin Li };
47*67e74705SXin Li 
48*67e74705SXin Li struct B {
49*67e74705SXin Li   virtual void f();
50*67e74705SXin Li   int b;
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li struct C : A, B {
54*67e74705SXin Li   virtual void f();
55*67e74705SXin Li };
56*67e74705SXin Li 
f(B * b)57*67e74705SXin Li static void f(B* b) {
58*67e74705SXin Li   b->f();
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li // Test that we don't assert.
64*67e74705SXin Li namespace Test3 {
65*67e74705SXin Li 
66*67e74705SXin Li struct A {
67*67e74705SXin Li   virtual ~A();
68*67e74705SXin Li 
69*67e74705SXin Li   int a;
70*67e74705SXin Li };
71*67e74705SXin Li 
72*67e74705SXin Li struct B : A { };
73*67e74705SXin Li struct C : virtual B { };
74*67e74705SXin Li 
f()75*67e74705SXin Li void f() {
76*67e74705SXin Li   C c;
77*67e74705SXin Li }
78*67e74705SXin Li 
79*67e74705SXin Li }
80