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()21 done()
22 {
23   ASSERT(MANGLE(failures) == 0);
24   PASSED();
25 }
26 
call0(void)27 void call0(void)
28 {
29 	uchar0++;
30 }
31 
call1(void)32 void call1(void)
33 {
34 	uchar1++;
35 }
36 
call2(void)37 unsigned char call2(void)
38 {
39 	return uchar0 + 9;
40 }
41 
docall0(void)42 void docall0(void)
43 {
44 	pfunc = call0;
45 	(pfunc)();
46 	if(uchar0 != 1)
47 		failures++;
48 }
49 
docall1()50 void docall1()
51 {
52 	unsigned char i;
53 	for(i = 0; i < 3; i++) {
54 		(*p1func)();
55 	}
56 }
57 
docall2(void (* pf)())58 void docall2( void(*pf)() )
59 {
60 	unsigned char i;
61 	for(i = 0; i < 2; i++) {
62 		pf();
63 	}
64 }
65 
main(void)66 void 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