source: tests/exceptions/defaults.cfa @ a5a08a05

ADTast-experimentalenumforall-pointer-decaypthread-emulationqualifiedEnum
Last change on this file since a5a08a05 was d00d581, checked in by Henry Xue <y58xue@…>, 3 years ago

Update exception tests to use new syntax

  • Property mode set to 100644
File size: 2.2 KB
RevLine 
[8ad5752]1// Tests for providing new default operations.
2
3#include <string.h>
4#include <exception.hfa>
5
[d00d581]6exception log_message {
[8ad5752]7        char * msg;
[d00d581]8};
[8ad5752]9
[ecfd758]10_EHM_DEFINE_COPY(log_message, )
11const char * msg(log_message * this) {
[8ad5752]12        return this->msg;
13}
[ecfd758]14_EHM_VIRTUAL_TABLE(log_message, , log_vt);
[8ad5752]15
16// Logging messages don't have to be handled.
17void defaultResumptionHandler(log_message &) {}
18
19// And should never be used to terminate computation.
20void defaultTerminationHandler(log_message &) = void;
21
22void log_test(void) {
23        // We can catch log:
24        try {
[ecfd758]25                throwResume (log_message){&log_vt, "Should be printed.\n"};
[8ad5752]26        } catchResume (log_message * this) {
[381132b]27                printf("%s", this->virtual_table->msg(this));
[8ad5752]28        }
29        // But we don't have to:
[ecfd758]30        throwResume (log_message){&log_vt, "Should not be printed.\n"};
[8ad5752]31}
32
33// I don't have a good use case for doing the same with termination.
[d00d581]34exception jump {};
[8ad5752]35void defaultTerminationHandler(jump &) {
36        printf("jump default handler.\n");
37}
38
[d00d581]39vtable(jump) jump_vt;
[ecfd758]40
[8ad5752]41void jump_test(void) {
42        try {
[ecfd758]43                throw (jump){&jump_vt};
[8ad5752]44        } catch (jump * this) {
45                printf("jump catch handler.\n");
46        }
[ecfd758]47        throw (jump){&jump_vt};
[8ad5752]48}
49
[d00d581]50exception first {};
51vtable(first) first_vt;
[ecfd758]52
[d00d581]53exception unhandled_exception {};
54vtable(unhandled_exception) unhandled_vt;
[8ad5752]55
56void unhandled_test(void) {
[fd54fef]57        forall(T &, V & | is_exception(T, V))
[8ad5752]58        void defaultTerminationHandler(T &) {
[ecfd758]59                throw (unhandled_exception){&unhandled_vt};
[8ad5752]60        }
61        void defaultTerminationHandler(unhandled_exception &) {
62                abort();
63        }
64        try {
[ecfd758]65                throw (first){&first_vt};
[8ad5752]66        } catch (unhandled_exception * t) {
67                printf("Catch unhandled_exception.\n");
68        }
69}
70
[d00d581]71exception second {};
72vtable(second) second_vt;
[381132b]73
74void cross_test(void) {
75        void defaultTerminationHandler(first &) {
76                printf("cross terminate default\n");
[ecfd758]77                throw (second){&second_vt};
[381132b]78        }
79        void defaultResumptionHandler(first &) {
80                printf("cross resume default\n");
[ecfd758]81                throwResume (second){&second_vt};
[381132b]82        }
83        try {
84                printf("cross terminate throw\n");
[ecfd758]85                throw (first){&first_vt};
[381132b]86        } catch (second *) {
87                printf("cross terminate catch\n");
88        }
89        try {
90                printf("cross resume throw\n");
[ecfd758]91                throwResume (first){&first_vt};
[381132b]92        } catchResume (second *) {
93                printf("cross resume catch\n");
94        }
95}
96
[8ad5752]97int main(int argc, char * argv[]) {
98        log_test();
99        jump_test();
100        unhandled_test();
[381132b]101        cross_test();
[8ad5752]102}
Note: See TracBrowser for help on using the repository browser.