mescc: Tinycc support: Function variables.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 16:53:54 +0000 (18:53 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 16:53:54 +0000 (18:53 +0200)
module/language/c99/compiler.mes
scaffold/tests/t.c

index 9f1d89a606e24cf7f49802409f3e3356c8a664e3..0dcee64ccae14b1a77db00b4470a3963d58fea68 100644 (file)
 
 (define (ast->type o info)
   (define (type-helper o info)
+    (if (getenv "MESC_DEBUG")
+        (stderr "type-helper: ~s\n" o))
     (pmatch o
       (,t (guard (type? t)) t)
       (,p (guard (pointer? p)) p)
              (let ((type (get-type name info)))
                (ast->type type info)))
 
-      ((fctn-call (p-expr (ident ,name)) . _) (or (ident->type info name)
-                                                  (get-type "int" info)))
+      ((fctn-call (p-expr (ident ,name)) . _)
+       (or (and=> (assoc-ref (.functions info) name) function:type)
+           (get-type "int" info)))
+
+      ((fctn-call (de-ref (p-expr (ident ,name))) . _)
+       (or (and=> (assoc-ref (.functions info) name) function:type)
+           (get-type "int" info)))
 
       ((fixed-type ,type) (ast->type type info))
       ((float-type ,type) (ast->type type info))
                   (strings (filter string-global? (.globals tmp))))
              (clone info #:globals (append (.globals info) strings)
                     #:statics (append statics (.statics info)))))))
+    (((decl-spec-list (stor-spec (,store)) (type-spec ,type)))
+     (type->info type #f info))
     (((@ . _))
      (stderr "decl->info: skip: ~s\n" o)
      info)
             (type (rank+= type rank)))
        (if (.function info) (local->info type name o init info)
            (global->info type name o init info))))
+    (((ftn-declr (scope (ptr-declr ,pointer (ident ,name))) ,param-list))
+     (let* ((rank (pointer->rank pointer))
+            (type (rank+= type rank)))
+       (if (.function info) (local->info type name o '() info)
+           (global->info type name o '() info))))
     (((ptr-declr ,pointer . ,_) . ,init)
      (let* ((rank (pointer->rank pointer))
             (type (rank+= type rank)))
index ff3ec8eebe870149a55363f10a1f25d5ded80419..a92504c08f1498de7da26d053b5252634f536882 100644 (file)
@@ -34,7 +34,7 @@ char *list[2] = {"foo\n", "bar\n"};
 
 struct foo {int length; char* string;};
 struct foo g_f = {3, "foo"};
-struct foo g_g = &g_f;
+struct foo *g_g = &g_f;
 struct foo g_foes[2];
 int g_foe;
 
@@ -57,6 +57,12 @@ test (struct foo* p)
   p[0].length = 0;
 }
 
+int
+next_main (int argc, char* argv[])
+{
+  return 0;
+}
+
 int
 main (int argc, char* argv[])
 {
@@ -131,6 +137,14 @@ main (int argc, char* argv[])
   char buf[sizeof (g_f.string)];
   char buf1[sizeof (g_g->string)];
 
+  int (*fun)(int, char **);
+  fun = &next_main;
+  //i = (*fun)(argc, argv);
+
+  int (*fun2)(int, char *[]);
+  fun2 = &next_main;
+  //i = (*fun2)(argc, argv);
+
   i = 1;
   int lst[6] = {-1, 1 - 1, i, 2, 3};
   for (int i = 0; i < 4; i++)