Changeset ecfd758 for tests/exceptions
- Timestamp:
- Apr 9, 2021, 2:11:43 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- b91bfde
- Parents:
- e07b589
- Location:
- tests/exceptions
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified tests/exceptions/.expect/resume-threads.txt ¶
re07b589 recfd758 6 6 7 7 catch-all 8 9 throwing child exception10 inner parent match11 8 12 9 caught yin as yin -
TabularUnified tests/exceptions/.expect/resume.txt ¶
re07b589 recfd758 6 6 7 7 catch-all 8 9 throwing child exception10 inner parent match11 8 12 9 caught yin as yin -
TabularUnified tests/exceptions/.expect/terminate-threads.txt ¶
re07b589 recfd758 5 5 6 6 catch-all 7 8 throwing child exception9 inner parent match10 7 11 8 caught yin as yin -
TabularUnified tests/exceptions/.expect/terminate.txt ¶
re07b589 recfd758 5 5 6 6 catch-all 7 8 throwing child exception9 inner parent match10 7 11 8 caught yin as yin -
TabularUnified tests/exceptions/cancel/coroutine.cfa ¶
re07b589 recfd758 4 4 #include <exception.hfa> 5 5 6 TRIVIAL_EXCEPTION(internal_error); 6 EHM_EXCEPTION(internal_error)(); 7 EHM_VIRTUAL_TABLE(internal_error, internal_vt); 7 8 8 9 coroutine WillCancel {}; … … 14 15 void main(WillCancel & wc) { 15 16 printf("1"); 16 cancel_stack((internal_error){ });17 cancel_stack((internal_error){&internal_vt}); 17 18 printf("!"); 18 19 } … … 24 25 resume(cancel); 25 26 printf("4"); 26 } catchResume ( CoroutineCancelled(WillCancel)* error) {27 } catchResume (SomeCoroutineCancelled * error) { 27 28 printf("2"); 28 29 if ((virtual internal_error *)error->the_exception) { -
TabularUnified tests/exceptions/cancel/thread.cfa ¶
re07b589 recfd758 4 4 #include <exception.hfa> 5 5 6 TRIVIAL_EXCEPTION(internal_error); 6 EHM_EXCEPTION(internal_error)(); 7 EHM_VIRTUAL_TABLE(internal_error, internal_vt); 7 8 8 9 thread WillCancel {}; … … 14 15 void main(WillCancel &) { 15 16 printf("1"); 16 cancel_stack((internal_error){ });17 cancel_stack((internal_error){&internal_vt}); 17 18 printf("!"); 18 19 } … … 25 26 join(cancel); 26 27 printf("4"); 27 } catchResume ( ThreadCancelled(WillCancel)* error) {28 } catchResume (SomeThreadCancelled * error) { 28 29 printf("2"); 29 30 if ((virtual internal_error *)error->the_exception) { … … 42 43 } 43 44 printf("4"); 44 } catchResume ( ThreadCancelled(WillCancel)* error) {45 } catchResume (SomeThreadCancelled * error) { 45 46 printf("2"); 46 47 if ((virtual internal_error *)error->the_exception) { -
TabularUnified tests/exceptions/conditional.cfa ¶
re07b589 recfd758 6 6 #include <exception.hfa> 7 7 8 VTABLE_DECLARATION(num_error)(9 int (*code)(num_error *this);8 EHM_EXCEPTION(num_error)( 9 int num; 10 10 ); 11 11 12 struct num_error { 13 VTABLE_FIELD(num_error); 14 char * msg; 15 int num; 16 }; 17 18 const char * num_error_msg(num_error * this) { 19 if ( ! this->msg ) { 20 static const char * base = "Num Error with code: X"; 21 this->msg = (char *)malloc(22); 22 for (int i = 0 ; (this->msg[i] = base[i]) ; ++i); 23 } 24 this->msg[21] = '0' + this->num; 25 return this->msg; 26 } 27 void ?{}(num_error & this, int num) { 28 VTABLE_INIT(this, num_error); 29 this.msg = 0; 30 this.num = num; 31 } 32 void ?{}(num_error & this, num_error & other) { 33 this.virtual_table = other.virtual_table; 34 this.msg = 0; 35 this.num = other.num; 36 } 37 void ^?{}(num_error & this) { 38 if( this.msg ) free( this.msg ); 39 } 40 int num_error_code( num_error * this ) { 41 return this->num; 42 } 43 44 VTABLE_INSTANCE(num_error)( 45 num_error_msg, 46 num_error_code, 47 ); 12 EHM_VIRTUAL_TABLE(num_error, num_error_vt); 48 13 49 14 void caught_num_error(int expect, num_error * actual) { … … 52 17 53 18 int main(int argc, char * argv[]) { 54 num_error exc = 2;19 num_error exc = {&num_error_vt, 2}; 55 20 56 21 try { 57 22 throw exc; 58 } catch (num_error * error ; 3 == error-> virtual_table->code( error )) {23 } catch (num_error * error ; 3 == error->num ) { 59 24 caught_num_error(3, error); 60 } catch (num_error * error ; 2 == error-> virtual_table->code( error )) {25 } catch (num_error * error ; 2 == error->num ) { 61 26 caught_num_error(2, error); 62 27 } … … 64 29 try { 65 30 throwResume exc; 66 } catchResume (num_error * error ; 3 == error-> virtual_table->code( error )) {31 } catchResume (num_error * error ; 3 == error->num ) { 67 32 caught_num_error(3, error); 68 } catchResume (num_error * error ; 2 == error-> virtual_table->code( error )) {33 } catchResume (num_error * error ; 2 == error->num ) { 69 34 caught_num_error(2, error); 70 35 } -
TabularUnified tests/exceptions/data-except.cfa ¶
re07b589 recfd758 3 3 #include <exception.hfa> 4 4 5 DATA_EXCEPTION(paired)(5 EHM_EXCEPTION(paired)( 6 6 int first; 7 7 int second; 8 8 ); 9 9 10 void ?{}(paired & this, int first, int second) { 11 VTABLE_INIT(this, paired); 12 this.first = first; 13 this.second = second; 14 } 10 EHM_VIRTUAL_TABLE(paired, paired_vt); 15 11 16 const char * paired_msg(paired * this) { 17 return "paired"; 18 } 19 20 VTABLE_INSTANCE(paired)(paired_msg); 21 22 void throwPaired(int first, int second) { 23 paired exc = {first, second}; 12 const char * virtual_msg(paired * this) { 13 return this->virtual_table->msg(this); 24 14 } 25 15 26 16 int main(int argc, char * argv[]) { 27 paired except = { 3, 13};17 paired except = {&paired_vt, 3, 13}; 28 18 29 19 try { 30 20 throw except; 31 21 } catch (paired * exc) { 32 printf("%s(%d, %d)\n", paired_msg(exc), exc->first, exc->second);22 printf("%s(%d, %d)\n", virtual_msg(exc), exc->first, exc->second); 33 23 ++exc->first; 34 24 } 35 25 36 printf("%s(%d, %d)\n", paired_msg(&except), except.first, except.second);26 printf("%s(%d, %d)\n", virtual_msg(&except), except.first, except.second); 37 27 38 28 try { 39 29 throwResume except; 40 30 } catchResume (paired * exc) { 41 printf("%s(%d, %d)\n", paired_msg(exc), exc->first, exc->second);31 printf("%s(%d, %d)\n", virtual_msg(exc), exc->first, exc->second); 42 32 ++exc->first; 43 33 } 44 34 45 printf("%s(%d, %d)\n", paired_msg(&except), except.first, except.second);35 printf("%s(%d, %d)\n", virtual_msg(&except), except.first, except.second); 46 36 } -
TabularUnified tests/exceptions/defaults.cfa ¶
re07b589 recfd758 4 4 #include <exception.hfa> 5 5 6 DATA_EXCEPTION(log_message)(6 EHM_EXCEPTION(log_message)( 7 7 char * msg; 8 8 ); 9 9 10 void ?{}(log_message & this, char * msg) { 11 VTABLE_INIT(this, log_message); 12 this.msg = msg; 13 } 14 15 const char * get_log_message(log_message * this) { 10 _EHM_DEFINE_COPY(log_message, ) 11 const char * msg(log_message * this) { 16 12 return this->msg; 17 13 } 18 19 VTABLE_INSTANCE(log_message)(get_log_message); 14 _EHM_VIRTUAL_TABLE(log_message, , log_vt); 20 15 21 16 // Logging messages don't have to be handled. … … 28 23 // We can catch log: 29 24 try { 30 throwResume (log_message){ "Should be printed.\n"};25 throwResume (log_message){&log_vt, "Should be printed.\n"}; 31 26 } catchResume (log_message * this) { 32 27 printf("%s", this->virtual_table->msg(this)); 33 28 } 34 29 // But we don't have to: 35 throwResume (log_message){ "Should not be printed.\n"};30 throwResume (log_message){&log_vt, "Should not be printed.\n"}; 36 31 } 37 32 38 33 // I don't have a good use case for doing the same with termination. 39 TRIVIAL_EXCEPTION(jump);34 EHM_EXCEPTION(jump)(); 40 35 void defaultTerminationHandler(jump &) { 41 36 printf("jump default handler.\n"); 42 37 } 43 38 39 EHM_VIRTUAL_TABLE(jump, jump_vt); 40 44 41 void jump_test(void) { 45 42 try { 46 throw (jump){ };43 throw (jump){&jump_vt}; 47 44 } catch (jump * this) { 48 45 printf("jump catch handler.\n"); 49 46 } 50 throw (jump){ };47 throw (jump){&jump_vt}; 51 48 } 52 49 53 TRIVIAL_EXCEPTION(first); 54 TRIVIAL_EXCEPTION(unhandled_exception); 50 EHM_EXCEPTION(first)(); 51 EHM_VIRTUAL_TABLE(first, first_vt); 52 53 EHM_EXCEPTION(unhandled_exception)(); 54 EHM_VIRTUAL_TABLE(unhandled_exception, unhandled_vt); 55 55 56 56 void unhandled_test(void) { 57 57 forall(T &, V & | is_exception(T, V)) 58 58 void defaultTerminationHandler(T &) { 59 throw (unhandled_exception){ };59 throw (unhandled_exception){&unhandled_vt}; 60 60 } 61 61 void defaultTerminationHandler(unhandled_exception &) { … … 63 63 } 64 64 try { 65 throw (first){ };65 throw (first){&first_vt}; 66 66 } catch (unhandled_exception * t) { 67 67 printf("Catch unhandled_exception.\n"); … … 69 69 } 70 70 71 TRIVIAL_EXCEPTION(second); 71 EHM_EXCEPTION(second)(); 72 EHM_VIRTUAL_TABLE(second, second_vt); 72 73 73 74 void cross_test(void) { 74 75 void defaultTerminationHandler(first &) { 75 76 printf("cross terminate default\n"); 76 throw (second){ };77 throw (second){&second_vt}; 77 78 } 78 79 void defaultResumptionHandler(first &) { 79 80 printf("cross resume default\n"); 80 throwResume (second){ };81 throwResume (second){&second_vt}; 81 82 } 82 83 try { 83 84 printf("cross terminate throw\n"); 84 throw (first){ };85 throw (first){&first_vt}; 85 86 } catch (second *) { 86 87 printf("cross terminate catch\n"); … … 88 89 try { 89 90 printf("cross resume throw\n"); 90 throwResume (first){ };91 throwResume (first){&first_vt}; 91 92 } catchResume (second *) { 92 93 printf("cross resume catch\n"); -
TabularUnified tests/exceptions/finally.cfa ¶
re07b589 recfd758 4 4 #include "except-io.hfa" 5 5 6 TRIVIAL_EXCEPTION(myth); 6 EHM_EXCEPTION(myth)(); 7 8 EHM_VIRTUAL_TABLE(myth, myth_vt); 7 9 8 10 int main(int argc, char * argv[]) { 9 myth exc ;11 myth exc = {&myth_vt}; 10 12 11 13 try { -
TabularUnified tests/exceptions/interact.cfa ¶
re07b589 recfd758 4 4 #include "except-io.hfa" 5 5 6 TRIVIAL_EXCEPTION(star); 7 TRIVIAL_EXCEPTION(moon); 6 EHM_EXCEPTION(star)(); 7 EHM_EXCEPTION(moon)(); 8 9 EHM_VIRTUAL_TABLE(star, star_vt); 10 EHM_VIRTUAL_TABLE(moon, moon_vt); 8 11 9 12 int main(int argc, char * argv[]) { 10 13 // Resume falls back to terminate. 11 14 try { 12 throwResume (star){ };15 throwResume (star){&star_vt}; 13 16 } catch (star *) { 14 17 printf("caught as termination\n"); … … 17 20 try { 18 21 loud_region a = "try block with resume throw"; 19 throwResume (star){ };22 throwResume (star){&star_vt}; 20 23 } catch (star *) { 21 24 printf("caught as termination\n"); … … 29 32 try { 30 33 try { 31 throw (star){ };34 throw (star){&star_vt}; 32 35 } catchResume (star *) { 33 36 printf("resume catch on terminate\n"); … … 43 46 try { 44 47 try { 45 throwResume (star){ };48 throwResume (star){&star_vt}; 46 49 } catch (star *) { 47 50 printf("terminate catch on resume\n"); … … 58 61 try { 59 62 try { 60 throw (star){ };63 throw (star){&star_vt}; 61 64 } catchResume (star *) { 62 65 printf("inner resume catch (error)\n"); … … 75 78 try { 76 79 try { 77 throwResume (star){ };80 throwResume (star){&star_vt}; 78 81 } catch (star *) { 79 82 printf("inner termination catch\n"); … … 94 97 try { 95 98 printf("throwing resume moon\n"); 96 throwResume (moon){ };99 throwResume (moon){&moon_vt}; 97 100 } catch (star *) { 98 101 printf("termination catch\n"); 99 102 } 100 103 printf("throwing resume star\n"); 101 throwResume (star){ };104 throwResume (star){&star_vt}; 102 105 } catchResume (star *) { 103 106 printf("resumption star catch\n"); … … 105 108 } catchResume (moon *) { 106 109 printf("resumption moon catch, will terminate\n"); 107 throw (star){ };110 throw (star){&star_vt}; 108 111 } 109 112 } catchResume (star *) { -
TabularUnified tests/exceptions/polymorphic.cfa ¶
re07b589 recfd758 3 3 #include <exception.hfa> 4 4 5 FORALL_TRIVIAL_EXCEPTION(proxy, (T), (T)); 6 FORALL_TRIVIAL_INSTANCE(proxy, (U), (U)) 5 EHM_FORALL_EXCEPTION(proxy, (T&), (T))(); 7 6 8 const char * msg(proxy(int) * this) { return "proxy(int)"; } 9 const char * msg(proxy(char) * this) { return "proxy(char)"; } 10 POLY_VTABLE_INSTANCE(proxy, int)(msg); 11 POLY_VTABLE_INSTANCE(proxy, char)(msg); 7 EHM_FORALL_VIRTUAL_TABLE(proxy, (int), proxy_int); 8 EHM_FORALL_VIRTUAL_TABLE(proxy, (char), proxy_char); 12 9 13 10 void proxy_test(void) { 11 proxy(int) an_int = {&proxy_int}; 12 proxy(char) a_char = {&proxy_char}; 13 14 14 try { 15 throw (proxy(int)){};15 throw an_int; 16 16 } catch (proxy(int) *) { 17 17 printf("terminate catch\n"); … … 19 19 20 20 try { 21 throwResume (proxy(char)){};21 throwResume a_char; 22 22 } catchResume (proxy(char) *) { 23 23 printf("resume catch\n"); … … 25 25 26 26 try { 27 throw (proxy(char)){};27 throw a_char; 28 28 } catch (proxy(int) *) { 29 29 printf("caught proxy(int)\n"); … … 33 33 } 34 34 35 FORALL_DATA_EXCEPTION(cell, (T), (T))(35 EHM_FORALL_EXCEPTION(cell, (T), (T))( 36 36 T data; 37 37 ); 38 38 39 FORALL_DATA_INSTANCE(cell, (T), (T)) 40 41 const char * msg(cell(int) * this) { return "cell(int)"; } 42 const char * msg(cell(char) * this) { return "cell(char)"; } 43 const char * msg(cell(bool) * this) { return "cell(bool)"; } 44 POLY_VTABLE_INSTANCE(cell, int)(msg); 45 POLY_VTABLE_INSTANCE(cell, char)(msg); 46 POLY_VTABLE_INSTANCE(cell, bool)(msg); 39 EHM_FORALL_VIRTUAL_TABLE(cell, (int), int_cell); 40 EHM_FORALL_VIRTUAL_TABLE(cell, (char), char_cell); 41 EHM_FORALL_VIRTUAL_TABLE(cell, (bool), bool_cell); 47 42 48 43 void cell_test(void) { 49 44 try { 50 cell(int) except; 51 except.data = -7; 45 cell(int) except = {&int_cell, -7}; 52 46 throw except; 53 47 } catch (cell(int) * error) { … … 56 50 57 51 try { 58 cell(bool) ball; 59 ball.data = false; 52 cell(bool) ball = {&bool_cell, false}; 60 53 throwResume ball; 61 54 printf("%i\n", ball.data); -
TabularUnified tests/exceptions/resume.cfa ¶
re07b589 recfd758 4 4 #include "except-io.hfa" 5 5 6 TRIVIAL_EXCEPTION(yin); 7 TRIVIAL_EXCEPTION(yang); 8 TRIVIAL_EXCEPTION(zen); 9 TRIVIAL_EXCEPTION(moment_of, zen); 6 EHM_EXCEPTION(yin)(); 7 EHM_EXCEPTION(yang)(); 8 EHM_EXCEPTION(zen)(); 9 10 EHM_VIRTUAL_TABLE(yin, yin_vt); 11 EHM_VIRTUAL_TABLE(yang, yang_vt); 12 EHM_VIRTUAL_TABLE(zen, zen_vt); 10 13 11 14 void in_void(void); 12 15 13 16 int main(int argc, char * argv[]) { 17 yin a_yin = {&yin_vt}; 18 yang a_yang = {&yang_vt}; 19 zen a_zen = {&zen_vt}; 20 14 21 // The simple throw catchResume test. 15 22 try { 16 23 loud_exit a = "simple try clause"; 17 24 printf("simple throw\n"); 18 throwResume (zen){};25 throwResume a_zen; 19 26 printf("end of try clause\n"); 20 27 } catchResume (zen * error) { … … 26 33 // Throw catch-all test. 27 34 try { 28 throwResume (zen){};35 throwResume a_zen; 29 36 } catchResume (exception_t * error) { 30 37 printf("catch-all\n"); 31 }32 printf("\n");33 34 // Catch a parent of the given exception.35 try {36 printf("throwing child exception\n");37 throwResume (moment_of){};38 } catchResume (zen *) {39 printf("inner parent match\n");40 } catchResume (moment_of *) {41 printf("outer exact match\n");42 38 } 43 39 printf("\n"); … … 46 42 try { 47 43 try { 48 throwResume (yin){};44 throwResume a_yin; 49 45 } catchResume (zen *) { 50 46 printf("caught yin as zen\n"); … … 62 58 loud_exit a = "rethrow inner try"; 63 59 printf("rethrow inner try\n"); 64 throwResume (zen){};60 throwResume a_zen; 65 61 } catchResume (zen *) { 66 62 loud_exit a = "rethrowing catch clause"; … … 77 73 try { 78 74 try { 79 throwResume (yin){};75 throwResume a_yin; 80 76 } catchResume (yin *) { 81 77 printf("caught yin, will throw yang\n"); 82 throwResume (yang){};78 throwResume a_yang; 83 79 } catchResume (yang *) { 84 80 printf("caught exception from same try\n"); … … 93 89 try { 94 90 printf("throwing first exception\n"); 95 throwResume (yin){};91 throwResume a_yin; 96 92 } catchResume (yin *) { 97 93 printf("caught first exception\n"); 98 94 try { 99 95 printf("throwing second exception\n"); 100 throwResume (yang){};96 throwResume a_yang; 101 97 } catchResume (yang *) { 102 98 printf("caught second exception\n"); … … 114 110 try { 115 111 try { 116 throwResume (zen){};117 throwResume (zen){};112 throwResume a_zen; 113 throwResume a_zen; 118 114 } catchResume (zen *) { 119 115 printf("inner catch\n"); 120 116 } 121 throwResume (zen){};117 throwResume a_zen; 122 118 } catchResume (zen *) { 123 119 printf("outer catch\n"); … … 130 126 // Do a throw and rethrow in a void function. 131 127 void in_void(void) { 128 zen a_zen = {&zen_vt}; 132 129 try { 133 130 try { 134 131 printf("throw\n"); 135 throwResume (zen){};132 throwResume a_zen; 136 133 } catchResume (zen *) { 137 134 printf("rethrow\n"); -
TabularUnified tests/exceptions/terminate.cfa ¶
re07b589 recfd758 4 4 #include "except-io.hfa" 5 5 6 TRIVIAL_EXCEPTION(yin); 7 TRIVIAL_EXCEPTION(yang); 8 TRIVIAL_EXCEPTION(zen); 9 TRIVIAL_EXCEPTION(moment_of, zen); 6 EHM_EXCEPTION(yin)(); 7 EHM_EXCEPTION(yang)(); 8 EHM_EXCEPTION(zen)(); 9 10 EHM_VIRTUAL_TABLE(yin, yin_vt); 11 EHM_VIRTUAL_TABLE(yang, yang_vt); 12 EHM_VIRTUAL_TABLE(zen, zen_vt); 10 13 11 14 void in_void(void); 12 15 13 16 int main(int argc, char * argv[]) { 17 yin a_yin = {&yin_vt}; 18 yang a_yang = {&yang_vt}; 19 zen a_zen = {&zen_vt}; 20 14 21 // The simple throw catch test. 15 22 try { 16 23 loud_exit a = "simple try clause"; 17 24 printf("simple throw\n"); 18 throw (zen){};25 throw a_zen; 19 26 printf("end of try clause\n"); 20 27 } catch (zen * error) { … … 26 33 // Throw catch-all test. 27 34 try { 28 throw (zen){};35 throw a_zen; 29 36 } catch (exception_t * error) { 30 37 printf("catch-all\n"); 31 }32 printf("\n");33 34 // Catch a parent of the given exception.35 try {36 printf("throwing child exception\n");37 throw (moment_of){};38 } catch (zen *) {39 printf("inner parent match\n");40 } catch (moment_of *) {41 printf("outer exact match\n");42 38 } 43 39 printf("\n"); … … 46 42 try { 47 43 try { 48 throw (yin){};44 throw a_yin; 49 45 } catch (zen *) { 50 46 printf("caught yin as zen\n"); … … 62 58 loud_exit a = "rethrow inner try"; 63 59 printf("rethrow inner try\n"); 64 throw (zen){};60 throw a_zen; 65 61 } catch (zen *) { 66 62 loud_exit a = "rethrowing catch clause"; … … 77 73 try { 78 74 try { 79 throw (yin){};75 throw a_yin; 80 76 } catch (yin *) { 81 77 printf("caught yin, will throw yang\n"); 82 throw (yang){};78 throw a_yang; 83 79 } catch (yang *) { 84 80 printf("caught exception from same try\n"); … … 93 89 try { 94 90 printf("throwing first exception\n"); 95 throw (yin){};91 throw a_yin; 96 92 } catch (yin *) { 97 93 printf("caught first exception\n"); 98 94 try { 99 95 printf("throwing second exception\n"); 100 throw (yang){};96 throw a_yang; 101 97 } catch (yang *) { 102 98 printf("caught second exception\n"); … … 114 110 try { 115 111 try { 116 throw (zen){};117 throw (zen){};112 throw a_zen; 113 throw a_zen; 118 114 } catch (zen *) { 119 115 printf("inner catch\n"); 120 116 } 121 throw (zen){};117 throw a_zen; 122 118 } catch (zen *) { 123 119 printf("outer catch\n"); … … 130 126 // Do a throw and rethrow in a void function. 131 127 void in_void(void) { 128 zen a_zen = {&zen_vt}; 132 129 try { 133 130 try { 134 131 printf("throw\n"); 135 throw (zen){};132 throw a_zen; 136 133 } catch (zen *) { 137 134 printf("rethrow\n"); -
TabularUnified tests/exceptions/trash.cfa ¶
re07b589 recfd758 3 3 #include <exception.hfa> 4 4 5 TRIVIAL_EXCEPTION(yin); 6 TRIVIAL_EXCEPTION(yang); 5 EHM_EXCEPTION(yin)(); 6 EHM_EXCEPTION(yang)(); 7 8 EHM_VIRTUAL_TABLE(yin, yin_vt); 9 EHM_VIRTUAL_TABLE(yang, yang_vt); 7 10 8 11 int main(int argc, char * argv[]) { 9 12 try { 10 13 try { 11 throw (yin){ };14 throw (yin){&yin_vt}; 12 15 } finally { 13 16 try { 14 throw (yang){ };17 throw (yang){&yang_vt}; 15 18 } catch (yin *) { 16 19 printf("inner yin\n"); -
TabularUnified tests/exceptions/type-check.cfa ¶
re07b589 recfd758 3 3 #include <exception.hfa> 4 4 5 TRIVIAL_EXCEPTION(truth);5 EHM_EXCEPTION(truth)(); 6 6 7 7 int main(int argc, char * argv[]) { -
TabularUnified tests/exceptions/virtual-cast.cfa ¶
re07b589 recfd758 12 12 #include <assert.h> 13 13 14 15 16 // Hand defined alpha virtual type: 17 struct __cfatid_struct_alpha { 18 __cfa__parent_vtable const * parent; 19 }; 20 21 __attribute__(( section(".gnu.linkonce.__cfatid_alpha") )) 22 struct __cfatid_struct_alpha __cfatid_alpha = { 23 (__cfa__parent_vtable *)0, 24 }; 25 14 26 struct alpha_vtable { 15 alpha_vtable const * const parent;27 struct __cfatid_struct_alpha const * const __cfavir_typeid; 16 28 char (*code)(void); 17 29 }; … … 27 39 28 40 41 // Hand defined beta virtual type: 42 struct __cfatid_struct_beta { 43 __cfatid_struct_alpha const * parent; 44 }; 45 46 __attribute__(( section(".gnu.linkonce.__cfatid_beta") )) 47 struct __cfatid_struct_beta __cfatid_beta = { 48 &__cfatid_alpha, 49 }; 50 29 51 struct beta_vtable { 30 alpha_vtable const * const parent;52 struct __cfatid_struct_beta const * const __cfavir_typeid; 31 53 char (*code)(void); 32 54 }; … … 42 64 43 65 66 // Hand defined gamma virtual type: 67 struct __cfatid_struct_gamma { 68 __cfatid_struct_beta const * parent; 69 }; 70 71 __attribute__(( section(".gnu.linkonce.__cfatid_gamma") )) 72 struct __cfatid_struct_gamma __cfatid_gamma = { 73 &__cfatid_beta, 74 }; 75 44 76 struct gamma_vtable { 45 beta_vtable const * const parent;77 struct __cfatid_struct_gamma const * const __cfavir_typeid; 46 78 char (*code)(void); 47 79 }; … … 57 89 58 90 extern "C" { 59 alpha_vtable _alpha_vtable_instance = { 0, ret_a };60 beta_vtable _beta_vtable_instance = { &_ alpha_vtable_instance, ret_b };61 gamma_vtable _gamma_vtable_instance = { &_ beta_vtable_instance, ret_g };91 alpha_vtable _alpha_vtable_instance = { &__cfatid_alpha, ret_a }; 92 beta_vtable _beta_vtable_instance = { &__cfatid_beta, ret_b }; 93 gamma_vtable _gamma_vtable_instance = { &__cfatid_gamma, ret_g }; 62 94 } 63 95 -
TabularUnified tests/exceptions/virtual-poly.cfa ¶
re07b589 recfd758 8 8 #include <assert.h> 9 9 10 11 struct __cfatid_struct_mono_base { 12 __cfa__parent_vtable const * parent; 13 }; 14 15 __attribute__(( section(".gnu.linkonce.__cfatid_mono_base") )) 16 struct __cfatid_struct_mono_base __cfatid_mono_base = { 17 (__cfa__parent_vtable *)0, 18 }; 19 10 20 struct mono_base_vtable { 11 mono_base_vtable const * const parent;21 __cfatid_struct_mono_base const * const __cfavir_typeid; 12 22 }; 13 23 … … 17 27 18 28 forall(T) 29 struct __cfatid_struct_mono_child { 30 __cfatid_struct_mono_base const * parent; 31 }; 32 33 forall(T) 19 34 struct mono_child_vtable { 20 mono_base_vtable const * const parent;35 __cfatid_struct_mono_child(T) const * const __cfavir_typeid; 21 36 }; 22 37 … … 26 41 }; 27 42 28 mono_base_vtable _mono_base_vtable_instance @= { 0 }; 43 __cfatid_struct_mono_child(int) __cfatid_mono_child @= { 44 &__cfatid_mono_base, 45 }; 46 29 47 mono_child_vtable(int) _mono_child_vtable_instance @= { 30 &_ mono_base_vtable_instance48 &__cfatid_mono_child, 31 49 }; 32 50 … … 37 55 } 38 56 57 58 forall(U) 59 struct __cfatid_struct_poly_base { 60 __cfa__parent_vtable const * parent; 61 }; 62 39 63 forall(U) 40 64 struct poly_base_vtable { 41 poly_base_vtable(U) const * const parent;65 __cfatid_struct_poly_base(U) const * const __cfavir_typeid; 42 66 }; 43 67 … … 48 72 49 73 forall(V) 74 struct __cfatid_struct_poly_child { 75 __cfatid_struct_poly_base(V) const * parent; 76 }; 77 78 forall(V) 50 79 struct poly_child_vtable { 51 poly_base_vtable(V) const * const parent;80 __cfatid_struct_poly_child(V) const * const __cfavir_typeid; 52 81 }; 53 82 … … 57 86 }; 58 87 59 poly_base_vtable(int) _poly_base_vtable_instance @= { 0 }; 88 __cfatid_struct_poly_base(int) __cfatid_poly_base @= { 89 (__cfa__parent_vtable *)0, 90 }; 91 __cfatid_struct_poly_child(int) __cfatid_poly_child = { 92 &__cfatid_poly_base, 93 }; 60 94 poly_child_vtable(int) _poly_child_vtable_instance @= { 61 &_ poly_base_vtable_instance95 &__cfatid_poly_child, 62 96 }; 63 /* Resolver bug keeps me from adding these.64 poly_base_vtable(char) _poly_base_vtable_instance @= { 0 };65 poly_child_vtable(char) _poly_child_vtable_instance @= {66 &_poly_base_vtable_instance67 };68 */69 97 70 98 void poly_poly_test() { … … 77 105 mono_poly_test(); 78 106 poly_poly_test(); 79 printf( "done\n" ); // non-empty .expect file107 printf( "done\n" ); 80 108 }
Note: See TracChangeset
for help on using the changeset viewer.