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