| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 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 | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 6 | // types of inheritance, and both virtual and non-virtual member functions. |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 7 | |
| 8 | #include "utils.h" | ||||
| 9 | |||||
| 10 | struct A { | ||||
| 11 | virtual void f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 12 | void g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 13 | }; |
| 14 | |||||
| 15 | void A::f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 16 | void A::g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 17 | |
| 18 | struct A2 : A { | ||||
| 19 | virtual void f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 20 | void g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 21 | }; |
| 22 | |||||
| 23 | void A2::f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 24 | void A2::g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 25 | |
| 26 | struct B { | ||||
| 27 | virtual void f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 28 | void g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 29 | }; |
| 30 | |||||
| 31 | struct B2 : B { | ||||
| 32 | virtual void f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 33 | void g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 34 | }; |
| 35 | |||||
| 36 | namespace { | ||||
| 37 | |||||
| 38 | struct C { | ||||
| 39 | virtual void f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 40 | void g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 41 | }; |
| 42 | |||||
| 43 | void C::f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 44 | void C::g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 45 | |
| 46 | struct C2 : C { | ||||
| 47 | virtual void f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 48 | void g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 49 | }; |
| 50 | |||||
| 51 | void C2::f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 52 | void C2::g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 53 | |
| 54 | struct D { | ||||
| 55 | virtual void f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 56 | void g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 57 | }; |
| 58 | |||||
| 59 | struct D2 : D { | ||||
| 60 | virtual void f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 61 | void g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 62 | }; |
| 63 | |||||
| 64 | } | ||||
| 65 | |||||
| 66 | struct E { | ||||
| 67 | virtual void f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 68 | void g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 69 | }; |
| 70 | |||||
| 71 | struct E2 : virtual E { | ||||
| 72 | virtual void f() {} | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 73 | void g() {} |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 74 | }; |
| 75 | |||||
| 76 | int main() { | ||||
| 77 | A *a = new A; | ||||
| 78 | break_optimization(a); | ||||
| 79 | a->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 80 | a->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 81 | a = new A2; |
| 82 | break_optimization(a); | ||||
| 83 | a->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 84 | a->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 85 | |
| 86 | B *b = new B; | ||||
| 87 | break_optimization(b); | ||||
| 88 | b->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 89 | b->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 90 | b = new B2; |
| 91 | break_optimization(b); | ||||
| 92 | b->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 93 | b->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 94 | |
| 95 | C *c = new C; | ||||
| 96 | break_optimization(c); | ||||
| 97 | c->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 98 | c->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 99 | c = new C2; |
| 100 | break_optimization(c); | ||||
| 101 | c->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 102 | c->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 103 | |
| 104 | D *d = new D; | ||||
| 105 | break_optimization(d); | ||||
| 106 | d->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 107 | d->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 108 | d = new D2; |
| 109 | break_optimization(d); | ||||
| 110 | d->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 111 | d->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 112 | |
| 113 | E *e = new E; | ||||
| 114 | break_optimization(e); | ||||
| 115 | e->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 116 | e->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 117 | e = new E2; |
| 118 | break_optimization(e); | ||||
| 119 | e->f(); | ||||
| Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame^] | 120 | e->g(); |
| Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 121 | } |