summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-2349.c
blob: f4907b6325ee6f75854cff11d28b4f9ad88ab658 (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
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
/*
  bug-2349.c
*/

#include <testfwk.h>

#pragma disable_warning 85

long subchar(void *pa, void *pb)
{
  return *((char *) pa) - *((char *) pb);
}

long subint(void *pa, void *pb)
{
  return *((int *) pa) - *((int *) pb);
}

long sublong(void *pa, void *pb)
{
  return *((long *) pa) - *((long *) pb);
}

long addlong(void *pa, void *pb)
{
  return *((long *) pa) + *((long *) pb);
}

#define NULL ((void *) 0)

#if defined (__SDCC_MODEL_MEDIUM)
typedef long (*subfunc_t)(void *pa, void * __pdata pb);
#elif defined (__SDCC_MODEL_LARGE)
typedef long (*subfunc_t)(void *pa, void * __xdata pb);
#elif defined (__SDCC_MODEL_HUGE)
typedef long (*subfunc_t)(void *pa, void * __xdata pb);
#else
typedef long (*subfunc_t)(void *pa, void *pb);
#endif

subfunc_t dosub(subfunc_t f)
{
#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15)
  if (f == subchar)
    return subint;
  else if (f == subint)
    return sublong;
  else if (f == sublong)
    return subchar;
  else if (f == NULL)
    return addlong;
  else
    return NULL;
#endif
}

void testBug(void)
{
#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15)
  ASSERT (dosub(subchar) == subint);
  ASSERT (dosub(subint) == sublong);
  ASSERT (dosub(sublong) == subchar);
  ASSERT (dosub(addlong) == NULL);
  ASSERT (dosub(NULL) == addlong);
#endif
}