~ chicken-core (chicken-5) 9413c4bf1b4b0c95e60ba12e082f4e03b4c0f8ef
commit 9413c4bf1b4b0c95e60ba12e082f4e03b4c0f8ef Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Jun 25 22:51:20 2019 +0200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Sat Jun 29 14:11:35 2019 +0200 Fix lfa2 type analysis for conditionals. Merge the types of the branches of conditional nodes when computing the result type. Signed-off-by: Peter Bex <peter@more-magic.net> diff --git a/lfa2.scm b/lfa2.scm index 3226b2e6..f7516658 100644 --- a/lfa2.scm +++ b/lfa2.scm @@ -258,6 +258,15 @@ `(struct ,(##sys#slot lit 0))) ((char? lit) 'char) (else '*))) + + (define (merge t1 t2) + (cond ((eq? t1 t2) t1) + ((and (pair? t1) (pair? t2) + (eq? (car t1) 'struct) + (eq? (car t2) 'struct) + (eq? (cadr t1) (cadr t2))) + t1) + (else '*))) (define (report elim) (cond ((assoc elim stats) => @@ -348,16 +357,15 @@ (vartype (first params) te ae)) ((if ##core#cond) (let ((tr (walk (first subs) te ae))) - (cond ((and (pair? tr) (eq? 'boolean (car tr))) - (walk (second subs) - (append (second tr) te) - ae) - (walk (third subs) - (append (third tr) te) - ae)) - (else - (walk (second subs) te ae) - (walk (third subs) te ae))))) + (if (and (pair? tr) (eq? 'boolean (car tr))) + (merge (walk (second subs) + (append (second tr) te) + ae) + (walk (third subs) + (append (third tr) te) + ae))) + (merge (walk (second subs) te ae) + (walk (third subs) te ae)))) ((quote) (constant-result (first params))) ((let) (let* ((val (first subs))Trap