mescc: Add 70-array-in-struct-init.c test with fix.
[mes.git] / module / mescc / compile.scm
index 5118ff51ad11ef7fc2d5452b9dc189cbb7c9fc40..a7362f77fcb8c8b7734f1740d9e2ccde64917c86 100644 (file)
     ((bits . ,bits) bits)
     (_ (list o))))
 
-(define (struct->init-fields o)
+(define (struct->init-fields o) ;; FIXME REMOVEME: non-recursive unroll
   (pmatch o
     (_ (guard (and (type? o) (eq? (type:type o) 'struct)))
        (append-map struct->init-fields (type:description o)))
            (int->bv type (expr->number info fixed) info))
          (int->bv type (expr->number info fixed) info)))
     ((initzer (initzer-list . ,inits))
-     (if (structured-type? type)
-         (let* ((fields (map cdr (struct->init-fields type)))
-                (missing (max 0 (- (length fields) (length inits))))
-                (inits (append inits
-                               (map (const '(fixed "0")) (iota missing)))))
-           (map (cut init->data <> <> info) fields inits))
-         (begin
-           (stderr "array-init-element->data: oops:~s\n" o)
-           (stderr "type:~s\n" type)
-           (error "array-init-element->data: unstructured not supported: " o))))
+     (cond ((structured-type? type)
+            (let* ((fields (map cdr (struct->init-fields type)))
+                   (missing (max 0 (- (length fields) (length inits))))
+                   (inits (append inits
+                                  (map (const '(fixed "0")) (iota missing)))))
+              (map (cut array-init-element->data <> <> info) fields inits)))
+           ((c-array? type)
+            (let* ((missing (max 0 (- (c-array:count type) (length inits))))
+                   (inits (append inits
+                                  (map (const '(fixed "0")) (iota missing)))))
+              (map (cut array-init-element->data (c-array:type type) <> info) inits)))
+         (else
+          (stderr "array-init-element->data: oops:~s\n" o)
+          (stderr "type:~s\n" type)
+          (error "array-init-element->data: not supported: " o))))
     (_ (init->data type o info))
     (_ (error "array-init-element->data: not supported: " o))))
 
     ((initzer (initzer-list . ,inits))
      (let ((type (c-array:type type)))
        (if (structured-type? type)
-           (let* ((fields (length (struct->init-fields type))))
+           (let* ((init-fields (struct->init-fields type)) ;; FIXME
+                  (count (length init-fields)))
              (let loop ((inits inits))
                (if (null? inits) '()
                    (let ((init (car inits)))
                        ((initzer (initzer-list . ,car-inits))
                         (append (array-init-element->data type init info)
                                 (loop (cdr inits))))
-                       (_ (let* ((count (min (length inits) fields))
+                       (_
+                        (let* ((count (min (length inits) (length init-fields)))
                                  (field-inits (list-head inits count)))
-                            (append (array-init-element->data type `(initzer-list ,@field-inits) info)
-                                    (loop (list-tail inits count))))))))))
+                          (append (array-init-element->data type `(initzer-list ,@field-inits) info)
+                           (loop (list-tail inits count))))))))))
            (map (cut array-init-element->data type <> info) inits))))
 
     (((initzer (initzer-list . ,inits)))