source: tests/exceptions/interact.cfa @ 3eb5a478

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-astnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 3eb5a478 was 3eb5a478, checked in by Andrew Beach <ajbeach@…>, 4 years ago

Fixed the disabled exceptions/resume test. Added more tests in exceptions/interact, one of which is disabled.

  • 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#if 0
89        printf("\n");
90
91        // Unwinding a resumption catch does not break the system.
92        try {
93                try {
94                        try {
95                                try {
96                                        printf("throwing resume moon\n");
97                                        THROW_RESUME(&(moon){});
98                                } catch (star *) {
99                                        printf("termination catch\n");
100                                }
101                                printf("throwing resume star\n");
102                                THROW_RESUME(&(star){});
103                        } catchResume (star *) {
104                                printf("resumption star catch\n");
105                        }
106                } catchResume (moon *) {
107                        printf("resumption moon catch, will terminate\n");
108                        THROW(&(star){});
109                }
110        } catchResume (star *) {
111                printf("outermost catch (error)\n");
112        }
113#endif
114}
Note: See TracBrowser for help on using the repository browser.