blob: 4d856eb48ce7a37d4bc8de6ecaa5d35b71bdbc37 [file] [log] [blame]
Stephen Hines86277eb2015-03-23 12:06:32 -07001// 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
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -07006// types of inheritance, and both virtual and non-virtual member functions.
Stephen Hines86277eb2015-03-23 12:06:32 -07007
8#include "utils.h"
9
10struct A {
11 virtual void f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070012 void g();
Stephen Hines86277eb2015-03-23 12:06:32 -070013};
14
15void A::f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070016void A::g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070017
18struct A2 : A {
19 virtual void f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070020 void g();
Stephen Hines86277eb2015-03-23 12:06:32 -070021};
22
23void A2::f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070024void A2::g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070025
26struct B {
27 virtual void f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070028 void g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070029};
30
31struct B2 : B {
32 virtual void f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070033 void g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070034};
35
36namespace {
37
38struct C {
39 virtual void f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070040 void g();
Stephen Hines86277eb2015-03-23 12:06:32 -070041};
42
43void C::f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070044void C::g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070045
46struct C2 : C {
47 virtual void f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070048 void g();
Stephen Hines86277eb2015-03-23 12:06:32 -070049};
50
51void C2::f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070052void C2::g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070053
54struct D {
55 virtual void f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070056 void g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070057};
58
59struct D2 : D {
60 virtual void f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070061 void g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070062};
63
64}
65
66struct E {
67 virtual void f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070068 void g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070069};
70
71struct E2 : virtual E {
72 virtual void f() {}
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070073 void g() {}
Stephen Hines86277eb2015-03-23 12:06:32 -070074};
75
76int main() {
77 A *a = new A;
78 break_optimization(a);
79 a->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070080 a->g();
Stephen Hines86277eb2015-03-23 12:06:32 -070081 a = new A2;
82 break_optimization(a);
83 a->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070084 a->g();
Stephen Hines86277eb2015-03-23 12:06:32 -070085
86 B *b = new B;
87 break_optimization(b);
88 b->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070089 b->g();
Stephen Hines86277eb2015-03-23 12:06:32 -070090 b = new B2;
91 break_optimization(b);
92 b->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070093 b->g();
Stephen Hines86277eb2015-03-23 12:06:32 -070094
95 C *c = new C;
96 break_optimization(c);
97 c->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070098 c->g();
Stephen Hines86277eb2015-03-23 12:06:32 -070099 c = new C2;
100 break_optimization(c);
101 c->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -0700102 c->g();
Stephen Hines86277eb2015-03-23 12:06:32 -0700103
104 D *d = new D;
105 break_optimization(d);
106 d->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -0700107 d->g();
Stephen Hines86277eb2015-03-23 12:06:32 -0700108 d = new D2;
109 break_optimization(d);
110 d->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -0700111 d->g();
Stephen Hines86277eb2015-03-23 12:06:32 -0700112
113 E *e = new E;
114 break_optimization(e);
115 e->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -0700116 e->g();
Stephen Hines86277eb2015-03-23 12:06:32 -0700117 e = new E2;
118 break_optimization(e);
119 e->f();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -0700120 e->g();
Stephen Hines86277eb2015-03-23 12:06:32 -0700121}