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