source: tests/exceptions/resume.cfa@ 6256891

ADT ast-experimental enum pthread-emulation qualifiedEnum
Last change on this file since 6256891 was d00d581, checked in by Henry Xue <y58xue@…>, 4 years ago

Update exception tests to use new syntax

  • Property mode set to 100644
File size: 2.7 KB
Line 
1// Resumption Exception Tests
2
3#include "except-io.hfa"
4
5exception yin {};
6exception yang {};
7exception zen {};
8
9vtable(yin) yin_vt;
10vtable(yang) yang_vt;
11vtable(zen) zen_vt;
12
13void in_void(void);
14
15int main(int argc, char * argv[]) {
16 yin a_yin = {&yin_vt};
17 yang a_yang = {&yang_vt};
18 zen a_zen = {&zen_vt};
19
20 // The simple throw catchResume test.
21 try {
22 loud_exit a = "simple try clause";
23 printf("simple throw\n");
24 throwResume a_zen;
25 printf("end of try clause\n");
26 } catchResume (zen * error) {
27 loud_exit a = "simple catch clause";
28 printf("simple catch\n");
29 }
30 printf("\n");
31
32 // Throw catch-all test.
33 try {
34 throwResume a_zen;
35 } catchResume (exception_t * error) {
36 printf("catch-all\n");
37 }
38 printf("\n");
39
40 // Don't catch if handler does not match exception.
41 try {
42 try {
43 throwResume a_yin;
44 } catchResume (zen *) {
45 printf("caught yin as zen\n");
46 }
47 } catchResume (yang *) {
48 printf("caught yin as yang\n");
49 } catchResume (yin *) {
50 printf("caught yin as yin\n");
51 }
52 printf("\n");
53
54 // Test rethrowing an exception.
55 try {
56 try {
57 loud_exit a = "rethrow inner try";
58 printf("rethrow inner try\n");
59 throwResume a_zen;
60 } catchResume (zen *) {
61 loud_exit a = "rethrowing catch clause";
62 printf("caught throw, will rethrow\n");
63 throwResume;
64 }
65 } catchResume (zen *) {
66 loud_exit a = "rethrow catch clause";
67 printf("caught rethrow\n");
68 }
69 printf("\n");
70
71 // Throw a different exception in a catch.
72 try {
73 try {
74 throwResume a_yin;
75 } catchResume (yin *) {
76 printf("caught yin, will throw yang\n");
77 throwResume a_yang;
78 } catchResume (yang *) {
79 printf("caught exception from same try\n");
80 }
81 } catchResume (yang *) {
82 printf("caught yang\n");
83 }
84 printf("\n");
85
86 // Another throw in the catch does not interfere.
87 try {
88 try {
89 printf("throwing first exception\n");
90 throwResume a_yin;
91 } catchResume (yin *) {
92 printf("caught first exception\n");
93 try {
94 printf("throwing second exception\n");
95 throwResume a_yang;
96 } catchResume (yang *) {
97 printf("caught second exception\n");
98 }
99 throwResume;
100 }
101 } catchResume (yin *) {
102 printf("recaught first exception\n");
103 } catchResume (yang *) {
104 printf("caught second exception (bad location)\n");
105 }
106 printf("\n");
107
108 // Check successive operations.
109 try {
110 try {
111 throwResume a_zen;
112 throwResume a_zen;
113 } catchResume (zen *) {
114 printf("inner catch\n");
115 }
116 throwResume a_zen;
117 } catchResume (zen *) {
118 printf("outer catch\n");
119 }
120 printf("\n");
121
122 in_void();
123}
124
125// Do a throw and rethrow in a void function.
126void in_void(void) {
127 zen a_zen = {&zen_vt};
128 try {
129 try {
130 printf("throw\n");
131 throwResume a_zen;
132 } catchResume (zen *) {
133 printf("rethrow\n");
134 throwResume;
135 }
136 } catchResume (zen *) {
137 printf("handle\n");
138 }
139}
Note: See TracBrowser for help on using the repository browser.