source: tests/exceptions/interact.cfa@ 0a2e1c05

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 0a2e1c05 was f1b6671, checked in by Andrew Beach <ajbeach@…>, 5 years ago

Unwinding is now handled in exception handling code. That is used to fix one bug, other exception tests added. Noise from the change altered one other test.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1// Testing Interactions Between Termination and Resumption
2
3#include "except-mac.hfa"
4#include "except-io.hfa"
5
6TRIVIAL_EXCEPTION(star);
7TRIVIAL_EXCEPTION(moon);
8
9int main(int argc, char * argv[]) {
10 // Resume falls back to terminate.
11 try {
12 THROW_RESUME(&(star){});
13 } catch (star *) {
14 printf("caught as termination\n");
15 }
16 // Variant of the above to check timing.
17 try {
18 loud_region a = "try block with resume throw";
19 THROW_RESUME(&(star){});
20 } catch (star *) {
21 printf("caught as termination\n");
22 } catchResume (star *) {
23 printf("intermediate rethrow\n");
24 throwResume;
25 }
26 printf("\n");
27
28 // Resume does not catch terminate.
29 try {
30 try {
31 THROW(&(star){});
32 } catchResume (star *) {
33 printf("resume catch on terminate\n");
34 }
35 } catchResume (star *) {
36 printf("resume catch on terminate\n");
37 } catch (star *) {
38 printf("terminate catch on terminate\n");
39 }
40 printf("\n");
41
42 // Terminate does not catch resume.
43 try {
44 try {
45 THROW_RESUME(&(star){});
46 } catch (star *) {
47 printf("terminate catch on resume\n");
48 }
49 } catch (star *) {
50 printf("terminate catch on resume\n");
51 } catchResume (star *) {
52 printf("resume catch on resume\n");
53 }
54 printf("\n");
55
56 // Resume a termination exception.
57 try {
58 try {
59 try {
60 THROW(&(star){});
61 } catchResume (star *) {
62 printf("inner resume catch (error)\n");
63 }
64 } catch (star * error) {
65 printf("termination catch, will resume\n");
66 THROW_RESUME(error);
67 }
68 } catchResume (star *) {
69 printf("outer resume catch\n");
70 }
71 printf("\n");
72
73 // Terminate a resumption exception.
74 try {
75 try {
76 try {
77 THROW_RESUME(&(star){});
78 } catch (star *) {
79 printf("inner termination catch\n");
80 }
81 } catchResume (star * error) {
82 printf("resumption catch, will terminate\n");
83 THROW(error);
84 }
85 } catch (star *) {
86 printf("outer terminate catch (error)\n");
87 }
88 printf("\n");
89
90 // Unwinding a resumption catch does not break the system.
91 try {
92 try {
93 try {
94 try {
95 printf("throwing resume moon\n");
96 THROW_RESUME(&(moon){});
97 } catch (star *) {
98 printf("termination catch\n");
99 }
100 printf("throwing resume star\n");
101 THROW_RESUME(&(star){});
102 } catchResume (star *) {
103 printf("resumption star catch\n");
104 }
105 } catchResume (moon *) {
106 printf("resumption moon catch, will terminate\n");
107 THROW(&(star){});
108 }
109 } catchResume (star *) {
110 printf("outermost catch (error)\n");
111 }
112}
Note: See TracBrowser for help on using the repository browser.