~ chicken-core (chicken-5) 0b0fcb6ef33ae342accc2de3af07f22095e93f08


commit 0b0fcb6ef33ae342accc2de3af07f22095e93f08
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Nov 15 20:28:26 2012 +0100
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Sun Nov 18 21:15:06 2012 +0100

    csc detects when intermediate files generated from source files passed on the command-line conflict with other C or object files that were explicitly given.
    
    Reported by Alan Post.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/csc.scm b/csc.scm
index 21c416e4..62eb66d8 100644
--- a/csc.scm
+++ b/csc.scm
@@ -74,7 +74,7 @@
 (define elf
   (memq (software-version) '(linux netbsd freebsd solaris openbsd)))
 
-(define (quit msg . args)
+(define (stop msg . args)
   (fprintf (current-error-port) "~a: ~?~%" CSC_PROGRAM msg args)
   (exit 64) )
 
@@ -511,7 +511,7 @@ EOF
 
   (define (check o r . n)
     (unless (>= (length r) (optional n 1))
-      (quit "not enough arguments to option `~A'" o) ) )
+      (stop "not enough arguments to option `~A'" o) ) )
 
   (define (shared-build lib)
     (set! translate-options (cons* "-feature" "chicken-compile-shared" translate-options))
@@ -543,7 +543,7 @@ EOF
 	   (cond [(null? scheme-files)
 		  (when (and (null? c-files) 
 			     (null? object-files))
-		    (quit "no source files specified") )
+		    (stop "no source files specified") )
 		  (let ((f0 (last (if (null? c-files) object-files c-files))))
 		    (unless target-filename
 		      (set! target-filename 
@@ -768,8 +768,8 @@ EOF
  				(if (null? (lset-difference char=? opts short-options))
  				    (set! rest
  				      (append (map (lambda (o) (string-append "-" (string o))) opts) rest) )
- 				    (quit "invalid option `~A'" arg) ) ) ]
-			     [else (quit "invalid option `~A'" s)] ) ]
+ 				    (stop "invalid option `~A'" arg) ) ) ]
+			     [else (stop "invalid option `~A'" s)] ) ]
 		      [(file-exists? arg)
 		       (let-values ([(dirs name ext) (decompose-pathname arg)])
 			 (cond [(not ext)
@@ -793,7 +793,7 @@ EOF
 		       (let ([f2 (string-append arg ".scm")])
 			 (if (file-exists? f2)
 			     (set! rest (cons f2 rest))
-			     (quit "file `~A' does not exist" arg) ) ) ] ) ] )
+			     (stop "file `~A' does not exist" arg) ) ) ] ) ] )
 	     (loop rest) ) ] ) ) )
 
 
@@ -802,13 +802,17 @@ EOF
 (define (run-translation)
   (for-each
    (lambda (f)
-     (let ([fc (pathname-replace-extension
-		(if (= 1 (length scheme-files))
+     (let* ((sf (if (= 1 (length scheme-files))
 		    target-filename
-		    f)
-		(cond (cpp-mode "cpp")
-		      (objc-mode "m")
-		      (else "c") ) ) ] )
+		    f))
+	    (fc (pathname-replace-extension
+		 sf
+		 (cond (cpp-mode "cpp")
+		       (objc-mode "m")
+		       (else "c") ) ) ) )
+       (when (member fc c-files)
+	 (stop "C file generated from `~a' will overwrite explicitly given source file `~a'"
+	       f fc))
        (command
 	(string-intersperse 
 	 (cons* translator (quotewrap f) 
@@ -839,7 +843,10 @@ EOF
   (let ((ofiles '()))
     (for-each
      (lambda (f)
-       (let ([fo (pathname-replace-extension f object-extension)])
+       (let ((fo (pathname-replace-extension f object-extension)))
+	 (when (member fo object-files)
+	   (stop "object file generated from `~a' will overwrite explicitly given object file `~a'"
+		 f fo))
 	 (command
 	  (string-intersperse
 	   (list (cond (cpp-mode c++-compiler)
Trap