~ chicken-core (chicken-5) b149e27921b550d570ddae6fb2aa3c921b4b1f54
commit b149e27921b550d570ddae6fb2aa3c921b4b1f54
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Mon Mar 25 21:14:43 2019 +1300
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Fri Mar 29 20:53:56 2019 +0100
Fix arguments to scrutiny reporting procedure for `append'
This commit fixes two issues introduced by 8301457, which updated the
scrutinizer's special case handling for `append' to use the new
`r-proc-call-argument-type-mismatch' procedure to report problems.
Firstly, the arguments for the call node and its type were flipped,
leading to an error when printing what was expected to be a node.
Secondly, the first item in the `arg-types' list was not resolved to a
type, so a `##core#the/result' node was passed instead. This wouldn't
cause an error, but it would give a confusing report.
Finally, for clarity, rename the `arg-types' variable to `args' within
that procedure (since it actually refers to nodes and not types), and
the `arg1' variable to `arg1-t' (which is a type and not a node).
Signed-off-by: Peter Bex <peter@more-magic.net>
diff --git a/scrutinizer.scm b/scrutinizer.scm
index 7d767df2..b728d5eb 100644
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -2198,24 +2198,25 @@
(define (potentially-proper-list? l) (match-types l 'list '()))
(define (derive-result-type)
- (let lp ((arg-types (cdr args))
+ (let lp ((args (cdr args))
(index 1))
- (if (null? arg-types)
+ (if (null? args)
'null
- (let ((arg1 (walked-result (car arg-types))))
+ (let* ((arg1 (car args))
+ (arg1-t (walked-result arg1)))
(cond
- ((and (pair? arg1) (eq? (car arg1) 'list))
- (and-let* ((rest-t (lp (cdr arg-types) (add1 index))))
+ ((and (pair? arg1-t) (eq? (car arg1-t) 'list))
+ (and-let* ((rest-t (lp (cdr args) (add1 index))))
;; decanonicalize, then recanonicalize to make it
;; easy to append a variety of types.
(canonicalize-list-type
(foldl (lambda (rest t) `(pair ,t ,rest))
- rest-t (reverse (cdr arg1))))))
+ rest-t (reverse (cdr arg1-t))))))
- ((and (pair? arg1) (eq? (car arg1) 'list-of))
- (and-let* ((rest-t (lp (cdr arg-types) (add1 index))))
+ ((and (pair? arg1-t) (eq? (car arg1-t) 'list-of))
+ (and-let* ((rest-t (lp (cdr args) (add1 index))))
;; list-of's length unsurety is "contagious"
- (simplify-type `(or ,arg1 ,rest-t))))
+ (simplify-type `(or ,arg1-t ,rest-t))))
;; TODO: (append (pair x (pair y z)) lst) =>
;; (pair x (pair y (or z lst)))
@@ -2223,11 +2224,10 @@
(else
;; The final argument may be an atom or improper list
- (unless (or (null? (cdr arg-types))
- (potentially-proper-list? arg1))
+ (unless (or (null? (cdr args))
+ (potentially-proper-list? arg1-t))
(r-proc-call-argument-type-mismatch
- loc node index 'list arg1
- (car arg-types)
+ loc node index arg1 'list arg1-t
(variable-mark 'scheme#append '##compiler#type)))
#f))))))
(cond ((derive-result-type) => list)
Trap