mescc: Tinycc support: Valued function assign.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 11:34:45 +0000 (13:34 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 11:34:45 +0000 (13:34 +0200)
module/language/c99/compiler.mes
scaffold/tests/48-function-destruct.c
scaffold/tests/49-global-static.c

index c810ee9fde81175635411935794ec650dfad9fb4..fc57bf534109e789940463b428b6f1edb5a92e40 100644 (file)
 
       ((decl-spec-list (type-spec ,type))
        (ast->type type info))
+
+       ;; `typedef int size; void foo (unsigned size u)
+      ((decl-spec-list (type-spec ,type) (type-spec ,type2))
+       (ast->type type info))
+
       ((assn-expr ,a ,op ,b)
        (ast->type a info))
 
       (assoc-ref (.constants info) o)
       (assoc-ref (.functions info) o)
       (begin
-        (stderr "info=~s\n" info)
-        (error "ident->variable: undefined variabled:" o))))
+        (error "ident->variable: undefined variable:" o))))
 
 (define (static-global? o)
   ((compose global:function cdr) o))
 
 (define (ast->comment o)
   (if mes? '()
-      (begin
-        (pmatch o
-          ;; Nyacc 0.80.42: missing  (enum-ref (ident "fred"))
-          ((decl (decl-spec-list (type-spec (enum-ref . _))) . _)
-           '())
-         (_ (let ((source (with-output-to-string (lambda () (pretty-print-c99 o)))))
-              (make-comment (string-join (string-split source #\newline) " "))))))))
+      (let ((source (with-output-to-string (lambda () (pretty-print-c99 o)))))
+        (make-comment (string-join (string-split source #\newline) " ")))))
 
 (define (accu*n info n)
   (append-text info (wrap-as (case n
 
       ((decl . ,decl)
        ;;FIXME: ridiculous performance hit with mes
-       (let ((info (append-text info (ast->comment o))))
+       ;; Nyacc 0.80.42: missing  (enum-ref (ident "fred"))
+       (let (;;(info (append-text info (ast->comment o)))
+             )
          (decl->info info decl)))
       ;; ...
       ((gt . _) (expr->accu o info))
        (if (not size) data
            (append data (string->list (make-string (max 0 (- size (length data))) #\nul))))))
 
+    (((initzer (p-expr (string . ,strings))))
+     (let ((data (string->list (apply string-append strings))))
+       (if (not size) data
+           (append data (string->list (make-string (max 0 (- size (length data))) #\nul))))))
+
     ((initzer (p-expr (fixed ,fixed)))
      (int->bv32 (expr->number info fixed)))
 
             (rank (ptr-declr->rank pointer)))
        (if (zero? rank) type
            (make-pointer type rank))))
-    (((decl-spec-list (type-spec ,type)) . ,rest)
+    (((decl-spec-list (type-spec ,type)) . _)
      (ast->type type info))
-    (((decl-spec-list (stor-spec ,store) (type-spec ,type)) (ftn-declr (ident _) _) _)
+    (((decl-spec-list (stor-spec ,store) (type-spec ,type)) . _)
      (ast->type type info))
+
+    ;; (((decl-spec-list (stor-spec ,store) (type-spec ,type)) (ftn-declr (ident _) _) _)
+    ;;  (ast->type type info))
+    ;; (((decl-spec-list (stor-spec ,store) (type-spec ,type)) (ptr-declr ,pointer (ftn-declr (ident _) _)) _)
+    ;;  (ast->type type info))
+
     (_ (error "fctn-defn:get-type: not supported:" o))))
 
 (define (ftn-declr:get-type info o)
            (text (param-list->text formals))
            (locals (param-list->locals formals info))
            (statement (fctn-defn:get-statement o))
-           (info (clone info #:locals locals #:function name #:text text #:statics '()))
+           (function (cons name (make-function name type '())))
+           (functions (cons function (.functions info)))
+           (info (clone info #:locals locals #:function name #:text text #:functions functions #:statics '()))
            (info (ast->info statement info))
            (locals (.locals info))
            (local (and (pair? locals) (car locals)))
index 6e171690b123fd9fa30741eaa3f534b397f43b0b..d07e2e1923a5e187cdcd4d867d8c31a4c80002b2 100644 (file)
@@ -26,6 +26,7 @@ struct foo
 struct foo*
 test (struct foo* f)
 {
+  void (*fun) () = test;
   return f;
 }
 
index e669b339ae755c19067aea0b79c1eac37186fab6..5b453f1b11a48fc255b9489a7433739c76ce6aed 100644 (file)
 
 static int sint;
 static int sint2, sint3;
-
-static int
-test ()
+typedef unsigned int size;
+static void*
+test (size u)
 {
-  return 0;
+  void *r;
+  if (u)
+    r = test (u);
 }
 
 static int i = 2;
 int
 main ()
 {
-  return test ();
+  void (*foo)() = &test;
+  return test (0);
 }