d0c72a7b9ba1f1b0a537a0188f7d6c450f58fc9c
[fw/sdcc] / support / regression / tests / bug-716242.c
1 /* bug-716242.c
2
3    syntax tests about function pointers at compile time
4  */
5 #include <testfwk.h>
6
7 void *p;
8 int ret;
9
10 int mul2 (int i)
11 {
12   return 2 * i;
13 }
14
15 void g (int (*h) (int))
16 {
17   ret = h (2);
18 }
19
20 void f1()
21 {
22 #if defined(SDCC_ds390)
23   p = (void code *) mul2;
24 #else
25   p = (void *) mul2;
26 #endif
27   g ((int (*) (int)) p);
28 }
29
30 /****************************/
31
32 #ifndef SDCC_pic16
33 // Ifdefed out for PIC16 port since it generates the error:
34 // Duplicate label or redefinin g symbol that cannot be redefined. (_g)
35 // Submitted to the bug tracker:
36 // [ 1443651 ] pic 16: redefining symbol that cannot be redefined. (_g)
37
38 void g (int (*h) (int));
39 #endif
40
41 void f2()
42 {
43   int (*fp) (int) = p;
44
45   g (fp);
46 }
47
48 /****************************/
49
50 #ifndef SDCC_pic16
51 // Ifdefed out for PIC16 port since it generates the error:
52 // Duplicate label or redefinin g symbol that cannot be redefined. (_g)
53 // Submitted to the bug tracker:
54 // [ 1443651 ] pic 16: redefining symbol that cannot be redefined. (_g)
55
56 void g (int (*h) (int));
57 #endif
58
59 void f3()
60 {
61   int (*fp) (int) = (int (*) (int)) p;
62
63   g (fp);
64 }
65
66 /****************************/
67
68 void f4()
69 {
70   ((void (code *) (void)) p) ();
71 }
72
73 /****************************/
74
75 void f5()
76 {
77   int (*fp) (int) = mul2;
78
79   fp(1);
80 }
81
82 /****************************/
83
84 void f6()
85 {
86   ((void (code *) (void)) 0) ();
87 }
88
89 /****************************/
90
91 static void
92 testFuncPtr(void)
93 {
94   f1();
95   ASSERT(ret == 4);
96 }