mescc: Tinycc support: bitwise-or initializer.
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 20 Jul 2017 22:21:31 +0000 (00:21 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (initzer->value): New function.
  (initzer->data): Use it to support bitwise-or initializer.
* scaffold/tests/74-multi-line-string.c (test): Test it.

module/language/c99/compiler.mes
scaffold/tests/74-multi-line-string.c

index b4b5a7b4cbf0dcd4817b721516f802953962f3ee..70ed005400baee301ed5ad8f2cf911987febd3ee 100644 (file)
          `(initzer (p-expr (fixed ,(number->string value))))))
       (_ o))))
 
+(define (initzer->value info)
+  (lambda (o)
+    (pmatch o
+      ((p-expr (fixed ,value)) (cstring->number value))
+      (_ (error "initzer->value: " o)))))
+
 (define (initzer->data info)
   (lambda (o)
     (pmatch o
       ((initzer (p-expr (string ,string))) `((#:string ,string) #f #f #f))
       ((initzer (p-expr (string . ,strings))) `((#:string ,(string-join strings "")) #f #f #f))
       ((initzer (initzer-list . ,initzers)) (append-map (initzer->data info) initzers))
+      ((initzer (bitwise-or . ,values))
+       (let loop ((values (map (initzer->value info) values)) (value 0))
+         (if (null? values) (int->bv32 value)
+             (loop (cdr values) (logior value (car values))))))
       (() (int->bv32 0))
       (_ (error "initzer->data: unsupported: " o)))))
 
index f90b214fa57f7bf3793f9c5513d65eb051a5a581..28c54e2c8d68fc7ddf806dad21d522a9762b9551 100644 (file)
@@ -31,7 +31,10 @@ char const* help =
 int
 test ()
 {
-  if (printf ("belong to us"), strcmp (help, "All your base are")) return 1;
+  if (printf ("belong to us\n"), strcmp (help, "All your base are")) return 1;
+
+  int i = 1 | 2 | 4;
+  if (i != 7) return 1;
 
   return 2,1,0;
 }