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