054-init-struct-desig.scm (965B)
1 ;; tests/cc-cg/54-init-struct-desig.scm — global struct designated init. 2 ;; §E.6. 3 ;; 4 ;; Models: struct S { int a; int b; }; struct S s = {.b = 7}; 5 ;; Read b. With proper init, b == 7 and a == 0. 6 ;; main returns *p where p = (int*)&s + 1 (== &s.b == 7). 7 8 (let* ((cg (cg-init)) 9 (sty (%ctype 'struct 8 4 10 (list "S" #t 11 (list (list "a" %t-i32 0) 12 (list "b" %t-i32 4))))) 13 (s (%sym "s" 'var 'static sty #f)) 14 ;; Designated init: zero pad for a, then 7 for b. 15 (pad (make-bytevector 4 0)) 16 (bvB (make-bytevector 4 0)) (_b (bytevector-u8-set! bvB 0 7))) 17 (cg-emit-global cg s (list pad bvB)) 18 (cg-fn-begin cg "main" '() %t-i32) 19 (cg-push-sym cg s) (cg-take-addr cg) 20 (cg-cast cg (%ctype 'ptr 8 8 %t-i32)) 21 (cg-push-imm cg %t-i32 1) 22 (cg-binop cg 'add) 23 (cg-push-deref cg) (cg-load cg) 24 (cg-return cg) 25 (cg-fn-end cg) 26 (write-bv-fd 1 (cg-finish cg)))