• R/O
  • SSH

GCC: Commit

Continuation based C on GCC


Commit MetaInfo

Revision6958b92652fe4752420fd6ccde35482be52f785b (tree)
Zeit2012-11-17 14:01:39
AutorShinji KONO <kono@ie.u...>
CommiterShinji KONO

Log Message

rectype

Ändern Zusammenfassung

Diff

diff -r 85b994e68631 -r 6958b92652fe CbC-examples/arg.c
--- a/CbC-examples/arg.c Sat Sep 24 03:01:41 2011 +0900
+++ b/CbC-examples/arg.c Sat Nov 17 14:01:39 2012 +0900
@@ -13,13 +13,13 @@
1313 void *exit_env;
1414 __code (*exit___code)();
1515
16-__code carg1(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(),void *env)
16+__code carg1(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env)
1717 {
1818 printf("#0017:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env);
1919 goto carg2(arg1,arg2,arg3,arg4,arg0,exit1,env);
2020 }
2121
22-__code carg2(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(),void *env)
22+__code carg2(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env)
2323 {
2424 struct arg args0;
2525 printf("#0024:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env );
@@ -31,7 +31,7 @@
3131 goto cargs(args0,exit1,env);
3232 }
3333
34-__code cargs(struct arg args0,__code exit1(),void *env)
34+__code cargs(struct arg args0,__code exit1(int, void*),void *env)
3535 {
3636 printf("#0035:args: %d %d %d %d %d : %x %x\n",
3737 args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/conv1/benchmark.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/conv1/benchmark.sh Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,39 @@
1+#!/usr/bin/env zsh
2+
3+time=/usr/bin/time
4+CONV1=./a.out
5+num=10
6+
7+count=0
8+amount=0
9+max=0
10+min=99999
11+
12+echo "$CONV1 $1"
13+while [[ $count -lt $num ]]; do
14+ # /usr/bin/time -p ./conv1 1 2>&1 >& - |grep '^user'|tr -s " "|cut -f2 -d" "
15+ usertime=$( $time -p $CONV1 $1 2>&1 >& - |grep '^user'|tr -s " " |cut -f2 -d" ")
16+ echo $usertime
17+
18+ amount=$(($usertime+$amount))
19+ if [[ $usertime -lt $min ]]; then
20+ min=$usertime
21+ fi
22+ if [[ $usertime -gt $max ]]; then
23+ max=$usertime
24+ fi
25+ count=$(($count+1))
26+done
27+
28+echo "amount time = $amount"
29+echo "maxtime = $max"
30+echo "mintime = $min"
31+
32+
33+amount=$(($amount - $max - $min))
34+echo "amount time - mintime - maxtime = $amount"
35+count=$(($count-2))
36+echo "count = $count"
37+averagetime=$(($amount/($count)))
38+echo "average time = $averagetime"
39+
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/conv1/conv1.c
--- a/CbC-examples/conv1/conv1.c Sat Sep 24 03:01:41 2011 +0900
+++ b/CbC-examples/conv1/conv1.c Sat Nov 17 14:01:39 2012 +0900
@@ -11,7 +11,6 @@
1111 #include "conv1.h"
1212
1313 /* classical function call case (0) */
14-
1514 f0(int i) {
1615 int k,j;
1716 k = 3+i;
@@ -43,7 +42,7 @@
4342 }
4443
4544 struct f_g0_interface { // Specialized Return Continuation
46- __code (*ret)();
45+ __code (*ret)(int,stack);
4746 int i_,k_,j_;
4847 };
4948
@@ -191,7 +190,7 @@
191190
192191 if (sw==0) {
193192 for(loop=0;loop<LOOP_COUNT;loop++) {
194- j = f0(233);
193+ j = f0(loop);
195194 }
196195 printf("#0193:%d\n",j);
197196 #if !CC_ONLY
@@ -202,7 +201,7 @@
202201 cont->ret = main_return;
203202 cont->main_ret = _CbC_return;
204203 cont->env = _CbC_environment;
205- goto f(233,sp);
204+ goto f(loop,sp);
206205 } else if (sw==2) {
207206 loop = LOOP_COUNT;
208207 sp -= sizeof(*cont);
@@ -210,7 +209,7 @@
210209 cont->ret = main_return2;
211210 cont->main_ret = _CbC_return;
212211 cont->env = _CbC_environment;
213- goto f2(233,sp);
212+ goto f2(loop,sp);
214213 } else if (sw==3) {
215214 loop = LOOP_COUNT;
216215 sp -= sizeof(*cont);
@@ -218,7 +217,7 @@
218217 cont->ret = main_return2_1;
219218 cont->main_ret = _CbC_return;
220219 cont->env = _CbC_environment;
221- goto f2_1(233,sp);
220+ goto f2_1(loop,sp);
222221 #endif
223222 }
224223 return 0;
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/fact-rectype.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/fact-rectype.c Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,32 @@
1+#include <stdio.h>
2+#define __environment _CbC_environment
3+#define __return _CbC_return
4+
5+__code factorial(int n, int result, __rectype *print, __rectype *exit1, void *envp)
6+{
7+ if(n<0) {
8+ print("#0008:err %dn",n);
9+ goto (*exit1)(0, envp);
10+ }
11+ if (n==0)
12+ goto (*print)(n,result,print,exit1, envp);
13+ else {
14+ result *= n;
15+ n--;
16+ goto factorial(n, result, print,exit1, envp);
17+ }
18+}
19+
20+__code print(int n, int result, __rectype *print ,__rectype *exit1 ,void *envp);
21+
22+int main(int argc, char *argv[]) {
23+ int n;
24+ n = 10;
25+ goto factorial(n,1,print,__return,__environment);
26+}
27+
28+
29+__code print(int n, int result, __rectype *print ,__rectype *exit1,void *envp){
30+ printf("#0032:%d = %d\n", n, result);
31+ goto (*exit1)(0,envp);
32+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/quicksort/benchmark.sh
--- a/CbC-examples/quicksort/benchmark.sh Sat Sep 24 03:01:41 2011 +0900
+++ b/CbC-examples/quicksort/benchmark.sh Sat Nov 17 14:01:39 2012 +0900
@@ -14,6 +14,7 @@
1414
1515 echo "size of array = $size"
1616 while [[ $count -lt $num ]]; do
17+ echo "$time -p $QS -n $size -s $seed 2>&1 >& - |grep '^user'|tr -s \" \"|cut -f2 -d\" \" "
1718 usertime=$( $time -p $QS -n $size -s $seed 2>&1 >& - |grep '^user'|tr -s " "|cut -f2 -d" ")
1819 #usertime=$(printf "%d" $usertime)
1920 echo $usertime
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectype/rectype.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectype/rectype.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,22 @@
1+#include <stdio.h>
2+#include <stdlib.h>
3+__code print(__rectype *p)
4+{
5+ printf("print\n");
6+ exit(0);
7+}
8+__code csA(__rectype *p)
9+{
10+ goto p(csA);
11+}
12+
13+void main1()
14+{
15+ goto csA(print);
16+}
17+
18+int main()
19+{
20+ main1();
21+ return 0;
22+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectype/struct.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectype/struct.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,30 @@
1+#include <stdio.h>
2+#include <stdlib.h>
3+struct interface {
4+ __code (*next)(struct interface);
5+};
6+
7+__code print(struct interface p)
8+{
9+ printf("print\n");
10+ exit(0);
11+}
12+__code csA(struct interface p)
13+{
14+ struct interface ds;
15+ ds.next = csA;
16+ goto p.next(ds);
17+}
18+
19+void main1()
20+{
21+ struct interface ds;
22+ ds.next = print;
23+ goto csA(ds);
24+}
25+
26+int main()
27+{
28+ main1();
29+ return 0;
30+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/Makefile Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,39 @@
1+# Makefile
2+CbCC = ../../../build-CbC-devel/INSTALL_DIR/bin/cbc-gcc-4.6.0
3+
4+CFLAGS = -g -O0 -Wall
5+
6+
7+.SUFFIXES: .cbc .o
8+
9+all: rectypeTest1 typedef struct instruct inparm
10+
11+.cbc.o:
12+ $(CbCC) $(CFLAGS) -c -o $@ $<
13+
14+rectypeTest1.o: rectypeTest1.cbc
15+typedef.o: typedef.cbc
16+struct.o: struct.cbc
17+instruct.o: instruct.cbc
18+inparm.o: inparm.cbc
19+
20+
21+rectypeTest1: rectypeTest1.o
22+ $(CbCC) $(CFLAGS) -o $@ $^
23+
24+typedef: typedef.o
25+ $(CbCC) $(CFLAGS) -o $@ $^
26+
27+struct: struct.o
28+ $(CbCC) $(CFLAGS) -o $@ $^
29+
30+instruct: instruct.o
31+ $(CbCC) $(CFLAGS) -o $@ $^
32+
33+inparm: inparm.o
34+ $(CbCC) $(CFLAGS) -o $@ $^
35+
36+clean:
37+ rm -rf *.o *.s typedef rectypeTest1 struct instruct inparm
38+
39+
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/inparm.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/inparm.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,20 @@
1+#include <stdio.h>
2+#include <stdlib.h>
3+
4+__code print(__rectype *p) {
5+ puts("inparm: hello");
6+ exit(0);
7+}
8+
9+__code csA(__code (*p)(__rectype*)) {
10+ goto p(csA);
11+}
12+
13+void main1() {
14+ goto csA(print);
15+}
16+
17+int main() {
18+ main1();
19+ return 0;
20+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/instruct.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/instruct.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,28 @@
1+#include <stdlib.h>
2+
3+// miss
4+struct interface {
5+ __rectype *next;
6+};
7+
8+__code print(struct interface p) {
9+ puts("print");
10+ exit(0);
11+}
12+
13+__code csA(struct interface p) {
14+ struct interface ds;
15+ ds.next = csA;
16+ goto p.next(ds);
17+}
18+
19+void main1() {
20+ struct interface ds;
21+ ds.next = print;
22+ goto csA(ds);
23+}
24+
25+int main() {
26+ main1();
27+ return 0;
28+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/rectypeTest1.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/rectypeTest1.c Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,22 @@
1+#include <stdio.h>
2+__code print(__rectype *p, int num) {
3+ printf("num = %d\n",num);
4+}
5+
6+__code csA(__rectype *p, int num) {
7+ goto p(csA,3,4);
8+ goto p(2,3);
9+ goto p(csA,3);
10+ return;
11+}
12+
13+void funcA(__code (*p)()){
14+ goto p(print, 3);
15+ return;
16+}
17+
18+int main() {
19+ funcA(csA);
20+
21+ return 0;
22+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/rectypeTest1.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/rectypeTest1.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,24 @@
1+#include <stdio.h>
2+#include <stdlib.h>
3+
4+__code print(__rectype *p, int num) {
5+ printf("num = %d\n",num);
6+ exit(0);
7+}
8+
9+//__code csA(__rectype *p, int num) {
10+__code csA(__code (*p)(void*,int), int num) {// goto p(csA,3,4); // error: too many arguments
11+ goto p(2,3); // error : internal compiler error
12+// goto p(csA,3);
13+ return;
14+}
15+
16+void funcA(__code (*p)()){
17+ goto p(print, 3);
18+ return;
19+}
20+
21+int main() {
22+ funcA(csA);
23+ return 0;
24+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/segmentfault.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/segmentfault.c Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,13 @@
1+#include <stdio.h>
2+
3+void func( void (*p)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)(void(*)()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) {
4+ p(3);
5+}
6+
7+
8+
9+
10+int main() {
11+
12+ return 0;
13+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/struct.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/struct.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,33 @@
1+struct aaa {
2+ __rectype *child;
3+};
4+__code test() {
5+ struct aaa b;
6+}
7+
8+struct interface {
9+ __code (*next)(struct interface);
10+};
11+
12+
13+#include <stdio.h>
14+#include <stdlib.h>
15+__code csB() {
16+ exit(0);
17+}
18+__code print(struct interface p) {
19+ puts("hello");
20+ exit(0);
21+}
22+
23+__code csA(struct interface p) {
24+ struct interface ds = { csB };
25+ goto p.next(ds);
26+// goto p.next(3); // error
27+}
28+
29+int main() {
30+ struct interface ds = { print };
31+ goto csA(ds);
32+ return 0;
33+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/struct2.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/struct2.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,33 @@
1+
2+struct interface {
3+ __code (*next)();
4+ __rectype child;
5+ // __rectype *child;
6+ // struct interface *child;
7+};
8+
9+#include <stdio.h>
10+__code csA()
11+{
12+ printf("csA\n");
13+}
14+
15+__code csB()
16+{
17+ printf("csB\n");
18+}
19+
20+int main()
21+{
22+ struct interface p;
23+ p.next = csA;
24+
25+ struct interface pp;
26+ pp.next = csB;
27+ p.child = &pp;
28+
29+ // goto p.child->next();
30+ goto p.child->next();
31+
32+ return 0;
33+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/typedef.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/typedef.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,24 @@
1+typedef __code (CS)(__rectype*); // CS *p
2+
3+//typedef __code (*CS)(__code(*p)());
4+//typedef __code (CS)(__code(*p)()); // CS *p
5+
6+#include <stdio.h>
7+__code cs_end(CS *p)
8+{
9+ printf("end\n");
10+}
11+
12+__code cs(CS *p)
13+{
14+ CS *b;
15+ goto p(b);
16+// goto p("aaa"); //note: expected ‘void (*)’ but argument is of type ‘char
17+}
18+
19+int main() {
20+ CS *p;
21+ p = cs_end;
22+ goto cs(p);
23+ return 0;
24+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/typedef2.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/typedef2.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,24 @@
1+typedef __code (*csPtr)(__rectype);
2+
3+//typedef __code (*csPtr)(__code(*p)());
4+//typedef __code (csPtr)(__code(*p)()); // csPtr *p
5+
6+#include <stdio.h>
7+__code cs_end(csPtr p)
8+{
9+ printf("end\n");
10+}
11+
12+__code cs(csPtr p)
13+{
14+ csPtr b;
15+ goto p(b);
16+ // goto p(3); // note: expected ‘void (*)()’ but argument is of type ‘int’
17+}
18+
19+int main() {
20+ csPtr p;
21+ p = cs_end;
22+ goto cs(p);
23+ return 0;
24+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/rectypeTest/typedef3.cbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/rectypeTest/typedef3.cbc Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,21 @@
1+typedef __code (*csPtr)(__rectype*);
2+
3+#include <stdio.h>
4+__code cs_end(csPtr *p)
5+{
6+ printf("end\n");
7+}
8+
9+__code cs(csPtr p)
10+{
11+ csPtr *b; // <- This declaration please care.
12+ goto p(b);
13+ // goto p(3); // note: expected ‘void (**’ but argument is of type ‘int’
14+}
15+
16+int main() {
17+ csPtr p;
18+ p = cs_end;
19+ goto cs(p);
20+ return 0;
21+}
diff -r 85b994e68631 -r 6958b92652fe CbC-examples/selftype.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/selftype.c Sat Nov 17 14:01:39 2012 +0900
@@ -0,0 +1,29 @@
1+
2+/*
3+struct node {
4+ int num;
5+ struct node *child;
6+ // struct node **array_node;
7+};
8+*/
9+
10+#include <stdio.h>
11+
12+struct node {
13+ int num;
14+ selftype *child;
15+};
16+
17+int main() {
18+ struct node n, nc;
19+ n.num = 1;
20+ nc.num = 2;
21+ n.child = &nc;
22+
23+ printf("n.num = %d\n",n.num);
24+ printf("n.child.num = %d\n",n.child->num);
25+
26+ return 0;
27+}
28+
29+
diff -r 85b994e68631 -r 6958b92652fe gcc/c-decl.c
--- a/gcc/c-decl.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-decl.c Sat Nov 17 14:01:39 2012 +0900
@@ -5155,6 +5155,17 @@
51555155 }
51565156 }
51575157
5158+
5159+#ifndef noCbC
5160+ if ( declspecs->typespec_word == cts_CbC_rec )
5161+ {
5162+ // IS_RECTYPE(type) = 1;
5163+ // type = build_code_segment_type (type, NULL_TREE);
5164+ IS_RECTYPE(type) = 1;
5165+ }
5166+#endif
5167+
5168+
51585169 /* Now figure out the structure of the declarator proper.
51595170 Descend through it, creating more complex types, until we reach
51605171 the declared identifier (or NULL_TREE, in an absolute declarator).
@@ -5683,6 +5694,11 @@
56835694
56845695 type = build_pointer_type (type);
56855696
5697+#ifndef noCbC
5698+ if ( declspecs->typespec_word == cts_CbC_rec ){
5699+ IS_RECTYPE(type) = 1;
5700+ }
5701+#endif
56865702 /* Process type qualifiers (such as const or volatile)
56875703 that were given inside the `*'. */
56885704 type_quals = declarator->u.pointer_quals;
@@ -7682,10 +7698,32 @@
76827698 cbc_return_f = NULL_TREE;
76837699 cbc_env = NULL_TREE;
76847700 if ( declspecs->typespec_word == cts_CbC_code )
7685- {
7686- cbc_set_codesegment(decl1);
7687- //CbC_IS_CODE_SEGMENT(TREE_TYPE(decl1)) = 1;
7688- }
7701+ {
7702+ cbc_set_codesegment(decl1);
7703+ //CbC_IS_CODE_SEGMENT(TREE_TYPE(decl1)) = 1;
7704+
7705+
7706+ /* implementation of rectype */
7707+ tree func_tree = TREE_TYPE(decl1);
7708+ // parm is PARM_DECL
7709+ tree parm = declarator->u.arg_info->parms;
7710+ while (parm) {
7711+ tree tmptype = parm;
7712+ if (!IS_RECTYPE(TREE_TYPE(tmptype))) {
7713+ parm = TREE_CHAIN(parm);
7714+ continue;
7715+ }
7716+ tree t = TREE_TYPE(tmptype);
7717+ while (TREE_CODE(t) == POINTER_TYPE) {
7718+ tmptype = t;
7719+ t= TREE_TYPE(tmptype);
7720+ }
7721+ TREE_TYPE(tmptype) = func_tree;
7722+ parm = TREE_CHAIN(parm);
7723+ }
7724+
7725+ }
7726+
76897727 #endif
76907728
76917729 /* If the declarator is not suitable for a function definition,
@@ -8892,6 +8930,10 @@
88928930 error_at (loc,
88938931 ("both %<long%> and %<void%> in "
88948932 "declaration specifiers"));
8933+ else if (specs->typespec_word == cts_CbC_rec)
8934+ error_at (loc,
8935+ ("both %<long%> and %<void%> in "
8936+ "declaration specifiers"));
88958937 #endif
88968938 else if (specs->typespec_word == cts_int128)
88978939 error_at (loc,
@@ -8939,6 +8981,10 @@
89398981 error_at (loc,
89408982 ("both %<short%> and %<void%> in "
89418983 "declaration specifiers"));
8984+ else if (specs->typespec_word == cts_CbC_rec)
8985+ error_at (loc,
8986+ ("both %<short%> and %<void%> in "
8987+ "declaration specifiers"));
89428988 #endif
89438989 else if (specs->typespec_word == cts_int128)
89448990 error_at (loc,
@@ -8990,6 +9036,10 @@
89909036 error_at (loc,
89919037 ("both %<signed%> and %<void%> in "
89929038 "declaration specifiers"));
9039+ else if (specs->typespec_word == cts_CbC_rec)
9040+ error_at (loc,
9041+ ("both %<signed%> and %<void%> in "
9042+ "declaration specifiers"));
89939043 #endif
89949044 else if (specs->typespec_word == cts_bool)
89959045 error_at (loc,
@@ -9033,6 +9083,10 @@
90339083 error_at (loc,
90349084 ("both %<unsigned%> and %<void%> in "
90359085 "declaration specifiers"));
9086+ else if (specs->typespec_word == cts_CbC_rec)
9087+ error_at (loc,
9088+ ("both %<unsigned%> and %<void%> in "
9089+ "declaration specifiers"));
90369090 #endif
90379091 else if (specs->typespec_word == cts_bool)
90389092 error_at (loc,
@@ -9075,6 +9129,10 @@
90759129 error_at (loc,
90769130 ("both %<complex%> and %<void%> in "
90779131 "declaration specifiers"));
9132+ else if (specs->typespec_word == cts_CbC_rec)
9133+ error_at (loc,
9134+ ("both %<complex%> and %<void%> in "
9135+ "declaration specifiers"));
90789136 #endif
90799137 else if (specs->typespec_word == cts_bool)
90809138 error_at (loc,
@@ -9237,22 +9295,51 @@
92379295 #ifndef noCbC
92389296 case RID_CbC_CODE:
92399297 if (specs->long_p)
9240- error ("both %<long%> and %<void%> in "
9241- "declaration specifiers");
9242- else if (specs->short_p)
9243- error ("both %<short%> and %<void%> in "
9244- "declaration specifiers");
9245- else if (specs->signed_p)
9246- error ("both %<signed%> and %<void%> in "
9247- "declaration specifiers");
9248- else if (specs->unsigned_p)
9249- error ("both %<unsigned%> and %<void%> in "
9250- "declaration specifiers");
9251- else if (specs->complex_p)
9252- error ("both %<complex%> and %<void%> in "
9253- "declaration specifiers");
9298+ error_at (loc,
9299+ ("both %<long%> and %<_Bool%> in "
9300+ "declaration specifiers"));
9301+ else if (specs->short_p)
9302+ error_at (loc,
9303+ ("both %<short%> and %<_Bool%> in "
9304+ "declaration specifiers"));
9305+ else if (specs->signed_p)
9306+ error_at (loc,
9307+ ("both %<signed%> and %<_Bool%> in "
9308+ "declaration specifiers"));
9309+ else if (specs->unsigned_p)
9310+ error_at (loc,
9311+ ("both %<unsigned%> and %<_Bool%> in "
9312+ "declaration specifiers"));
9313+ else if (specs->complex_p)
9314+ error_at (loc,
9315+ ("both %<complex%> and %<_Bool%> in "
9316+ "declaration specifiers"));
92549317 else
9255- specs->typespec_word = cts_CbC_code;
9318+ specs->typespec_word = cts_CbC_code;
9319+ return specs;
9320+ case RID_CbC_REC:
9321+ if (specs->long_p)
9322+ error_at (loc,
9323+ ("both %<long%> and %<_Bool%> in "
9324+ "declaration specifiers"));
9325+ else if (specs->short_p)
9326+ error_at (loc,
9327+ ("both %<short%> and %<_Bool%> in "
9328+ "declaration specifiers"));
9329+ else if (specs->signed_p)
9330+ error_at (loc,
9331+ ("both %<signed%> and %<_Bool%> in "
9332+ "declaration specifiers"));
9333+ else if (specs->unsigned_p)
9334+ error_at (loc,
9335+ ("both %<unsigned%> and %<_Bool%> in "
9336+ "declaration specifiers"));
9337+ else if (specs->complex_p)
9338+ error_at (loc,
9339+ ("both %<complex%> and %<_Bool%> in "
9340+ "declaration specifiers"));
9341+ else
9342+ specs->typespec_word = cts_CbC_rec;
92569343 return specs;
92579344 #endif
92589345 case RID_BOOL:
@@ -9676,6 +9763,7 @@
96769763 case cts_void:
96779764 #ifndef noCbC
96789765 case cts_CbC_code:
9766+ case cts_CbC_rec:
96799767 #endif
96809768 gcc_assert (!specs->long_p && !specs->short_p
96819769 && !specs->signed_p && !specs->unsigned_p
diff -r 85b994e68631 -r 6958b92652fe gcc/c-family/c-common.c
--- a/gcc/c-family/c-common.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-family/c-common.c Sat Nov 17 14:01:39 2012 +0900
@@ -423,6 +423,9 @@
423423 #ifndef noCbC
424424 /* CbC project */
425425 { "__code", RID_CbC_CODE, 0 },
426+ // { "code", RID_CbC_CODE, 0 },
427+ { "__rectype", RID_CbC_REC, 0},
428+ { "selftype", RID_CbC_SELFTYPE, 0},
426429 #endif
427430 { "__builtin_choose_expr", RID_CHOOSE_EXPR, D_CONLY },
428431 { "__builtin_offsetof", RID_OFFSETOF, 0 },
diff -r 85b994e68631 -r 6958b92652fe gcc/c-family/c-common.h
--- a/gcc/c-family/c-common.h Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-family/c-common.h Sat Nov 17 14:01:39 2012 +0900
@@ -158,6 +158,8 @@
158158 #ifndef noCbC
159159 /* Continuation based C */
160160 RID_CbC_CODE, RID_CbC_ENV, RID_CbC_RET,
161+ /* extention of construction : __rectype, selftype */
162+ RID_CbC_REC,RID_CbC_SELFTYPE,
161163 #endif
162164 /* Named address support, mapping the keyword to a particular named address
163165 number. Named address space 0 is reserved for the generic address. If
diff -r 85b994e68631 -r 6958b92652fe gcc/c-family/c-pretty-print.c
--- a/gcc/c-family/c-pretty-print.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-family/c-pretty-print.c Sat Nov 17 14:01:39 2012 +0900
@@ -29,7 +29,9 @@
2929 #include "tree-pretty-print.h"
3030 #include "tree-iterator.h"
3131 #include "diagnostic.h"
32-
32+#ifndef noCbC
33+#include "cbc-tree.h"
34+#endif
3335 /* Translate if being used for diagnostics, but not for dump files or
3436 __PRETTY_FUNCTION. */
3537 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
@@ -544,6 +546,10 @@
544546 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
545547 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
546548 pp_c_right_paren (pp);
549+#ifndef noCbC
550+ if(IS_RECTYPE(t))
551+ return;
552+#endif
547553 t = TREE_TYPE (t);
548554 }
549555
diff -r 85b994e68631 -r 6958b92652fe gcc/c-parser.c
--- a/gcc/c-parser.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-parser.c Sat Nov 17 14:01:39 2012 +0900
@@ -654,7 +654,8 @@
654654 case RID_ACCUM:
655655 case RID_SAT:
656656 #ifndef noCbC
657- case RID_CbC_CODE:
657+ case RID_CbC_CODE:
658+ case RID_CbC_REC:
658659 #endif
659660 return true;
660661 default:
@@ -1636,6 +1637,41 @@
16361637 tree d = start_decl (declarator, specs, false,
16371638 chainon (postfix_attrs,
16381639 all_prefix_attrs));
1640+#ifndef noCbC
1641+ if (specs->typespec_word == cts_CbC_code) {
1642+ /*
1643+ * func_tree is TYPE_DECL or FUNCTION_DECL.
1644+ * tmp is POINTER_TYPE or FUNCTION_TYPE.
1645+ */
1646+ tree func_tree = TREE_TYPE(d);
1647+ // parm is PARM_DECL
1648+ tree parm = declarator->u.arg_info->parms;
1649+ while (parm) {
1650+ tree tmptype = parm;
1651+ if (!IS_RECTYPE(TREE_TYPE(tmptype))) {
1652+ parm = TREE_CHAIN(parm);
1653+ continue;
1654+ }
1655+ tree t = TREE_TYPE(tmptype);
1656+ while (TREE_CODE(t) == POINTER_TYPE) {
1657+ tmptype = t;
1658+ t = TREE_TYPE(tmptype);
1659+ }
1660+ TREE_TYPE(tmptype) = func_tree;
1661+ parm = TREE_CHAIN(parm);
1662+ }
1663+ }
1664+ if (specs->typespec_word == cts_CbC_rec) {
1665+ tree t = TREE_TYPE(d);
1666+ tree tmptype = t;
1667+ while (TREE_CODE(t) == POINTER_TYPE) {
1668+ tmptype = t;
1669+ t = TREE_TYPE(tmptype);
1670+ }
1671+ TREE_TYPE(tmptype) = TREE_TYPE(current_function_decl);
1672+ }
1673+
1674+#endif
16391675 if (d)
16401676 finish_decl (d, UNKNOWN_LOCATION, NULL_TREE,
16411677 NULL_TREE, asm_name);
@@ -2097,28 +2133,50 @@
20972133 c_parser_consume_token (parser);
20982134 break;
20992135 #ifndef noCbC
2100- case RID_CbC_CODE:
2101- if (!typespec_ok)
2102- goto out;
2103- attrs_ok = true;
2104- seen_type = true;
2105- if (c_dialect_objc ())
2106- parser->objc_need_raw_identifier = true;
2107- t.kind = ctsk_resword;
2108- t.spec = c_parser_peek_token (parser)->value;
2109- declspecs_add_type (loc, specs, t);
2110-
2111- /*
2112- attrs = get_identifier("fastcall");
2113- attrs = build_tree_list(attrs, NULL_TREE);
2114- declspecs_add_attrs(specs, attrs);
2115- */
2116- attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE);
2117- /*attrs = build_tree_list (get_identifier("noreturn"), attrs);*/
2118- declspecs_add_attrs(specs, attrs);
2119-
2120- c_parser_consume_token (parser);
2121- break;
2136+ case RID_CbC_CODE:
2137+ case RID_CbC_REC:
2138+ if (!typespec_ok)
2139+ goto out;
2140+ attrs_ok = true;
2141+ seen_type = true;
2142+ if (c_dialect_objc ())
2143+ parser->objc_need_raw_identifier = true;
2144+ t.kind = ctsk_resword;
2145+ t.spec = c_parser_peek_token (parser)->value;
2146+ declspecs_add_type (loc, specs, t);
2147+
2148+ IS_RECTYPE(t.spec) = 1;
2149+ /*
2150+ attrs = get_identifier("fastcall");
2151+ attrs = build_tree_list(attrs, NULL_TREE);
2152+ declspecs_add_attrs(specs, attrs);
2153+ */
2154+ if(!TARGET_64BIT) {
2155+ attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE);
2156+ /*attrs = build_tree_list (get_identifier("noreturn"), attrs);*/
2157+ declspecs_add_attrs(specs, attrs);
2158+ }
2159+
2160+ c_parser_consume_token (parser);
2161+ break;
2162+ case RID_CbC_SELFTYPE:
2163+ if (!typespec_ok)
2164+ goto out;
2165+ attrs_ok = true;
2166+ seen_type = true;
2167+ enum tree_code code = RECORD_TYPE;
2168+ location_t loc = c_parser_peek_token (parser)->location;
2169+
2170+ c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2171+ tree value;
2172+ struct c_typespec ret;
2173+ value = make_node (IDENTIFIER_NODE);
2174+ ret = parser_xref_tag (loc, code, value);
2175+
2176+ IS_SELFTYPE (ret.spec) = 1;
2177+ declspecs_add_type (loc, specs, ret);
2178+ c_parser_consume_token (parser);
2179+ break;
21222180 #endif
21232181 case RID_ENUM:
21242182 if (!typespec_ok)
@@ -2455,6 +2513,21 @@
24552513 /* Parse some comma-separated declarations, but not the
24562514 trailing semicolon if any. */
24572515 decls = c_parser_struct_declaration (parser);
2516+
2517+#ifndef noCbC
2518+ /* If tree type of tmptype is selftype, tmptype modify to RECORD_TYPE of struct [CPP_NAME]. */
2519+ if(TREE_CODE(decls) == FIELD_DECL && TREE_CODE(type) == RECORD_TYPE) {
2520+ tree tmptype = decls;
2521+ while(TREE_CODE (TREE_TYPE (tmptype)) == POINTER_TYPE)
2522+ tmptype = TREE_TYPE(tmptype);
2523+ if(IS_SELFTYPE ( TREE_TYPE (tmptype))) TREE_TYPE(tmptype) = type;
2524+ // if(IS_RECTYPE ( TREE_TYPE (tmptype)))
2525+ if(IS_RECTYPE (tmptype))
2526+ TREE_TYPE(tmptype) = type;
2527+ }
2528+
2529+#endif
2530+
24582531 contents = chainon (decls, contents);
24592532 /* If no semicolon follows, either we have a parse error or
24602533 are at the end of the struct or union and should
@@ -6158,20 +6231,39 @@
61586231 tree tlab;
61596232 tree cond;
61606233
6161- tree cstmt = c_begin_compound_stmt (true);
6162-
6234+ cond = integer_zero_node;
6235+ tree block_outside = c_begin_compound_stmt (false);
6236+ tree block_inside = c_begin_compound_stmt (false);
6237+
6238+ tree stmt = c_begin_compound_stmt (true);
61636239 tlab = define_label (loc, label);
61646240 gcc_assert (tlab);
61656241 decl_attributes (&tlab, NULL_TREE, 0);
6242+ TREE_USED (tlab) = 1;
6243+ /* add_stmt (LABEL_EXPR) */
61666244 add_stmt (build_stmt (loc, LABEL_EXPR, tlab));
61676245
6168- tree ret = c_finish_return (loc, retval, retval); /*tree ret = c_finish_return (retval);*/
6169- TREE_USED(ret) = 1;
6170-
6171- cond = integer_zero_node;
6172- tree if_body = c_end_compound_stmt (loc, cstmt, true);
6173- TREE_SIDE_EFFECTS (cstmt) = 1;
6174- c_finish_if_stmt (loc, cond, if_body, NULL_TREE, false);
6246+ /* add_stmt (RETURN_EXPR) */
6247+ tree ret = c_finish_return (loc, retval, retval);
6248+ DECL_READ_P(retval) = 1; // (NODE)->decl_common.decl_read_flag = 1;
6249+ // TREE_USED(ret) = 1;
6250+ tree stmt_body = c_end_compound_stmt (loc, stmt, true);
6251+
6252+ /* add_stmt (STATEMENT_LIST) : STATEMENT_LIST -> LABEL_EXPR -> RETURN_EXPR */
6253+ add_stmt (stmt_body);
6254+
6255+ tree body = c_end_compound_stmt (loc, block_inside, false);
6256+
6257+ /* add_stmt (COND_EXPR) */
6258+ c_finish_if_stmt (loc, cond, body, NULL_TREE, false);
6259+
6260+ /* add_stmt (BIND_EXPR) : BIND_EXPR -> COND_EXPR -> STATEMENT_LIST */
6261+ tree bind = c_end_compound_stmt (loc, block_outside, false);
6262+ TREE_SIDE_EFFECTS (bind) = 1;
6263+ add_stmt (bind);
6264+
6265+ TREE_USED (retval) = 1;
6266+
61756267 }
61766268
61776269 static tree
@@ -6242,7 +6334,7 @@
62426334 tree cstmt = c_begin_compound_stmt (true);
62436335
62446336 add_stmt (build_modify_expr (loc, retval_decl, NULL_TREE, NOP_EXPR, loc, _retval_decl, NULL_TREE));
6245- //tree stmt = c_finish_goto_label (loc, label);
6337+ tree stmt = c_finish_goto_label (loc, label);
62466338
62476339 /* end compound statement. */
62486340 fnbody = c_end_compound_stmt (loc, cstmt, true);
@@ -6739,19 +6831,27 @@
67396831 tree decl_cond =
67406832 build_decl (location, VAR_DECL, get_identifier ("retval"),
67416833 TREE_TYPE (TREE_TYPE (current_function_decl)));
6742- TREE_STATIC (decl_cond) = 1;
6743- DECL_ARTIFICIAL (decl_cond) = 1;
6744- pushdecl (decl_cond);
6834+ TREE_STATIC (decl_cond) = 1;
6835+ TREE_USED (decl_cond) = 1;
6836+
6837+ /* Use thread-local */
6838+ DECL_TLS_MODEL (decl_cond) = decl_default_tls_model (decl_cond);
6839+ DECL_NONLOCAL (decl_cond) = 1;
6840+ DECL_ARTIFICIAL (decl_cond) = 1;
6841+ add_stmt (build_stmt(location, DECL_EXPR, pushdecl (decl_cond)));
67456842
67466843 /* define nested function. */
67476844 decl =
67486845 cbc_finish_nested_function (location, label, decl_cond);
6846+ TREE_USED(decl) = 1;
6847+ TREE_LANG_FLAG_5(decl) = 1;
67496848
67506849 /* define if-ed goto label and return statement. */
67516850 cbc_finish_labeled_goto (location, label, decl_cond);
67526851
67536852 /* get pointer to nested function. */
67546853 value = build_addr (decl , current_function_decl);
6854+ TREE_USED (current_function_decl) = 1;
67556855 SET_EXPR_LOCATION (value, location);
67566856 add_stmt (value);
67576857
diff -r 85b994e68631 -r 6958b92652fe gcc/c-tree.h
--- a/gcc/c-tree.h Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-tree.h Sat Nov 17 14:01:39 2012 +0900
@@ -201,6 +201,7 @@
201201 cts_double,
202202 #ifndef noCbC
203203 cts_CbC_code,
204+ cts_CbC_rec,
204205 #endif
205206 cts_dfloat32,
206207 cts_dfloat64,
diff -r 85b994e68631 -r 6958b92652fe gcc/c-typeck.c
--- a/gcc/c-typeck.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/c-typeck.c Sat Nov 17 14:01:39 2012 +0900
@@ -9325,6 +9325,7 @@
93259325 return stmt;
93269326 }
93279327
9328+
93289329 /* Queue a cleanup. CLEANUP is an expression/statement to be executed
93299330 when the current scope is exited. EH_ONLY is true when this is not
93309331 meant to apply to normal control flow transfer. */
diff -r 85b994e68631 -r 6958b92652fe gcc/calls.c
--- a/gcc/calls.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/calls.c Sat Nov 17 14:01:39 2012 +0900
@@ -2349,7 +2349,7 @@
23492349 crtl->args.pretend_args_size is not part of the
23502350 stack allocated by our caller. */
23512351 || args_size.constant > (crtl->args.size
2352- - crtl->args.pretend_args_size)
2352+ - crtl->args.pretend_args_size)
23532353 /* If the callee pops its own arguments, then it must pop exactly
23542354 the same number of arguments as the current function. */
23552355 || (targetm.calls.return_pops_args (fndecl, funtype, args_size.constant)
@@ -2359,9 +2359,14 @@
23592359 || !lang_hooks.decls.ok_for_sibcall (fndecl))
23602360 try_tail_call = 0;
23612361
2362+
23622363 /* Check if caller and callee disagree in promotion of function
23632364 return value. */
2364- if (try_tail_call)
2365+#ifndef noCbC
2366+ if (try_tail_call && (!fndecl || !CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl))))
2367+#else
2368+ if (try_tail_call)
2369+#endif
23652370 {
23662371 enum machine_mode caller_mode, caller_promoted_mode;
23672372 enum machine_mode callee_mode, callee_promoted_mode;
diff -r 85b994e68631 -r 6958b92652fe gcc/cbc-tree.h
--- a/gcc/cbc-tree.h Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/cbc-tree.h Sat Nov 17 14:01:39 2012 +0900
@@ -12,3 +12,12 @@
1212 extern tree cbc_return_f;
1313 extern tree cbc_env;
1414 extern location_t cbc_return;
15+
16+/* flag of rectype and selftype is lang_flag_3. */
17+#define IS_RECTYPE(NODE) ((NODE)->type.lang_flag_3)
18+#define IS_SELFTYPE(NODE) ((NODE)->type.lang_flag_3)
19+
20+//#define CbC_TYPE_LANG_FLAG_3(NODE) (RECORD_OR_POINTER_CHECK (NODE)->type.lang_flag_3)
21+//#define RECORD_OR_POINTER_CHECK(NODE) TYPE_CHECK2 (T, POINTER_TYPE, RECORD_TYPE)
22+
23+//#define TYPE_LANG_FLAG_3(NODE) (TYPE_CHECK (NODE)->type.lang_flag_3)
diff -r 85b994e68631 -r 6958b92652fe gcc/function.c
--- a/gcc/function.c Sat Sep 24 03:01:41 2011 +0900
+++ b/gcc/function.c Sat Nov 17 14:01:39 2012 +0900
@@ -65,6 +65,8 @@
6565 #include "timevar.h"
6666 #include "vecprim.h"
6767
68+
69+
6870 /* So we can assign to cfun in this file. */
6971 #undef cfun
7072
@@ -3481,8 +3483,8 @@
34813483 }
34823484
34833485 #ifndef noCbC
3484- //if (CbC_IS_CODE_SEGMENT(TREE_TYPE(fndecl)) )
3485- //all.stack_args_size.constant = CbC_STACK_SIZE;
3486+ // if (CbC_IS_CODE_SEGMENT(TREE_TYPE(fndecl)) )
3487+ // all.stack_args_size.constant = CbC_STACK_SIZE;
34863488 #endif
34873489
34883490 /* We have aligned all the args, so add space for the pretend args. */
Show on old repository browser