summaryrefslogtreecommitdiff
path: root/src/regression/ptrfunc.c
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();
}