summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-3260.c
blob: 5e5b9f6f35544b320c6e97259fb8fca84310b5ea (plain)
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
#include <testfwk.h>

/* Bug #3260 caused typecast function pointers to pass all */
/* parameters via the stack and not pass any parameter via  */
/* register, even when some should have been passed via    */
/* register. */

/* Look for __SDCC_STACK_AUTO to make sure the port is     */
/* parameters in registers and/or stack and not statically */
#if defined(__SDCC_STACK_AUTO) || defined(PORT_HOST)
int (*p)(int, int) __reentrant;

void (*q)(void) __reentrant;

int f(void)
{
    return (*p)(23, 42);
}

int g(void)
{
    return (*(((int (*)(int, int))q)))(23, 42);
}

int c(int a, int b) __reentrant
{
    return a - b;
}
#endif

void
testBug(void)
{
#if defined(__SDCC_STACK_AUTO) || defined(PORT_HOST)
    p = &c;
    q = (void (*)(void))(&c);
    ASSERT (f() == 23 - 42);
    ASSERT (g() == 23 - 42);
#endif
}