mescc: Tinycc support: --*p, ++*p.
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 10 Aug 2017 18:57:43 +0000 (20:57 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Thu, 10 Aug 2017 18:57:43 +0000 (20:57 +0200)
* module/language/c99/compiler.mes (expr->accu): Remove specific --/++.
  (expr->accu*): Support p, *p.
* scaffold/tests/76-pointer-arithmetic.c (test): Test it.

module/language/c99/compiler.mes
scaffold/tests/76-pointer-arithmetic.c

index a7f06ee8f2270541a8a654fb444a67292e6ebec7..96f2d46caf4162757197056420980a1ebed69929 100644 (file)
                                                 ((2) (i386:word-mem->accu))
                                                 (else (i386:mem->accu))))))))
 
-        ((de-ref (post-inc (p-expr (ident ,name))))
-         (let* ((info ((expr->accu info) `(de-ref (p-expr (ident ,name)))))
-                (type (ident->type info name))
-                (ptr (ident->pointer info name))
-                (size (if (= ptr 1) (ast-type->size info type)
-                          4)))
-           (append-text info ((ident-add info) name size))))
-
         ((de-ref ,expr)
          (let* ((info ((expr->accu info) expr))
                 (ptr (expr->pointer info expr))
         ((cond-expr . ,cond-expr)
          ((ast->info info) `(expr-stmt ,o)))
 
-        ((post-inc (p-expr (ident ,name)))
-         (let* ((type (ident->type info name))
-                (ptr (ident->pointer info name))
-                (size (cond ((= ptr 1) (ident->size info name))
-                            ((> ptr 1) 4)
-                            (else 1))))
-           (append-text info (append ((ident->accu info) name)
-                                     ((ident-add info) name size)))))
-
-        ((post-dec (p-expr (ident ,name)))
-         (let* ((type (ident->type info name))
-                (ptr (ident->pointer info name))
-                (size (cond ((= ptr 1) (ident->size info name))
-                            ((> ptr 1) 4)
-                            (else 1))))
-           (append-text info (append ((ident->accu info) name)
-                                     ((ident-add info) name (- size))))))
-
-        ((pre-inc (p-expr (ident ,name)))
-         (let* ((type (ident->type info name))
-                (ptr (ident->pointer info name))
-                (size (cond ((= ptr 1) (ident->size info name))
-                            ((> ptr 1) 4)
-                            (else 1))))
-           (append-text info (append ((ident-add info) name size)
-                                     ((ident->accu info) name)))))
-
-        ((pre-dec (p-expr (ident ,name)))
-         (let* ((type (ident->type info name))
-                (ptr (ident->pointer info name))
-                (size (cond ((= ptr 1) (ident->size info name))
-                            ((> ptr 1) 4)
-                            (else 1))))
-           (append-text info (append ((ident-add info) name (- size))
-                                     ((ident->accu info) name)))))
-
         ((post-inc ,expr)
          (let* ((info (append ((expr->accu info) expr)))
                 (info (append-text info (wrap-as (i386:push-accu))))
 (define (expr->accu* info)
   (lambda (o)
     (pmatch o
+
+      ((p-expr (ident ,name))
+       (append-text info ((ident-address->accu info) name)))
+
+      ((de-ref ,expr)
+       ((expr->accu info) expr))
+
       ;; foo[bar]
       ((array-ref ,index (p-expr (ident ,array)))
        (let* ((info ((expr->accu info) index))
index 8e0c278a8248c8bc484116ee5f5a8cce82dcf149..28b63344b0f1e43773c4d0f34118eb6f461962fe 100644 (file)
@@ -19,6 +19,9 @@
  */
 
 #include "30-test.i"
+#include <stdio.h>
+
+char *list[2] = {"foo\n", "bar\n"};
 
 int
 test ()
@@ -43,5 +46,13 @@ test ()
   if (ppv + 1 != 8) return 11;
   if (ppi + 1 != 8) return 12;
 
+  char **p = list;
+  ++*p;
+  eputs (*p);
+  if (strcmp (*p, "oo\n")) return 1;
+  --*p;
+  eputs (*p);
+  if (strcmp (*p, "foo\n")) return 2;
+
   return 0;
 }