mescc: Tinycc support: Sizeof struct destruct.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 15:13:07 +0000 (17:13 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 15:13:07 +0000 (17:13 +0200)
module/language/c99/compiler.mes
scaffold/tests/t.c

index 27ab2b369ddde0cf217644f63b5ae64fbf2b5142..33a7a56c0c578d3b58a569348f42e0099e76c4ac 100644 (file)
 
       ((d-sel (ident ,field) ,struct)
        (let ((type0 (ast->type struct info)))
-         (stderr "type0=~s\n" type0)
          (ast->type (field-type info type0 field) info)))
 
       ((i-sel (ident ,field) ,struct)
      (* (expr->number info a) (expr->number info b)))
     ((sub ,a ,b)
      (- (expr->number info a) (expr->number info b)))
-    ((sizeof-type (type-name (decl-spec-list (type-spec ,type))))
-     (ast-type->size info type))
-    ((sizeof-expr (d-sel (ident ,field) (p-expr (ident ,struct))))
-     (let ((type (ident->type info struct)))
-       (field-size info type field)))
-    ((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,struct))))
-     (let ((type (ident->type info struct)))
-       (field-size info type field)))
+    ((sizeof-type ,type)
+     (->size (ast->type type info)))
+    ((sizeof-expr ,expr)
+     (->size (ast->type expr info)))
     ((lshift ,x ,y)
      (ash (expr->number info x) (expr->number info y)))
     ((rshift ,x ,y)
index b7181f97a6555d432799d20334b7fe8f2f1379d8..a102f602f57a05a89cc37d2a8b0be3391b442d87 100644 (file)
@@ -33,7 +33,8 @@ char *env[] = {"foo", "bar", "baz", 0};
 char *list[2] = {"foo\n", "bar\n"};
 
 struct foo {int length; char* string;};
-struct foo f = {3, "foo"};
+struct foo g_f = {3, "foo"};
+struct foo g_g = &g_f;
 struct foo g_foes[2];
 int g_foe;
 
@@ -45,7 +46,7 @@ struct here {int and;} there;
 int
 test (struct foo* p)
 {
-  struct foo *g = &f;
+  struct foo *g = &g_f;
   g[0].length = 0;
   p[0].length = 0;
 }
@@ -89,9 +90,9 @@ main (int argc, char* argv[])
     return 14;
   if (env[3])
     return 15;
-  if (f.length != 3)
+  if (g_f.length != 3)
     return 16;
-  if (strcmp (f.string, "foo"))
+  if (strcmp (g_f.string, "foo"))
     return 17;
   struct foo g = {4, "baar"};
   if (g.length != 4)
@@ -121,6 +122,9 @@ main (int argc, char* argv[])
   if (u.foo != 3) return 24;
   if (u.bla != 4) return 25;
 
+  char buf[sizeof (g_f.string)];
+  char buf1[sizeof (g_g->string)];
+
   i = 1;
   int lst[6] = {-1, 1 - 1, i, 2, 3};
   for (int i = 0; i < 4; i++)