summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug2084206.c
blob: 20622d431f853f5c8d256a536c45b698557d52e1 (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
/*
    bug 2084206
*/

#include <stdarg.h>
#include <testfwk.h>

typedef struct {
	void (*f) (void);
	char c;
	char* p;
} data_t;

typedef void* voidp_t;
typedef void (*funp_t)(void);

volatile data_t mydata;

long varargs(char i, ...)
{
	va_list arg;
	long ret = -1;

	va_start (arg, i);
	switch (i)
	{
		case 1: ret = (long)va_arg(arg, voidp_t); break;
		case 2: ret = (long)va_arg(arg, funp_t);  break;
	}
	va_end (arg);
	return ret;
}

void testBug(void)
{
#ifndef __SDCC_pdk14 // Lack of memory - see RFE # 613.
#ifndef __SDCC_pdk15 // TODO: Decide on support for casts between object and function pointers for pdk!
#ifndef __SDCC_pic16
	void* ptr = testBug;
	mydata.f = testBug;
	ASSERT (varargs(1, mydata.f) == (long)ptr);
	ASSERT (varargs(1, mydata.f) == (long)(void*)testBug);
	ASSERT (varargs(2, (funp_t)mydata.f) == (long)mydata.f);
	ASSERT (varargs(2, (void (*)(void))mydata.f) == (long)mydata.f);
#endif
#endif
#endif
}