038-arrow.scm (1827B)
1 ;; tests/cc-cg/38-arrow.scm — pointer-to-struct field access via cg. 2 ;; Models p->a / p->b through: 3 ;; cg-push-sym sym-p ; lval (frame), holds ptr-value 4 ;; cg-load ; rval ptr 5 ;; cg-push-deref ; lval struct (indirect) 6 ;; cg-push-field "a" ; lval int at p+0 7 ;; 8 ;; struct S { int a; int b; }; struct S s; 9 ;; struct S *p = &s; p->a = 4; p->b = 9; return p->b - p->a; 10 ;; (The cg fixture takes &s into a frame slot directly so we don't 11 ;; depend on parser-only address-of plumbing.) 12 ;; 13 ;; Expected: 9 - 4 == 5. 14 15 (let* ((cg (cg-init)) 16 (st-ty (%ctype 'struct 8 4 17 (list "S" #t 18 (list (list "a" %t-i32 0) 19 (list "b" %t-i32 4))))) 20 (pt-ty (%ctype 'ptr 8 8 st-ty))) 21 (cg-fn-begin cg "main" '() %t-i32) 22 (let* ((off-s (cg-alloc-slot cg 8 4)) 23 (off-p (cg-alloc-slot cg 8 8)) 24 (sym-s (%sym "s" 'var 'auto st-ty off-s)) 25 (sym-p (%sym "p" 'var 'auto pt-ty off-p))) 26 ;; p = &s 27 (cg-push-sym cg sym-p) 28 (cg-push-sym cg sym-s) 29 (cg-take-addr cg) 30 (cg-assign cg) (cg-pop cg) 31 ;; p->a = 4 32 (cg-push-sym cg sym-p) 33 (cg-load cg) 34 (cg-push-deref cg) 35 (cg-push-field cg "a") 36 (cg-push-imm cg %t-i32 4) 37 (cg-assign cg) (cg-pop cg) 38 ;; p->b = 9 39 (cg-push-sym cg sym-p) 40 (cg-load cg) 41 (cg-push-deref cg) 42 (cg-push-field cg "b") 43 (cg-push-imm cg %t-i32 9) 44 (cg-assign cg) (cg-pop cg) 45 ;; return p->b - p->a 46 (cg-push-sym cg sym-p) 47 (cg-load cg) 48 (cg-push-deref cg) 49 (cg-push-field cg "b") 50 (cg-load cg) 51 (cg-push-sym cg sym-p) 52 (cg-load cg) 53 (cg-push-deref cg) 54 (cg-push-field cg "a") 55 (cg-load cg) 56 (cg-binop cg 'sub) 57 (cg-return cg)) 58 (cg-fn-end cg) 59 (write-bv-fd 1 (cg-finish cg)))