mescc: Tinycc support: fix foo[bar]->baz.
[mes.git] / scaffold / tests / 72-typedef-struct-def.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "30-test.i"
22 #include <stdio.h>
23
24 typedef struct foo
25 {
26   int i;
27 } foo;
28
29 typedef struct
30 {
31   int i;
32   struct foo f;
33   struct foo *p;
34 } bar;
35
36
37 bar baz[2] = {1, 2, 3, 4, 5, 6};
38
39 bar *list[2];
40
41 //NYACC
42 //#define offsetof(type, field) ((size_t) &((type *)0)->field)
43 #if __MESC__
44 #define offsetof(type, field) (&((type *)0)->field)
45 #else
46 #define offsetof(type, field) ((size_t)&((type *)0)->field)
47 #endif
48
49 int
50 test ()
51 {
52   foo f = {1};
53   printf ("f.i=%d\n", f.i);
54
55   bar b = {1, 2, &f};
56   printf ("b.i=%d\n", b.i);
57
58   printf ("b.f.i=%d\n", b.f.i);
59   if (b.f.i != 2) return 1;
60
61   printf ("b.p->i=%d\n", b.p->i);
62   if (b.p->i != 1) return 2;
63
64   bar* p = &b;
65   p->i = 2;
66   printf ("p->i=%d\n", b.i);
67
68   p->i++;
69   printf ("p->i=%d\n", b.i);
70
71   p->i--;
72   printf ("p->i=%d\n", b.i);
73
74   printf ("p->f.i=%d\n", p->f.i);
75   if (p->f.i != 2) return 3;
76
77   printf ("p->p->i=%d\n", p->p->i);
78   if (p->p->i != 1) return 4;
79
80   bar** pp = &p;
81   (*pp)->i = 3;
82   printf ("(*pp)->i=%d\n", b.i);
83
84   printf ("sizeof i:%d\n", sizeof (p->i));
85   if ((sizeof p->i) != 4) return 5;
86
87   printf ("offsetof g=%d\n", (offsetof (bar ,f)));
88   if ((offsetof (bar ,f)) != 4) return 6;
89
90   printf ("(*pp)->b.i=%d\n", (*pp)->f.i);
91   if ((*pp)->f.i != 2) return 7;
92
93   if (baz[0].i != 1) return 8;
94   printf ("baz[0].f.i=%d\n", baz[0].f.i);
95   if (baz[0].f.i != 2) return 9;
96
97   printf ("baz[1].i=%d\n", baz[1].i);
98   if (baz[1].i != 4) return 10;
99   printf ("baz[1].f.i=%d\n", baz[1].f.i);
100   if (baz[1].f.i != 5) return 11;
101
102   bar one = {0};
103   printf ("one.i\n", one.i);
104   if (one.i != 0) return 12;
105   printf ("one.f.i\n", one.f.i);
106   if (one.f.i != 0) return 13;
107
108   bar b0 = {2};
109   struct foo f0 = {0};
110   struct foo *pf = &f0;
111   list[0] = &b0;
112   list[0]->p = pf;
113
114   eputs ("b0.i="); eputs (itoa (b0.i)); eputs ("\n");
115   if (b0.i != 2) return 14;
116   eputs ("b0.p->i="); eputs (itoa (b0.p->i)); eputs ("\n");
117   if (b0.p->i != 0) return 15;
118
119   return 0;
120 }