mescc: Tinycc support: Fix sizeof interesting expressions.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 14 May 2018 18:14:42 +0000 (20:14 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 14 May 2018 18:14:42 +0000 (20:14 +0200)
* module/language/c99/compiler.mes (ast->type): Return type for
  sizeof-expr, sizeof-type.
* scaffold/tests/85-sizeof.c: Test it.

module/language/c99/compiler.mes
scaffold/tests/85-sizeof.c

index 0cbc52d2990db2de9a5028898496e696ae803c34..90d24f27484406743d0ceaac14336663ea81434f 100644 (file)
       ((char ,value) (get-type "char" info))
       ((enum-ref . _) (get-type "int" info))
       ((fixed ,value) (get-type "int" info))
-      ((sizeof-expr . _) (get-type "int" info))
-      ((sizeof-type . _) (get-type "int" info))
-      ((string ,string) (make-c-array (get-type "char" info) (1+ (string-length string))))
       ((void) (get-type "void" info))
 
-      ((type-name ,type) (ast->type type info))
-      ((type-name ,type (abs-declr ,pointer))
-       (let ((rank (pointer->rank pointer)))
-         (rank+= (ast->type type info) rank)))
-
       ((ident ,name) (ident->type info name))
       ((tag ,name) (or (get-type o info)
                        o))
              (let ((type (get-type name info)))
                (ast->type type info)))
 
+      ((type-name (decl-spec-list ,type) (abs-declr (pointer . ,pointer)))
+       (let ((rank (pointer->rank `(pointer ,@pointer)))
+             (type (ast->type type info)))
+         (rank+= type rank)))
+
+      ((type-name ,type) (ast->type type info))
+      ((type-spec ,type) (ast->type type info))
+
+      ((sizeof-expr ,expr) (ast->type expr info))
+      ((sizeof-type ,type) (ast->type type info))
+
+      ((string ,string) (make-c-array (get-type "char" info) (1+ (string-length string))))
+
+      ((decl-spec-list (type-spec ,type)) (ast->type type info))
+
       ((fctn-call (p-expr (ident ,name)) . _)
        (or (and=> (assoc-ref (.functions info) name) function:type)
            (get-type "int" info)))
       (_ (error "struct-field: not supported: " o)))))
 
 (define (->size o)
-  (cond ((and (type? o) (eq? (type:type o) 'struct))
-         (apply + (map (compose ->size cdr) (struct->fields o))))
-        ((and (type? o) (eq? (type:type o) 'union))
+  (cond ((and (type? o) (eq? (type:type o) 'union))
          (apply max (map (compose ->size cdr) (struct->fields o))))
         ((type? o) (type:size o))
         ((pointer? o) %pointer-size)
index 7cb552bb7381368eaff1916af508714bdad82c35..d69ad599fc6807706b862bdbf80f0d44a6b561e8 100644 (file)
@@ -24,13 +24,31 @@ struct foo
   char buf[16];
 };
 
+struct bar
+{
+  struct
+  {
+    int x;
+    int y;
+    int z;
+  };
+};
+
 int
 main ()
 {
   char **p;
-  if (sizeof (*p) != 4) return 1;
-  if (sizeof (**p) != 1) return 2;
+  if (sizeof (*p) != 4)
+    return 1;
+  if (sizeof (**p) != 1)
+    return 2;
   puts ("size: "); puts (itoa (sizeof (struct foo))); puts ("\n");
-  if (sizeof (struct foo) != 20) return 3;
+  if (sizeof (struct foo) != 20)
+    return 3;
+  struct foo f;
+  if (sizeof f != 20)
+    return 4;
+  if (sizeof (struct bar) != 12)
+    return 5;
   return 0;
 }