~ chicken-core (chicken-5) b528ffbded9de3335c1631d7abb34672e04855f0


commit b528ffbded9de3335c1631d7abb34672e04855f0
Author:     felix <felix@y.(none)>
AuthorDate: Sat Apr 3 19:47:47 2010 +0200
Commit:     felix <felix@y.(none)>
CommitDate: Sat Apr 3 19:47:47 2010 +0200

    warning if non-else clauses follows else clause in cond or case

diff --git a/expand.scm b/expand.scm
index 8ba70287..774b7195 100644
--- a/expand.scm
+++ b/expand.scm
@@ -1131,20 +1131,29 @@
 	  (%=> (r '=>))
 	  (%or (r 'or))
 	  (%else (r 'else)))
-      (let expand ((clauses body))
+      (let expand ((clauses body) (else? #f))
 	(if (not (pair? clauses))
 	    '(##core#undefined)
 	    (let ((clause (car clauses))
 		  (rclauses (cdr clauses)) )
 	      (##sys#check-syntax 'cond clause '#(_ 1))
-	      (cond ((c %else (car clause)) `(##core#begin ,@(cdr clause)))
-		    ((null? (cdr clause)) `(,%or ,(car clause) ,(expand rclauses)))
+	      (cond ((c %else (car clause))
+		     (expand rclauses #t)
+		     `(##core#begin ,@(cdr clause)))
+		    (else?
+		     (##sys#warn 
+		      "non-`else' clause following `else' clause in `cond'"
+		      (##sys#strip-syntax clause))
+		     (expand rclauses #t)
+		     '(##core#begin))
+		    ((null? (cdr clause)) 
+		     `(,%or ,(car clause) ,(expand rclauses #f)))
 		    ((c %=> (cadr clause))
 		     (let ((tmp (r 'tmp)))
 		       `(##core#let ((,tmp ,(car clause)))
 				    (##core#if ,tmp
 					       (,(caddr clause) ,tmp)
-					       ,(expand rclauses) ) ) ) )
+					       ,(expand rclauses #f) ) ) ) )
 		    ((and (list? clause) (fx= (length clause) 4)
 			  (c %=> (caddr clause)))
 		     (let ((tmp (r 'tmp)))
@@ -1154,10 +1163,10 @@
 			  ,tmp
 			  (if (##sys#apply ,(cadr clause) ,tmp)
 			      (##sys#apply ,(cadddr clause) ,tmp)
-			      ,(expand rclauses) ) ) ) ) )
+			      ,(expand rclauses #f) ) ) ) ) )
 		    (else `(##core#if ,(car clause) 
 				      (##core#begin ,@(cdr clause))
-				      ,(expand rclauses) ) ) ) ) ) ) ) ) ))
+				      ,(expand rclauses #f) ) ) ) ) ) ) ) ) ) )
 
 (##sys#extend-macro-environment
  'case
@@ -1171,20 +1180,28 @@
 	    (%or (r 'or))
 	    (%else (r 'else)))
 	`(let ((,tmp ,exp))
-	   ,(let expand ((clauses body))
+	   ,(let expand ((clauses body) (else? #f))
 	      (if (not (pair? clauses))
 		  '(##core#undefined)
 		  (let ((clause (car clauses))
 			(rclauses (cdr clauses)) )
 		    (##sys#check-syntax 'case clause '#(_ 1))
-		    (if (c %else (car clause))
-			`(##core#begin ,@(cdr clause))
-			`(##core#if (,%or ,@(##sys#map
-					     (lambda (x)
-					       `(##sys#eqv? ,tmp ',x))
-					     (car clause)))
-				    (##core#begin ,@(cdr clause)) 
-				    ,(expand rclauses) ) ) ) ) ) ) ) ) ) ) )
+		    (cond ((c %else (car clause))
+			   (expand rclauses #t)
+			   `(##core#begin ,@(cdr clause)) )
+			  (else?
+			   (##sys#warn 
+			    "non-`else' clause following `else' clause in `case'"
+			    (##sys#strip-syntax clause))
+			   (expand rclauses #t)
+			   '(##core#begin))
+			  (else
+			   `(##core#if (,%or ,@(##sys#map
+						(lambda (x)
+						  `(##sys#eqv? ,tmp ',x))
+						(car clause)))
+				       (##core#begin ,@(cdr clause)) 
+				       ,(expand rclauses #f) ) ) ) ) ) ) ) ) ) ) ) )
 
 (##sys#extend-macro-environment
  'let*
Trap