1 #include "gpsim_assert.h" 2 3 unsigned char failures=0; 4 5 unsigned int uint0 = 0; 6 unsigned int uint1 = 0; 7 8 /* 9 * BUG: if these aren't volatile, an overzealous optimizer or somthing 10 * wreaks havoc with the simple tests like "if(uchar != 3)failures++" 11 */ 12 volatile unsigned char uchar0 = 0; 13 volatile unsigned char uchar1 = 0; 14 volatile unsigned char uchar2 = 0; 15 16 void (*pfunc)(); 17 void (*p1func)(); 18 unsigned char (*pcfunc)(); 19 20 void done()21done() 22 { 23 ASSERT(MANGLE(failures) == 0); 24 PASSED(); 25 } 26 call0(void)27void call0(void) 28 { 29 uchar0++; 30 } 31 call1(void)32void call1(void) 33 { 34 uchar1++; 35 } 36 call2(void)37unsigned char call2(void) 38 { 39 return uchar0 + 9; 40 } 41 docall0(void)42void docall0(void) 43 { 44 pfunc = call0; 45 (pfunc)(); 46 if(uchar0 != 1) 47 failures++; 48 } 49 docall1()50void docall1() 51 { 52 unsigned char i; 53 for(i = 0; i < 3; i++) { 54 (*p1func)(); 55 } 56 } 57 docall2(void (* pf)())58void docall2( void(*pf)() ) 59 { 60 unsigned char i; 61 for(i = 0; i < 2; i++) { 62 pf(); 63 } 64 } 65 main(void)66void main(void) 67 { 68 docall0(); 69 70 71 p1func = call1; 72 docall1(); 73 if(uchar1 != 3) 74 failures++; 75 if(uchar0 != 1) 76 failures++; 77 78 p1func = call0; 79 docall1(); 80 if(uchar1 != 3) 81 failures++; 82 if(uchar0 != 4) 83 failures++; 84 85 docall2(call0); 86 if(uchar1 != 3) 87 failures++; 88 if(uchar0 != 6) 89 failures++; 90 91 docall2(call1); 92 if(uchar1 != 5) 93 failures++; 94 if(uchar0 != 6) 95 failures++; 96 97 pcfunc = call2; 98 uchar2 = (*pcfunc)(); 99 if(uchar2 != 15) 100 failures++; 101 /**/ 102 /* uchar2 += (pcfunc)(); */ /* FRONT-END BUG? - type-mismatch error */ 103 /* uchar2 += pcfunc(); */ /* FRONT-END BUG? - type-mismatch error */ 104 105 done(); 106 } 107