~ chicken-core (chicken-5) f5b02bb9bde320201e4cfdc17aec5650129a5129


commit f5b02bb9bde320201e4cfdc17aec5650129a5129
Merge: 8518c87a 8576f86a
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Dec 2 04:38:53 2010 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu Dec 2 04:38:53 2010 +0100

    resolved conflicts

diff --cc manual/Using the compiler
index c10a7114,f2514a47..0a515c41
--- a/manual/Using the compiler
+++ b/manual/Using the compiler
@@@ -117,7 -120,9 +117,7 @@@ the source text should be read from sta
  
  ; -keep-shadowed-macros : Do not remove macro definitions with the same name as assigned toplevel variables (the default is to remove the macro definition).
  
- ; -local : Assume toplevel variables defined in the current compilation unit are not externally modified.
 -; -lambda-lift : Enable the optimization known as lambda-lifting.
 -
+ ; -local : Assume toplevel variables defined in the current compilation unit are not externally modified. This gives the compiler more opportunities for inlining. Note that this may result in counter-intuitive and non-standard behaviour: an asssignment to an exported toplevel variable executed in a different compilation unit or in evaluated code will possibly not be seen by code executing in the current compilation unit.
  
  ; -no-argc-checks : disable argument count checks
  
diff --cc scrutinizer.scm
index 01e872d3,6a15f97e..af4626f8
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@@ -530,29 -540,45 +540,43 @@@
  	       ((##core#proc) '(procedure))
  	       ((##core#global-ref) (global-result (first params) loc))
  	       ((##core#variable) (variable-result (first params) e loc))
- 	       ((if) (let ((rt (single "in conditional" (walk (first subs) e loc dest) loc)))
- 		       (always-true rt loc n)
- 		       (let ((r1 (walk (second subs) e loc dest))
- 			     (r2 (walk (third subs) e loc dest)))
- 			 (cond ((and (not (eq? r1 '*)) 
- 				     (not (eq? '* r2)) )
- 				(when (and (not (any noreturn-type? r1))
- 					   (not (any noreturn-type? r2))
- 					   (not (= (length r1) (length r2))))
- 				  (report 
- 				   loc
- 				   (sprintf
- 				    "branches in conditional expression differ in the number of results:~%~%~a"
- 				    (pp-fragment n))))
- 				(map (lambda (t1 t2) (simplify `(or ,t1 ,t2)))
- 				     r1 r2))
- 			       (else '*)))))
+ 	       ((if)
+ 		(let ((rt (single "in conditional" (walk (first subs) e loc dest #f) loc))
+ 		      (c (second subs))
+ 		      (a (third subs)))
+ 		  (always-true rt loc n)
+ 		  (let ((r1 (walk c e loc dest tail))
+ 			(r2 (walk a e loc dest tail)))
+ 		    ;;XXX this is too heavy, perhaps provide "style" warnings?
+ 		    ;;XXX this could also check for noreturn (same as undefined)
+ 		    #;(when (and tail
+ 			       (if (eq? '##core#undefined (node-class c))
+ 				   (and (not (eq? '##core#undefined (node-class a)))
+ 					(not (self-call? a loc)))
+ 				   (and (eq? '##core#undefined (node-class a))
+ 					(not (self-call? c loc)))))
+ 		      (report
+ 		       loc
+ 		       (sprintf "conditional in tail-position has branch with undefined result:~%~%~a"
+ 			 (pp-fragment n))))
+ 		    (cond ((and (not (eq? '* r1)) (not (eq? '* r2)))
+ 			   (when (and (not (any noreturn-type? r1))
+ 				      (not (any noreturn-type? r2))
+ 				      (not (= (length r1) (length r2))))
+ 			     (report 
+ 			      loc
+ 			      (sprintf
+ 				  "branches in conditional expression differ in the number of results:~%~%~a"
+ 				(pp-fragment n))))
+ 			   (map (lambda (t1 t2) (simplify `(or ,t1 ,t2)))
+ 				r1 r2))
+ 			  (else '*)))))
  	       ((let)
 -		(let loop ((vars params) (body subs) (e2 '()))
 -		  (if (null? vars)
 -		      (walk (car body) (append e2 e) loc dest tail)
 -		      (let ((t (single 
 -				(sprintf "in `let' binding of `~a'" (real-name (car vars)))
 -				(walk (car body) e loc (car vars) #f) loc)))
 -			(loop (cdr vars) (cdr body) (alist-cons (car vars) t e2))))))
 +		(assert (= 2 (length body))) ;XXX should always be the case
 +		(let ((t (single 
 +			  (sprintf "in `let' binding of `~a'" (real-name (first params)))
- 			  (walk (first body) e loc (first vars)) loc)))
- 		  (walk (second body) (append (alist-cons (car vars) t e2) e) loc dest)))
++			  (walk (first body) e loc (first vars) #f) loc)))
++		  (walk (second body) (append (alist-cons (car vars) t e2) e) loc dest tail)))
  	       ((##core#lambda lambda)
  		(decompose-lambda-list
  		 (first params)
Trap