mescc: Support anonymous enums.
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 25 May 2017 05:57:26 +0000 (07:57 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Thu, 25 May 2017 05:57:26 +0000 (07:57 +0200)
* module/language/c99/compiler.mes (enum-def-list->constants): New function.
  (ast->info): Support anonymous enum.

module/language/c99/compiler.mes

index ae7369c435079c1660b1a8dfa952895c3e659e2d..0bc8258205b954b3396be147312a81c5c3e6e611 100644 (file)
                                                    (int->bv32 (+ d (data-offset ,value g)))
                                                    (list-tail data (+ here 4))))))))))))
 
-        ;; enum 
+        ;; enum foo { };
         ((decl (decl-spec-list (type-spec (enum-def (ident ,name) (enum-def-list . ,fields)))))
          (let ((type (enum->type name fields))
-               (constants (let loop ((fields fields) (i 0) (constants constants))
-                            (if (null? fields) constants
-                                (let* ((field (car fields))
-                                       (name (pmatch field
-                                               ((enum-defn (ident ,name) . _) name)))
-                                       (i (pmatch field
-                                           ((enum-defn ,name (p-expr (fixed ,value))) (cstring->number value))
-                                           ((enum-defn ,name) i))))
-                                  (loop (cdr fields)
-                                        (1+ i)
-                                        (append constants (list (ident->constant name i)))))))))
+               (constants (enum-def-list->constants constants fields)))
            (clone info
                   #:types (append (.types info) (list type))
                   #:constants (append constants (.constants info)))))
 
+        ;; enum {};
+        ((decl (decl-spec-list (type-spec (enum-def (enum-def-list . ,fields)))))
+         (let ((constants (enum-def-list->constants constants fields)))
+           (clone info
+                  #:constants (append constants (.constants info)))))
+
         ;; struct
         ((decl (decl-spec-list (type-spec (struct-def (ident ,name) (field-list . ,fields)))))
          (let ((type (struct->type (list "struct" name) (map struct-field fields))))
         (_ (let ((info ((expr->accu info) o)))
              (append-text info (wrap-as (i386:accu-zero?)))))))))
 
+(define (enum-def-list->constants constants fields)
+  (let loop ((fields fields) (i 0) (constants constants))
+    (if (null? fields) constants
+        (let* ((field (car fields))
+               (name (pmatch field
+                       ((enum-defn (ident ,name) . _) name)))
+               (i (pmatch field
+                    ((enum-defn ,name (p-expr (fixed ,value))) (cstring->number value))
+                    ((enum-defn ,name) i))))
+          (loop (cdr fields)
+                (1+ i)
+                (append constants (list (ident->constant name i))))))))
+
 (define (initzer->non-const info)
   (lambda (o)
     (pmatch o