029-land.scm (1278B)
1 ;; tests/cc-cg/29-land.scm — `&&` short-circuits, leaves one i32 (§H.2). 2 ;; 3 ;; Models: int a = 5; int b = 0; return (a && b) ? 100 : 42; 4 ;; → exit 42 (since a && b is false because b == 0). 5 ;; Also asserts the merged result is i32 0/1 — store it into an i32 6 ;; slot and reload, confirming exit value when isolated. 7 8 (let ((cg (cg-init))) 9 (cg-fn-begin cg "main" '() %t-i32) 10 (let* ((off-a (cg-alloc-slot cg 4 4)) 11 (sym-a (%sym "a" 'var 'auto %t-i32 off-a)) 12 (off-b (cg-alloc-slot cg 4 4)) 13 (sym-b (%sym "b" 'var 'auto %t-i32 off-b))) 14 ;; a = 5; b = 0 15 (cg-push-sym cg sym-a) 16 (cg-push-imm cg %t-i32 5) 17 (cg-assign cg) (cg-pop cg) 18 (cg-push-sym cg sym-b) 19 (cg-push-imm cg %t-i32 0) 20 (cg-assign cg) (cg-pop cg) 21 ;; (a && b) implemented via cg-ifelse-merge per parser pattern 22 (cg-push-sym cg sym-a) (cg-load cg) 23 (cg-ifelse-merge cg 24 (lambda () 25 (cg-push-sym cg sym-b) (cg-load cg) 26 (cg-cast cg %t-bool) (cg-cast cg %t-i32)) 27 (lambda () (cg-push-imm cg %t-i32 0))) 28 ;; Outer: (cond) ? 100 : 42 29 (cg-ifelse-merge cg 30 (lambda () (cg-push-imm cg %t-i32 100)) 31 (lambda () (cg-push-imm cg %t-i32 42))) 32 (cg-return cg)) 33 (cg-fn-end cg) 34 (write-bv-fd 1 (cg-finish cg)))