34637ef178d42d33ba11a119b6a6cf15701d91f7
[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 //NYACC
40 //#define offsetof(type, field) ((size_t) &((type *)0)->field)
41 #if __MESC__
42 #define offsetof(type, field) (&((type *)0)->field)
43 #else
44 #define offsetof(type, field) ((size_t)&((type *)0)->field)
45 #endif
46
47 int
48 test ()
49 {
50   foo f = {1};
51   printf ("f.i=%d\n", f.i);
52
53   bar b = {1, 2, &f};
54   printf ("b.i=%d\n", b.i);
55
56   printf ("b.f.i=%d\n", b.f.i);
57   if (b.f.i != 2) return 1;
58
59   printf ("b.p->i=%d\n", b.p->i);
60   if (b.p->i != 1) return 1;
61
62   bar* p = &b;
63   p->i = 2;
64   printf ("p->i=%d\n", b.i);
65
66   p->i++;
67   printf ("p->i=%d\n", b.i);
68
69   p->i--;
70   printf ("p->i=%d\n", b.i);
71
72   printf ("p->f.i=%d\n", p->f.i);
73   if (p->f.i != 2) return 1;
74
75   printf ("p->p->i=%d\n", p->p->i);
76   if (p->p->i != 1) return 1;
77
78   bar** pp = &p;
79   (*pp)->i = 3;
80   printf ("(*pp)->i=%d\n", b.i);
81
82   printf ("sizeof i:%d\n", sizeof (p->i));
83   if ((sizeof p->i) != 4) return 1;
84
85   printf ("offsetof g=%d\n", (offsetof (bar ,f)));
86   if ((offsetof (bar ,f)) != 4) return 1;
87
88   printf ("(*pp)->b.i=%d\n", (*pp)->f.i);
89   if ((*pp)->f.i != 2) return 1;
90
91   if (baz[0].i != 1) return 1;
92   printf ("baz[0].f.i=%d\n", baz[0].f.i);
93   if (baz[0].f.i != 2) return 1;
94
95   printf ("baz[1].i=%d\n", baz[1].i);
96   if (baz[1].i != 4) return 1;
97   printf ("baz[1].f.i=%d\n", baz[1].f.i);
98   if (baz[1].f.i != 5) return 1;
99
100   return 0;
101 }