]>
Commit | Line | Data |
---|---|---|
92a42be0 SL |
1 | // RUN: %clangxx_cfi -o %t %s |
2 | // RUN: %t | |
3 | ||
4 | // Tests that the CFI mechanism does not crash the program when making various | |
5 | // kinds of valid calls involving classes with various different linkages and | |
6 | // types of inheritance, and both virtual and non-virtual member functions. | |
7 | ||
8 | #include "utils.h" | |
9 | ||
10 | struct A { | |
11 | virtual void f(); | |
12 | void g(); | |
13 | }; | |
14 | ||
15 | void A::f() {} | |
16 | void A::g() {} | |
17 | ||
18 | struct A2 : A { | |
19 | virtual void f(); | |
20 | void g(); | |
21 | }; | |
22 | ||
23 | void A2::f() {} | |
24 | void A2::g() {} | |
25 | ||
26 | struct B { | |
27 | virtual void f() {} | |
28 | void g() {} | |
29 | }; | |
30 | ||
31 | struct B2 : B { | |
32 | virtual void f() {} | |
33 | void g() {} | |
34 | }; | |
35 | ||
36 | namespace { | |
37 | ||
38 | struct C { | |
39 | virtual void f(); | |
40 | void g(); | |
41 | }; | |
42 | ||
43 | void C::f() {} | |
44 | void C::g() {} | |
45 | ||
46 | struct C2 : C { | |
47 | virtual void f(); | |
48 | void g(); | |
49 | }; | |
50 | ||
51 | void C2::f() {} | |
52 | void C2::g() {} | |
53 | ||
54 | struct D { | |
55 | virtual void f() {} | |
56 | void g() {} | |
57 | }; | |
58 | ||
59 | struct D2 : D { | |
60 | virtual void f() {} | |
61 | void g() {} | |
62 | }; | |
63 | ||
64 | } | |
65 | ||
66 | struct E { | |
67 | virtual void f() {} | |
68 | void g() {} | |
69 | }; | |
70 | ||
71 | struct E2 : virtual E { | |
72 | virtual void f() {} | |
73 | void g() {} | |
74 | }; | |
75 | ||
76 | int main() { | |
77 | A *a = new A; | |
78 | break_optimization(a); | |
79 | a->f(); | |
80 | a->g(); | |
81 | a = new A2; | |
82 | break_optimization(a); | |
83 | a->f(); | |
84 | a->g(); | |
85 | ||
86 | B *b = new B; | |
87 | break_optimization(b); | |
88 | b->f(); | |
89 | b->g(); | |
90 | b = new B2; | |
91 | break_optimization(b); | |
92 | b->f(); | |
93 | b->g(); | |
94 | ||
95 | C *c = new C; | |
96 | break_optimization(c); | |
97 | c->f(); | |
98 | c->g(); | |
99 | c = new C2; | |
100 | break_optimization(c); | |
101 | c->f(); | |
102 | c->g(); | |
103 | ||
104 | D *d = new D; | |
105 | break_optimization(d); | |
106 | d->f(); | |
107 | d->g(); | |
108 | d = new D2; | |
109 | break_optimization(d); | |
110 | d->f(); | |
111 | d->g(); | |
112 | ||
113 | E *e = new E; | |
114 | break_optimization(e); | |
115 | e->f(); | |
116 | e->g(); | |
117 | e = new E2; | |
118 | break_optimization(e); | |
119 | e->f(); | |
120 | e->g(); | |
121 | } |