~ chicken-core (chicken-5) 487579a1a1faff1755cdacc4175dafe0c2560e38
commit 487579a1a1faff1755cdacc4175dafe0c2560e38 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Jun 9 03:53:21 2011 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Jun 9 03:53:21 2011 -0400 ##core#the validates type; fixed incorrect type<=? for procedure argument types diff --git a/scrutinizer.scm b/scrutinizer.scm index 5c77b123..6015986d 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -821,30 +821,30 @@ (cons fn (nth-value 0 (procedure-argument-types fn (sub1 len))))) r))) ((##core#the) - (let* ((t (first params)) - (rt (walk (first subs) e loc dest tail flow ctags))) - (cond ((eq? rt '*)) - ((null? rt) - (report - loc - (sprintf - "expression returns zero values but is declared to have a single result of type `~a'" - t))) - (else - (when (> (length rt) 1) - (report - loc - (sprintf - "expression returns ~a values but is declared to have a single result" - (length rt))) - (set! rt (list (first rt)))) - (unless (type<=? t (first rt)) + (let-values (((t _) (validate-type (first params) #f))) + (let ((rt (walk (first subs) e loc dest tail flow ctags))) + (cond ((eq? rt '*)) + ((null? rt) (report loc (sprintf - "expression returns a result of type `~a', but is declared to return `~a', which is not a subtype" - (first rt) t))))) - (list t))) + "expression returns zero values but is declared to have a single result of type `~a'" + t))) + (else + (when (> (length rt) 1) + (report + loc + (sprintf + "expression returns ~a values but is declared to have a single result" + (length rt))) + (set! rt (list (first rt)))) + (unless (type<=? t (first rt)) + (report + loc + (sprintf + "expression returns a result of type `~a', but is declared to return `~a', which is not a subtype" + (first rt) t))))) + (list t)))) ((##core#switch ##core#cond) (bomb "unexpected node class" class)) (else @@ -893,9 +893,11 @@ (m2 0)) (cond ((null? args1) (and (cond ((null? args2) - (or (and rtype2 (not rtype1)) - (and rtype1 rtype2 - (type<=? rtype1 rtype2)))) + (if rtype1 + (if rtype2 + (type<=? rtype1 rtype2) + #f) + #t)) ((eq? '#!optional (car args2)) (not rtype1)) ((eq? '#!rest (car args2))Trap