~ chicken-core (chicken-5) 45c848d810a4b349930daa8becd99fe20702d5b8


commit 45c848d810a4b349930daa8becd99fe20702d5b8
Author:     megane <meganeka@gmail.com>
AuthorDate: Tue Nov 27 16:52:56 2018 +0200
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sat Mar 9 20:31:44 2019 +1300

    Update messages for scrutiny special cases to new pretty print format
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/scrutinizer.scm b/scrutinizer.scm
index 340b2c83..9e691cc3 100644
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -325,7 +325,7 @@
 	(d "  call: ~a, te: ~a" actualtypes typeenv)
 	(cond ((and (not pptype?) (not (match-types xptype ptype typeenv)))
 	       (r-invalid-called-procedure-type
-		loc node (resolve xptype typeenv) (resolve ptype typeenv))
+		loc node (resolve xptype typeenv) (car args) (resolve ptype typeenv))
 	       (values '* #f))
 	      (else
 	       (let-values (((atypes values-rest ok alen)
@@ -333,6 +333,7 @@
 		 (unless ok
 		   (r-proc-call-argument-count-mismatch loc node alen nargs ptype))
 		 (do ((actualtypes (cdr actualtypes) (cdr actualtypes))
+		      (anodes (cdr args) (cdr anodes))
 		      (atypes atypes (cdr atypes))
 		      (i 1 (add1 i)))
 		     ((or (null? actualtypes) (null? atypes)))
@@ -342,6 +343,7 @@
 			    typeenv)
 		     (r-proc-call-argument-type-mismatch
 		      loc node i
+		      (car anodes)
 		      (resolve (car atypes) typeenv)
 		      (resolve (car actualtypes) typeenv)
 		      ptype)))
@@ -2064,16 +2066,6 @@
 	rtypes)))
 
 (let ()
-  ;; TODO: Complain argument not available here, so we can't use the
-  ;; standard "report" defined above.  However, ##sys#enable-warnings
-  ;; and "complain" (do-scrutinize) are always true together, except
-  ;; that "complain" will be false while ##sys#enable-warnings is true
-  ;; on "no-usual-integrations", so perhaps get rid of "complain"?
-  (define (report loc msg . args)
-    (warning
-     (conc (location-name loc)
-	   (sprintf "~?" msg args))))
-
   (define (known-length-vector-index node args loc expected-argcount)
     (and-let* ((subs (node-subexpressions node))
 	       ((= (length subs) (add1 expected-argcount)))
@@ -2088,12 +2080,7 @@
       (if (and (>= val 0) (< val vector-length))
 	  val
 	  (begin
-	    (report
-	     loc "~ain procedure call to `~a', index ~a out of range \
-                   for vector of length ~a"
-	     (node-source-prefix node)
-	     ;; TODO: It might make more sense to use "pname" here
-	     (first (node-parameters (first subs))) val vector-length)
+	    (r-index-out-of-range loc node val vector-length "vector")
 	    #f))))
 
   ;; These are a bit hacky, since they mutate the node.  These special
@@ -2133,12 +2120,6 @@
 ;   list-ref, list-tail
 
 (let ()
-  ;; See comment in vector (let) just above this
-  (define (report loc msg . args)
-    (warning
-     (conc (location-name loc)
-	   (sprintf "~?" msg args))))
-
   (define (list-or-null a)
     (if (null? a) 'null `(list ,@a)))
 
@@ -2181,25 +2162,15 @@
 		     ((eq? 'quote (node-class index)))
 		     (val (first (node-parameters index)))
 		     ((fixnum? val))) ; Standard type warning otherwise
-	    ;; TODO: It might make sense to use "pname" when reporting
 	    (cond ((negative? val)
-		   ;; Negative indices should always generate a warning
-		   (report
-		    loc "~ain procedure call to `~a', index ~a is \
-                        negative, which is never valid"
-		    (node-source-prefix node)
-		    (first (node-parameters (first subs))) val)
+		   (r-index-out-of-range loc node val 'not-used "list")
 		   #f)
 		  ((split-list-type arg1 val k))
 		  ;; Warn only if it's a known proper list.  This avoids
 		  ;; false warnings due to component smashing.
 		  ((proper-list-type-length arg1) =>
 		   (lambda (length)
-		     (report
-		      loc "~ain procedure call to `~a', index ~a out of \
-                        range for proper list of length ~a"
-		      (node-source-prefix node)
-		      (first (node-parameters (first subs))) val length)
+		     (r-index-out-of-range loc node val length "list")
 		     #f))
 		  (else #f)))
 	  rtypes)))
@@ -2245,12 +2216,6 @@
 	rtypes)))
 
 (let ()
-  ;; See comment in vector (let)
-  (define (report loc msg . args)
-    (warning
-     (conc (location-name loc)
-	   (sprintf "~?" msg args))))
-
   (define (append-special-case node args loc rtypes)
     (define (potentially-proper-list? l) (match-types l 'list '()))
 
@@ -2282,17 +2247,9 @@
 		;; The final argument may be an atom or improper list
 		(unless (or (null? (cdr arg-types))
 			    (potentially-proper-list? arg1))
-		  (report
-		   loc
-		   (string-append
-		    "~ain procedure call to `~a', argument #~a is of type"
-		    "~%~%~a~%~%"
-		    "  but expected a proper list.")
-		   (node-source-prefix node)
-		   (first (node-parameters
-			   (first (node-subexpressions node))))
-		   index
-		   (type->pp-string arg1)))
+		  (r-proc-call-argument-type-mismatch
+		   loc node index 'list
+		   (car arg-types) arg1 (variable-mark 'scheme#append '##compiler#type)))
 		#f))))))
     (cond ((derive-result-type) => list)
 	  (else rtypes)))
@@ -2496,25 +2453,27 @@
 
 (define (describe-expression node)
   (define (p-expr n)
-    (sprintf (string-append "This is the expression" "~%~%" "~a")
+    (sprintf (string-append "This is the expression:" "~%~%" "~a")
 	     (pp-fragment n)))
   (define (p-node n)
-    (or (and (eq? '##core#call (node-class n))
-	     (let ((pnode (first (node-subexpressions n))))
-	       (and-let* (((eq? '##core#variable (node-class pnode)))
-			  (pname (car (node-parameters pnode)))
-			  (ptype (variable-mark pname '##compiler#type)))
-		 (sprintf (string-append
-			   "It is a call to ~a which has type"
-			   "~%~%"
-			   "~a"
-			   "~%~%"
-			   "~a")
-			  (variable-from-module pname)
-			  (type->pp-string ptype)
-			  (p-expr n)))))
-	(p-expr n)))
-  (p-node node))
+    (cond ((and (eq? '##core#call (node-class n))
+		(let ((pnode (first (node-subexpressions n))))
+		  (and-let* (((eq? '##core#variable (node-class pnode)))
+			     (pname (car (node-parameters pnode)))
+			     (ptype (variable-mark pname '##compiler#type)))
+		    (sprintf (string-append
+			      "It is a call to ~a which has this type:"
+			      "~%~%"
+			      "~a"
+			      "~%~%"
+			      "~a")
+			     (variable-from-module pname)
+			     (type->pp-string ptype)
+			     (p-expr n))))))
+	  ((eq? '##core#the/result (node-class n)) ; walk through
+	   (p-node (first (node-subexpressions n))))
+	  (else (p-expr n))))
+  (p-node (source-node-tree node)))
 
 (define (call-node-procedure-name node)
   (fragment (first (node-subexpressions node))))
@@ -2531,34 +2490,64 @@
       (let ((l (file-location))) (if l (conc " " l) ""))
       (string-add-indent
        (conc "\n" (location-name loc "") (sprintf "~?" msg args))
-       "  ")))))
+       "  ")))
+    (flush-output)))
 
 (define (report-notice reason location-node-candidates loc msg . args)
   (apply report2 reason ##sys#notice location-node-candidates loc msg args))
 
 ;;; Reports
 
-(define (r-invalid-called-procedure-type loc node xptype ptype)
-  (report2
-   "Invalid procedure"
-   warning
-   (list node)
-   loc
-   (string-append
-    "In procedure call"
-    "~%~%"
-    "~a"
-    "~%~%"
-    "The procedure has invalid type"
-    "~%~%"
-    "~a"
-    "~%~%"
-    "The expected type is"
-    "~%~%"
-    "~a")
-   (pp-fragment node)
-   (type->pp-string ptype)
-   (type->pp-string xptype)))
+(define (r-invalid-called-procedure-type loc call-node xptype p-node ptype)
+  (define (variable-node-name n)
+    (cond ((eq? '##core#the/result (node-class n))
+	   (variable-node-name (first (node-subexpressions n))))
+	  ((eq? '##core#variable (node-class n)) (car (node-parameters n)))
+	  (else #f)))
+  (if (variable-node-name p-node)
+      (report2
+       "Invalid procedure"
+       warning
+       (list p-node call-node)
+       loc
+       (string-append
+	"In procedure call:"
+	"~%~%"
+	"~a"
+	"~%~%"
+	"Variable ~a is not a procedure."
+	"~%~%"
+	"It has this type:"
+	"~%~%"
+	"~a")
+       (pp-fragment call-node)
+       (variable-from-module (variable-node-name p-node))
+       (type->pp-string ptype))
+      (report2
+       "Invalid procedure"
+       warning
+       (list p-node call-node)
+       loc
+       (string-append
+	"In procedure call:"
+	"~%~%"
+	"~a"
+	"~%~%"
+	"The procedure expression does not appear to be a callable."
+	"~%~%"
+	"~a"
+	"~%~%"
+	"The expected type is:"
+	"~%~%"
+	"~a"
+	"~%~%"
+	"The actual type is:"
+	"~%~%"
+	"~a")
+       (pp-fragment call-node)
+       (describe-expression p-node)
+       (type->pp-string xptype)
+       (type->pp-string ptype))))
 
 (define (r-proc-call-argument-count-mismatch loc node exp-count argc ptype)
   (define pname (call-node-procedure-name node))
@@ -2568,13 +2557,13 @@
    (list node)
    loc
    (string-append
-    "In procedure call"
+    "In procedure call:"
     "~%~%"
     "~a"
     "~%~%"
     "Procedure `~a' is called with ~a argument~a but ~a argument~a ~a expected."
     "~%~%"
-    "Procedure ~a has type"
+    "Procedure ~a has this type:"
     "~%~%"
     "~a")
    (pp-fragment node)
@@ -2585,7 +2574,7 @@
    (variable-from-module pname)
    (type->pp-string ptype)))
 
-(define (r-proc-call-argument-type-mismatch loc node i xptype atype ptype)
+(define (r-proc-call-argument-type-mismatch loc node i arg-node xptype atype ptype)
   (define pname (call-node-procedure-name node))
   (report2
    "Invalid argument"
@@ -2593,19 +2582,21 @@
    (list node)
    loc
    (string-append
-    "In procedure call"
+    "In procedure call:"
     "~%~%"
     "~a"
     "~%~%"
-    "Argument #~a to procedure `~a' has invalid type"
+    "Argument #~a to procedure `~a' has an invalid type:"
     "~%~%"
     "~a"
     "~%~%"
-    "The expected type is"
+    "The expected type is:"
+    "~%~%"
+    "~a"
     "~%~%"
     "~a"
     "~%~%"
-    "Procedure ~a has type"
+    "Procedure ~a has this type:"
     "~%~%"
     "~a")
    (pp-fragment node)
@@ -2613,6 +2604,7 @@
    (strip-namespace pname)
    (type->pp-string atype)
    (type->pp-string xptype)
+   (describe-expression arg-node)
    (variable-from-module pname)
    (type->pp-string ptype)))
 
@@ -2625,7 +2617,7 @@
      (list arg-node call-node)
      loc
      (string-append
-      "In procedure call"
+      "In procedure call:"
       "~%~%"
       "~a"
       "~%~%"
@@ -2643,6 +2635,30 @@
       (p "Too many argument values"
 	 (sprintf "returns ~a values but 1 is expected." (length atype)))))
 
+(define (r-index-out-of-range loc node idx obj-length obj-name)
+  ;; Negative indices should always generate a warning
+  (define pname (call-node-procedure-name node))
+  (report2
+   (if (negative? idx)
+       (sprintf "Negative ~a index" obj-name)
+       (sprintf "~a~a index out of range"
+		(char-upcase (string-ref obj-name 0))
+		(substring obj-name 1)))
+   warning
+   (list node)
+   loc
+   (string-append
+    "In procedure call:"
+    "~%~%"
+    "~a"
+    "~%~%"
+    "Procedure ~a is called with ~a")
+   (pp-fragment node)
+   (variable-from-module pname)
+   (if (negative? idx)
+       (sprintf "a negative index ~a." idx)
+       (sprintf "index `~a' for a ~a of length `~a'." idx obj-name obj-length))))
+
 (define (r-pred-call-always-true loc node pred-type atype)
   (define pname (call-node-procedure-name node))
   (report-notice
@@ -2650,17 +2666,17 @@
    (list node)
    loc
    (string-append
-    "In procedure call"
+    "In procedure call:"
     "~%~%"
     "~a"
     "~%~%"
     "The predicate will always return true."
     "~%~%"
-    "Procedure ~a is a predicate for"
+    "Procedure ~a is a predicate for:"
     "~%~%"
     "~a"
     "~%~%"
-    "The given argument has type"
+    "The given argument has this type:"
     "~%~%"
     "~a")
    (pp-fragment node)
@@ -2675,17 +2691,17 @@
    (list node)
    loc
    (string-append
-    "In procedure call"
+    "In procedure call:"
     "~%~%"
     "~a"
     "~%~%"
     "The predicate will always return false."
     "~%~%"
-    "Procedure ~a is a predicate for"
+    "Procedure ~a is a predicate for:"
     "~%~%"
     "~a"
     "~%~%"
-    "The given argument has type"
+    "The given argument has this type:"
     "~%~%"
     "~a")
    (pp-fragment node)
@@ -2699,11 +2715,11 @@
    (list test-node if-node)
    loc
    (string-append
-    "In conditional expression"
+    "In conditional expression:"
     "~%~%"
     "~a"
     "~%~%"
-    "Test condition has always true value of type"
+    "Test condition has always true value of type:"
     "~%~%"
     "~a")
    (pp-fragment if-node)
@@ -2715,7 +2731,7 @@
    (list test-node if-node)
    loc
    (string-append
-    "In conditional expression"
+    "In conditional expression:"
     "~%~%"
     "~a"
     "~%~%"
@@ -2730,11 +2746,11 @@
    (list node)
    loc
    (string-append
-    "In expression"
+    "In expression:"
     "~%~%"
     "~a"
     "~%~%"
-    "Expression returns 0 values but is declared to return"
+    "Expression returns 0 values but is declared to return:"
     "~%~%"
     "~a")
    (pp-fragment node)
@@ -2747,42 +2763,42 @@
    (list node)
    loc
    (string-append
-    "In expression"
+    "In expression:"
     "~%~%"
     "~a"
     "~%~%"
     "Expression returns too many values."
     "~%~%"
-    "The expression returns ~a values but is declared to return"
+    "The expression returns ~a values but is declared to return:"
     "~%~%"
     "~a")
    (pp-fragment node)
    (length rtypes)
    (type->pp-string the-type)))
 
-(define (r-type-mismatch-in-the loc node first-rtype the-type)
+(define (r-type-mismatch-in-the loc node atype the-type)
   (report2
    "Type mismatch"
    warning
    (list node)
    loc
    (string-append
-    "In expression"
+    "In expression:"
     "~%~%"
     "~a"
     "~%~%"
     "Expression's declared and actual types do not match."
     "~%~%"
-    "The actual type is"
+    "The declared type is:"
     "~%~%"
     "~a"
     "~%~%"
-    "The expression's declared type is"
+    "The actual type is:"
     "~%~%"
     "~a")
    (pp-fragment node)
-   (type->pp-string first-rtype)
-   (type->pp-string the-type)))
+   (type->pp-string the-type)
+   (type->pp-string atype)))
 
 (define (fail-compiler-typecase loc node atype ct-types)
   (define (pp-type t) (string-add-indent (type->pp-string t) "  "))
@@ -2791,17 +2807,17 @@
     "No typecase match"
     "~a"
     "~a"
-    "In `compiler-typecase' expression"
+    "In `compiler-typecase' expression:"
     "~%~%"
     "  ~a"
     "~%~%"
     "  Tested expression does not match any case."
     "~%~%"
-    "  The expression has type"
+    "  The expression has this type:"
     "~%~%"
     "~a"
     "~%~%"
-    "  The specified type cases are these"
+    "  The specified type cases are these:"
     "~%~%"
     "~a")
    (if (string=? "" (node-source-prefix node))
@@ -2819,17 +2835,17 @@
    (list a-node node)
    loc
    (string-append
-    "In conditional expression"
+    "In conditional expression:"
     "~%~%"
     "~a"
     "~%~%"
     "The branches have different numbers of values."
     "~%~%"
-    "The true branch returns ~a value~a"
+    "The true branch returns ~a value~a:"
     "~%~%"
     "~a"
     "~%~%"
-    "The false branch returns ~a value~a"
+    "The false branch returns ~a value~a:"
     "~%~%"
     "~a")
    (pp-fragment node)
@@ -2845,23 +2861,25 @@
    (list node value-node)
    loc
    (string-append
-    "In assignment"
+    "In assignment:"
     "~%~%"
     "~a"
     "~%~%"
     "Variable `~a' is assigned invalid value."
     "~%~%"
-    "The assigned value has type"
+    "The assigned value has this type:"
     "~%~%"
     "~a"
     "~%~%"
-    "The declared type of `~a' is"
+    "The declared type of ~a is:"
     "~%~%"
     "~a")
    (pp-fragment node)
-   var
+   (strip-namespace var)
    (type->pp-string atype)
-   var
+   (variable-from-module
+    (let ((n (real-name var)))
+      (if (symbol? n) n (string->symbol n))))
    (type->pp-string xptype)))
 
 (define (r-deprecated-identifier loc node id #!optional suggestion)
@@ -2871,7 +2889,7 @@
    (list node)
    loc
    (string-append
-    "In expression"
+    "In expression:"
     "~%~%"
     "~a"
     "~%~%"
diff --git a/tests/scrutinizer-message-format.expected b/tests/scrutinizer-message-format.expected
index 8384c6d4..c3b34600 100644
--- a/tests/scrutinizer-message-format.expected
+++ b/tests/scrutinizer-message-format.expected
@@ -7,63 +7,67 @@ Warning: literal in operator position: (1 2)
 
 Warning: Wrong number of arguments (test-scrutinizer-message-format.scm:XXX) 
   In `r-proc-call-argument-count-mismatch', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#cons '())
 
   Procedure `cons' is called with 1 argument but 2 arguments are expected.
 
-  Procedure `cons' from module `scheme' has type
+  Procedure `cons' from module `scheme' has this type:
 
     ('aXXX 'bXXX --> (pair 'aXXX 'bXXX))
 
 Warning: Invalid argument (test-scrutinizer-message-format.scm:XXX) 
   In `r-proc-call-argument-type-mismatch', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#length 'symbol)
 
-  Argument #1 to procedure `length' has invalid type
+  Argument #1 to procedure `length' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     list
 
-  Procedure `length' from module `scheme' has type
+  This is the expression:
+
+    'symbol
+
+  Procedure `length' from module `scheme' has this type:
 
     (list -> fixnum)
 
 Warning: Too many argument values (test-scrutinizer-message-format.scm:XXX) 
   In `r-proc-call-argument-value-count', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list (chicken.time#cpu-time))
 
   Argument #1 to procedure `list' returns 2 values but 1 is expected.
 
-  It is a call to `cpu-time' from module `chicken.time' which has type
+  It is a call to `cpu-time' from module `chicken.time' which has this type:
 
     (-> fixnum fixnum)
 
-  This is the expression
+  This is the expression:
 
     (chicken.time#cpu-time)
 
 Warning: Not enough argument values (test-scrutinizer-message-format.scm:XXX) 
   In `r-proc-call-argument-value-count', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#vector (scheme#values))
 
   Argument #1 to procedure `vector' does not return any values.
 
-  It is a call to `values' from module `scheme' which has type
+  It is a call to `values' from module `scheme' which has this type:
 
     (procedure (#!rest values) . *)
 
-  This is the expression
+  This is the expression:
 
     (scheme#values)
 
@@ -72,79 +76,85 @@ Warning: In `r-proc-call-argument-value-count', a toplevel procedure
 
 Warning: Branch values mismatch (test-scrutinizer-message-format.scm:XXX) 
   In `r-cond-branch-value-count-mismatch', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if (the * 1) 1 (scheme#values 1 2))
 
   The branches have different numbers of values.
 
-  The true branch returns 1 value
+  The true branch returns 1 value:
 
     1
 
-  The false branch returns 2 values
+  The false branch returns 2 values:
 
     (scheme#values 1 2)
 
 Warning: Invalid procedure
   In `r-invalid-called-procedure-type', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (1 2)
 
-  The procedure has invalid type
+  The procedure expression does not appear to be a callable.
 
-    fixnum
+  This is the expression:
 
-  The expected type is
+    1
+
+  The expected type is:
 
     (* -> *)
 
+  The actual type is:
+
+    fixnum
+
 Note: Predicate is always true (test-scrutinizer-message-format.scm:XXX) 
   In `r-pred-call-always-true', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list? '())
 
   The predicate will always return true.
 
-  Procedure `list?' from module `scheme' is a predicate for
+  Procedure `list?' from module `scheme' is a predicate for:
 
     list
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always false (test-scrutinizer-message-format.scm:XXX) 
   In `r-pred-call-always-false', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#symbol? 1)
 
   The predicate will always return false.
 
-  Procedure `symbol?' from module `scheme' is a predicate for
+  Procedure `symbol?' from module `scheme' is a predicate for:
 
     symbol
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Test is always true
   In `r-cond-test-always-true', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if 'symbol 1 (##core#undefined))
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     symbol
 
 Note: Test is always false
   In `r-cond-test-always-false', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if #f 1 (##core#undefined))
 
@@ -152,77 +162,77 @@ Note: Test is always false
 
 Warning: Type mismatch
   In `r-type-mismatch-in-the', a toplevel procedure
-  In expression
+  In expression:
 
     1
 
   Expression's declared and actual types do not match.
 
-  The actual type is
+  The declared type is:
 
-    fixnum
+    symbol
 
-  The expression's declared type is
+  The actual type is:
 
-    symbol
+    fixnum
 
 Warning: Not enough values (test-scrutinizer-message-format.scm:XXX) 
   In `r-zero-values-for-the', a toplevel procedure
-  In expression
+  In expression:
 
     (scheme#values)
 
-  Expression returns 0 values but is declared to return
+  Expression returns 0 values but is declared to return:
 
     symbol
 
 Warning: Too many values (test-scrutinizer-message-format.scm:XXX) 
   In `r-too-many-values-for-the', a toplevel procedure
-  In expression
+  In expression:
 
     (scheme#values 1 2)
 
   Expression returns too many values.
 
-  The expression returns 2 values but is declared to return
+  The expression returns 2 values but is declared to return:
 
     symbol
 
 Warning: Type mismatch (test-scrutinizer-message-format.scm:XXX) 
   In `r-too-many-values-for-the', a toplevel procedure
-  In expression
+  In expression:
 
     (scheme#values 1 2)
 
   Expression's declared and actual types do not match.
 
-  The actual type is
+  The declared type is:
 
-    fixnum
+    symbol
 
-  The expression's declared type is
+  The actual type is:
 
-    symbol
+    fixnum
 
 Warning: Invalid assignment
   In `r-toplevel-var-assignment-type-mismatch', a toplevel procedure
-  In assignment
+  In assignment:
 
     (set! foo 1)
 
   Variable `foo' is assigned invalid value.
 
-  The assigned value has type
+  The assigned value has this type:
 
     fixnum
 
-  The declared type of `foo' is
+  The declared type of `foo' is:
 
     boolean
 
 Warning: Deprecated identifier `deprecated-foo'
   In `r-deprecated-identifier', a toplevel procedure
-  In expression
+  In expression:
 
     deprecated-foo
 
@@ -230,7 +240,7 @@ Warning: Deprecated identifier `deprecated-foo'
 
 Warning: Deprecated identifier `deprecated-foo2'
   In `r-deprecated-identifier', a toplevel procedure
-  In expression
+  In expression:
 
     deprecated-foo2
 
@@ -240,28 +250,43 @@ Warning: Deprecated identifier `deprecated-foo2'
 
 Warning: Invalid assignment
   At toplevel
-  In assignment
+  In assignment:
 
     (set! foo 1)
 
   Variable `foo' is assigned invalid value.
 
-  The assigned value has type
+  The assigned value has this type:
 
     fixnum
 
-  The declared type of `foo' is
+  The declared type of `foo' is:
 
     boolean
 
-Warning: In `list-ref-negative-index', a toplevel procedure
-  (test-scrutinizer-message-format.scm:XXX) in procedure call to `scheme#list-ref', index -1 is negative, which is never valid
+Warning: Negative list index (test-scrutinizer-message-format.scm:XXX) 
+  In `list-ref-negative-index', a toplevel procedure
+  In procedure call:
+
+    (scheme#list-ref '() -1)
+
+  Procedure `list-ref' from module `scheme' is called with a negative index -1.
+
+Warning: List index out of range (test-scrutinizer-message-format.scm:XXX) 
+  In `list-ref-out-of-range', a toplevel procedure
+  In procedure call:
 
-Warning: In `list-ref-out-of-range', a toplevel procedure
-  (test-scrutinizer-message-format.scm:XXX) in procedure call to `scheme#list-ref', index 1 out of range for proper list of length 0
+    (scheme#list-ref '() 1)
 
-Warning: In `vector-ref-out-of-range', a toplevel procedure
-  (test-scrutinizer-message-format.scm:XXX) in procedure call to `scheme#vector-ref', index -1 out of range for vector of length 0
+  Procedure `list-ref' from module `scheme' is called with index `1' for a list of length `0'.
+
+Warning: Negative vector index (test-scrutinizer-message-format.scm:XXX) 
+  In `vector-ref-out-of-range', a toplevel procedure
+  In procedure call:
+
+    (scheme#vector-ref (scheme#vector) -1)
+
+  Procedure `vector-ref' from module `scheme' is called with a negative index -1.
 
 Warning: In `zero-values-for-let', a toplevel procedure
   expected a single result in `let' binding of `a', but received zero results
@@ -277,11 +302,11 @@ Warning: In `multiple-values-for-conditional', a toplevel procedure
 
 Note: Test is always true (test-scrutinizer-message-format.scm:XXX) 
   In `multiple-values-for-conditional', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#values 1 2) 1 (##core#undefined))
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     fixnum
 
@@ -292,13 +317,13 @@ Warning: Wrong number of arguments (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-proc-call-argument-count-mismatch', a local procedure
-  In procedure call
+  In procedure call:
 
     (scheme#cons '())
 
   Procedure `cons' is called with 1 argument but 2 arguments are expected.
 
-  Procedure `cons' from module `scheme' has type
+  Procedure `cons' from module `scheme' has this type:
 
     ('aXXX 'bXXX --> (pair 'aXXX 'bXXX))
 
@@ -306,19 +331,23 @@ Warning: Invalid argument (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-proc-call-argument-type-mismatch', a local procedure
-  In procedure call
+  In procedure call:
 
     (scheme#length 'symbol)
 
-  Argument #1 to procedure `length' has invalid type
+  Argument #1 to procedure `length' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     list
 
-  Procedure `length' from module `scheme' has type
+  This is the expression:
+
+    'symbol
+
+  Procedure `length' from module `scheme' has this type:
 
     (list -> fixnum)
 
@@ -326,17 +355,17 @@ Warning: Too many argument values (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-proc-call-argument-value-count', a local procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list (chicken.time#cpu-time))
 
   Argument #1 to procedure `list' returns 2 values but 1 is expected.
 
-  It is a call to `cpu-time' from module `chicken.time' which has type
+  It is a call to `cpu-time' from module `chicken.time' which has this type:
 
     (-> fixnum fixnum)
 
-  This is the expression
+  This is the expression:
 
     (chicken.time#cpu-time)
 
@@ -344,17 +373,17 @@ Warning: Not enough argument values (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-proc-call-argument-value-count', a local procedure
-  In procedure call
+  In procedure call:
 
     (scheme#vector (scheme#values))
 
   Argument #1 to procedure `vector' does not return any values.
 
-  It is a call to `values' from module `scheme' which has type
+  It is a call to `values' from module `scheme' which has this type:
 
     (procedure (#!rest values) . *)
 
-  This is the expression
+  This is the expression:
 
     (scheme#values)
 
@@ -367,17 +396,17 @@ Warning: Branch values mismatch (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-cond-branch-value-count-mismatch', a local procedure
-  In conditional expression
+  In conditional expression:
 
     (if (the * 1) 1 (chicken.time#cpu-time))
 
   The branches have different numbers of values.
 
-  The true branch returns 1 value
+  The true branch returns 1 value:
 
     1
 
-  The false branch returns 2 values
+  The false branch returns 2 values:
 
     (chicken.time#cpu-time)
 
@@ -385,33 +414,39 @@ Warning: Invalid procedure
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-invalid-called-procedure-type', a local procedure
-  In procedure call
+  In procedure call:
 
     (1 2)
 
-  The procedure has invalid type
+  The procedure expression does not appear to be a callable.
 
-    fixnum
+  This is the expression:
 
-  The expected type is
+    1
+
+  The expected type is:
 
     (* -> *)
 
+  The actual type is:
+
+    fixnum
+
 Note: Predicate is always true (test-scrutinizer-message-format.scm:XXX) 
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-pred-call-always-true', a local procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list? '())
 
   The predicate will always return true.
 
-  Procedure `list?' from module `scheme' is a predicate for
+  Procedure `list?' from module `scheme' is a predicate for:
 
     list
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
@@ -419,17 +454,17 @@ Note: Predicate is always false (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-pred-call-always-false', a local procedure
-  In procedure call
+  In procedure call:
 
     (scheme#symbol? 1)
 
   The predicate will always return false.
 
-  Procedure `symbol?' from module `scheme' is a predicate for
+  Procedure `symbol?' from module `scheme' is a predicate for:
 
     symbol
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
@@ -437,11 +472,11 @@ Note: Test is always true (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-cond-test-always-true', a local procedure
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#length '()) 1 (##core#undefined))
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     fixnum
 
@@ -449,7 +484,7 @@ Note: Test is always false
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-cond-test-always-false', a local procedure
-  In conditional expression
+  In conditional expression:
 
     (if #f 1 (##core#undefined))
 
@@ -459,29 +494,29 @@ Warning: Type mismatch
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-type-mismatch-in-the', a local procedure
-  In expression
+  In expression:
 
     1
 
   Expression's declared and actual types do not match.
 
-  The actual type is
+  The declared type is:
 
-    fixnum
+    symbol
 
-  The expression's declared type is
+  The actual type is:
 
-    symbol
+    fixnum
 
 Warning: Not enough values (test-scrutinizer-message-format.scm:XXX) 
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-zero-values-for-the', a local procedure
-  In expression
+  In expression:
 
     (scheme#values)
 
-  Expression returns 0 values but is declared to return
+  Expression returns 0 values but is declared to return:
 
     symbol
 
@@ -489,13 +524,13 @@ Warning: Too many values (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-too-many-values-for-the', a local procedure
-  In expression
+  In expression:
 
     (scheme#values 1 2)
 
   Expression returns too many values.
 
-  The expression returns 2 values but is declared to return
+  The expression returns 2 values but is declared to return:
 
     symbol
 
@@ -503,35 +538,35 @@ Warning: Type mismatch (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-too-many-values-for-the', a local procedure
-  In expression
+  In expression:
 
     (scheme#values 1 2)
 
   Expression's declared and actual types do not match.
 
-  The actual type is
+  The declared type is:
 
-    fixnum
+    symbol
 
-  The expression's declared type is
+  The actual type is:
 
-    symbol
+    fixnum
 
 Warning: Invalid assignment
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-toplevel-var-assignment-type-mismatch', a local procedure
-  In assignment
+  In assignment:
 
     (set! m#foo2 1)
 
-  Variable `m#foo2' is assigned invalid value.
+  Variable `foo2' is assigned invalid value.
 
-  The assigned value has type
+  The assigned value has this type:
 
     fixnum
 
-  The declared type of `m#foo2' is
+  The declared type of `foo2' from module `m' is:
 
     boolean
 
@@ -539,7 +574,7 @@ Warning: Deprecated identifier `deprecated-foo'
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-deprecated-identifier', a local procedure
-  In expression
+  In expression:
 
     m#deprecated-foo
 
@@ -549,7 +584,7 @@ Warning: Deprecated identifier `deprecated-foo2'
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `r-deprecated-identifier', a local procedure
-  In expression
+  In expression:
 
     m#deprecated-foo2
 
@@ -557,20 +592,35 @@ Warning: Deprecated identifier `deprecated-foo2'
 
   The suggested alternative is `foo'.
 
-Warning: In `m#toplevel-foo', a toplevel procedure
+Warning: Negative list index (test-scrutinizer-message-format.scm:XXX) 
+  In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `list-ref-negative-index', a local procedure
-  (test-scrutinizer-message-format.scm:XXX) in procedure call to `scheme#list-ref', index -1 is negative, which is never valid
+  In procedure call:
 
-Warning: In `m#toplevel-foo', a toplevel procedure
+    (scheme#list-ref '() -1)
+
+  Procedure `list-ref' from module `scheme' is called with a negative index -1.
+
+Warning: List index out of range (test-scrutinizer-message-format.scm:XXX) 
+  In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `list-ref-out-of-range', a local procedure
-  (test-scrutinizer-message-format.scm:XXX) in procedure call to `scheme#list-ref', index 1 out of range for proper list of length 0
+  In procedure call:
 
-Warning: In `m#toplevel-foo', a toplevel procedure
+    (scheme#list-ref '() 1)
+
+  Procedure `list-ref' from module `scheme' is called with index `1' for a list of length `0'.
+
+Warning: Negative vector index (test-scrutinizer-message-format.scm:XXX) 
+  In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `vector-ref-out-of-range', a local procedure
-  (test-scrutinizer-message-format.scm:XXX) in procedure call to `scheme#vector-ref', index -1 out of range for vector of length 0
+  In procedure call:
+
+    (scheme#vector-ref (scheme#vector) -1)
+
+  Procedure `vector-ref' from module `scheme' is called with a negative index -1.
 
 Warning: In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
@@ -596,11 +646,11 @@ Note: Test is always true (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `multiple-values-for-conditional', a local procedure
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#values 1 2) 1 (##core#undefined))
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     fixnum
 
@@ -613,17 +663,17 @@ Error: No typecase match (test-scrutinizer-message-format.scm:XXX)
   In `m#toplevel-foo', a toplevel procedure
   In `local-bar', a local procedure
   In `fail-compiler-typecase', a local procedure
-  In `compiler-typecase' expression
+  In `compiler-typecase' expression:
 
     (compiler-typecase gXXX (symbol 1) (list 2) (else (##core#undefined)))
 
   Tested expression does not match any case.
 
-  The expression has type
+  The expression has this type:
 
     fixnum
 
-  The specified type cases are these
+  The specified type cases are these:
 
     symbol
 
diff --git a/tests/scrutiny-2.expected b/tests/scrutiny-2.expected
index 0c126bf8..78500cdc 100644
--- a/tests/scrutiny-2.expected
+++ b/tests/scrutiny-2.expected
@@ -3,352 +3,352 @@
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#pair? p)
 
   The predicate will always return true.
 
-  Procedure `pair?' from module `scheme' is a predicate for
+  Procedure `pair?' from module `scheme' is a predicate for:
 
     pair
 
-  The given argument has type
+  The given argument has this type:
 
     pair
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#pair? l)
 
   The predicate will always return false.
 
-  Procedure `pair?' from module `scheme' is a predicate for
+  Procedure `pair?' from module `scheme' is a predicate for:
 
     pair
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#pair? n)
 
   The predicate will always return false.
 
-  Procedure `pair?' from module `scheme' is a predicate for
+  Procedure `pair?' from module `scheme' is a predicate for:
 
     pair
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#pair? i)
 
   The predicate will always return false.
 
-  Procedure `pair?' from module `scheme' is a predicate for
+  Procedure `pair?' from module `scheme' is a predicate for:
 
     pair
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#pair? f)
 
   The predicate will always return false.
 
-  Procedure `pair?' from module `scheme' is a predicate for
+  Procedure `pair?' from module `scheme' is a predicate for:
 
     pair
 
-  The given argument has type
+  The given argument has this type:
 
     float
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#list? l)
 
   The predicate will always return true.
 
-  Procedure `list?' from module `scheme' is a predicate for
+  Procedure `list?' from module `scheme' is a predicate for:
 
     list
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#list? n)
 
   The predicate will always return true.
 
-  Procedure `list?' from module `scheme' is a predicate for
+  Procedure `list?' from module `scheme' is a predicate for:
 
     list
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#list? i)
 
   The predicate will always return false.
 
-  Procedure `list?' from module `scheme' is a predicate for
+  Procedure `list?' from module `scheme' is a predicate for:
 
     list
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#list? f)
 
   The predicate will always return false.
 
-  Procedure `list?' from module `scheme' is a predicate for
+  Procedure `list?' from module `scheme' is a predicate for:
 
     list
 
-  The given argument has type
+  The given argument has this type:
 
     float
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#null? n)
 
   The predicate will always return true.
 
-  Procedure `null?' from module `scheme' is a predicate for
+  Procedure `null?' from module `scheme' is a predicate for:
 
     null
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#null? l)
 
   The predicate will always return true.
 
-  Procedure `null?' from module `scheme' is a predicate for
+  Procedure `null?' from module `scheme' is a predicate for:
 
     null
 
-  The given argument has type
+  The given argument has this type:
 
     null
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#null? p)
 
   The predicate will always return false.
 
-  Procedure `null?' from module `scheme' is a predicate for
+  Procedure `null?' from module `scheme' is a predicate for:
 
     null
 
-  The given argument has type
+  The given argument has this type:
 
     pair
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#null? i)
 
   The predicate will always return false.
 
-  Procedure `null?' from module `scheme' is a predicate for
+  Procedure `null?' from module `scheme' is a predicate for:
 
     null
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#null? f)
 
   The predicate will always return false.
 
-  Procedure `null?' from module `scheme' is a predicate for
+  Procedure `null?' from module `scheme' is a predicate for:
 
     null
 
-  The given argument has type
+  The given argument has this type:
 
     float
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#fixnum? i)
 
   The predicate will always return true.
 
-  Procedure `fixnum?' from module `chicken.base' is a predicate for
+  Procedure `fixnum?' from module `chicken.base' is a predicate for:
 
     fixnum
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#fixnum? f)
 
   The predicate will always return false.
 
-  Procedure `fixnum?' from module `chicken.base' is a predicate for
+  Procedure `fixnum?' from module `chicken.base' is a predicate for:
 
     fixnum
 
-  The given argument has type
+  The given argument has this type:
 
     float
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#flonum? f)
 
   The predicate will always return true.
 
-  Procedure `flonum?' from module `chicken.base' is a predicate for
+  Procedure `flonum?' from module `chicken.base' is a predicate for:
 
     float
 
-  The given argument has type
+  The given argument has this type:
 
     float
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#flonum? i)
 
   The predicate will always return false.
 
-  Procedure `flonum?' from module `chicken.base' is a predicate for
+  Procedure `flonum?' from module `chicken.base' is a predicate for:
 
     float
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#number? i)
 
   The predicate will always return true.
 
-  Procedure `number?' from module `scheme' is a predicate for
+  Procedure `number?' from module `scheme' is a predicate for:
 
     number
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#number? f)
 
   The predicate will always return true.
 
-  Procedure `number?' from module `scheme' is a predicate for
+  Procedure `number?' from module `scheme' is a predicate for:
 
     number
 
-  The given argument has type
+  The given argument has this type:
 
     float
 
 Note: Predicate is always true (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#number? u)
 
   The predicate will always return true.
 
-  Procedure `number?' from module `scheme' is a predicate for
+  Procedure `number?' from module `scheme' is a predicate for:
 
     number
 
-  The given argument has type
+  The given argument has this type:
 
     number
 
 Note: Predicate is always false (scrutiny-tests-2.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#number? n)
 
   The predicate will always return false.
 
-  Procedure `number?' from module `scheme' is a predicate for
+  Procedure `number?' from module `scheme' is a predicate for:
 
     number
 
-  The given argument has type
+  The given argument has this type:
 
     null
diff --git a/tests/scrutiny.expected b/tests/scrutiny.expected
index 8210da52..bf66e77d 100644
--- a/tests/scrutiny.expected
+++ b/tests/scrutiny.expected
@@ -7,165 +7,175 @@ Note: Test is always true
   In `a', a toplevel procedure
   In `b', a local procedure
   In `c', a local procedure
-  In conditional expression
+  In conditional expression:
 
     (if x 1 2)
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     number
 
 Note: Test is always true
   In `b', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if x 1 2)
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     true
 
 Warning: Branch values mismatch (scrutiny-tests.scm:XXX) 
   In `foo', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if x (scheme#values 1 2) (scheme#values 1 2 (scheme#+ (scheme#+ ...))))
 
   The branches have different numbers of values.
 
-  The true branch returns 2 values
+  The true branch returns 2 values:
 
     (scheme#values 1 2)
 
-  The false branch returns 3 values
+  The false branch returns 3 values:
 
     (scheme#values 1 2 (scheme#+ (scheme#+ (scheme#+ ...))))
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (bar 3 'a)
 
-  Argument #2 to procedure `bar' has invalid type
+  Argument #2 to procedure `bar' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `bar' has type
+  This is the expression:
+
+    'a
+
+  Procedure `bar' has this type:
 
     (#!rest number -> number)
 
 Warning: Wrong number of arguments (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string?)
 
   Procedure `string?' is called with 0 arguments but 1 argument is expected.
 
-  Procedure `string?' from module `scheme' has type
+  Procedure `string?' from module `scheme' has this type:
 
     (* -> boolean)
 
 Warning: Too many argument values (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#print (scheme#values 1 2))
 
   Argument #1 to procedure `print' returns 2 values but 1 is expected.
 
-  It is a call to `values' from module `scheme' which has type
+  It is a call to `values' from module `scheme' which has this type:
 
     (procedure (#!rest values) . *)
 
-  This is the expression
+  This is the expression:
 
     (scheme#values 1 2)
 
 Warning: Not enough argument values (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#print (scheme#values))
 
   Argument #1 to procedure `print' does not return any values.
 
-  It is a call to `values' from module `scheme' which has type
+  It is a call to `values' from module `scheme' which has this type:
 
     (procedure (#!rest values) . *)
 
-  This is the expression
+  This is the expression:
 
     (scheme#values)
 
 Warning: Invalid procedure (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (x)
 
-  The procedure has invalid type
-
-    fixnum
+  Variable `x18' is not a procedure.
 
-  The expected type is
+  It has this type:
 
-    (-> *)
+    fixnum
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#+ 'a 'b)
 
-  Argument #1 to procedure `+' has invalid type
+  Argument #1 to procedure `+' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    'a
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#+ 'a 'b)
 
-  Argument #2 to procedure `+' has invalid type
+  Argument #2 to procedure `+' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    'b
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid assignment
   At toplevel
-  In assignment
+  In assignment:
 
     (set! scheme#car 33)
 
-  Variable `scheme#car' is assigned invalid value.
+  Variable `car' is assigned invalid value.
 
-  The assigned value has type
+  The assigned value has this type:
 
     fixnum
 
-  The declared type of `scheme#car' is
+  The declared type of `car' from module `scheme' is:
 
     ((pair 'a335 *) -> 'a335)
 
@@ -174,267 +184,309 @@ Warning: At toplevel
 
 Warning: Invalid procedure
   At toplevel
-  In procedure call
+  In procedure call:
 
     (gXXX)
 
-  The procedure has invalid type
-
-    fixnum
+  Variable `gXXX' is not a procedure.
 
-  The expected type is
+  It has this type:
 
-    (-> *)
+    fixnum
 
 Note: Test is always true
   In `foo', a toplevel procedure
-  In conditional expression
+  In conditional expression:
 
     (if bar 3 (##core#undefined))
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     (-> *)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo2', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#string-append x "abc")
 
-  Argument #1 to procedure `string-append' has invalid type
+  Argument #1 to procedure `string-append' has an invalid type:
 
     number
 
-  The expected type is
+  The expected type is:
 
     string
 
-  Procedure `string-append' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `string-append' from module `scheme' has this type:
 
     (#!rest string -> string)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (foo3 99)
 
-  Argument #1 to procedure `foo3' has invalid type
+  Argument #1 to procedure `foo3' has an invalid type:
 
     fixnum
 
-  The expected type is
+  The expected type is:
 
     string
 
-  Procedure `foo3' has type
+  This is the expression:
+
+    99
+
+  Procedure `foo3' has this type:
 
     (string -> string)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo4', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#+ x 1)
 
-  Argument #1 to procedure `+' has invalid type
+  Argument #1 to procedure `+' has an invalid type:
 
     string
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo5', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#+ x 3)
 
-  Argument #1 to procedure `+' has invalid type
+  Argument #1 to procedure `+' has an invalid type:
 
     string
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo6', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#+ x 3)
 
-  Argument #1 to procedure `+' has invalid type
+  Argument #1 to procedure `+' has an invalid type:
 
     string
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#+ x 1)
 
-  Argument #1 to procedure `+' has invalid type
+  Argument #1 to procedure `+' has an invalid type:
 
     string
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (foo9 x)
 
-  Argument #1 to procedure `foo9' has invalid type
+  Argument #1 to procedure `foo9' has an invalid type:
 
     number
 
-  The expected type is
+  The expected type is:
 
     string
 
-  Procedure `foo9' has type
+  This is the expression:
+
+    x
+
+  Procedure `foo9' has this type:
 
     (string -> symbol)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#+ x 1)
 
-  Argument #1 to procedure `+' has invalid type
+  Argument #1 to procedure `+' has an invalid type:
 
     string
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Type mismatch (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In expression
+  In expression:
 
     (scheme#substring x 0 10)
 
   Expression's declared and actual types do not match.
 
-  The actual type is
+  The declared type is:
 
-    string
+    pair
 
-  The expression's declared type is
+  The actual type is:
 
-    pair
+    string
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#string-append (the pair (scheme#substring x 0 10)))
 
-  Argument #1 to procedure `string-append' has invalid type
+  Argument #1 to procedure `string-append' has an invalid type:
 
     pair
 
-  The expected type is
+  The expected type is:
 
     string
 
-  Procedure `string-append' from module `scheme' has type
+  This is the expression:
+
+    (the pair (scheme#substring x 0 10))
+
+  Procedure `string-append' from module `scheme' has this type:
 
     (#!rest string -> string)
 
 Warning: Too many values (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In expression
+  In expression:
 
     (scheme#values 1 2)
 
   Expression returns too many values.
 
-  The expression returns 2 values but is declared to return
+  The expression returns 2 values but is declared to return:
 
     *
 
 Warning: Not enough values (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In expression
+  In expression:
 
     (scheme#values)
 
-  Expression returns 0 values but is declared to return
+  Expression returns 0 values but is declared to return:
 
     *
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo10', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#* x y)
 
-  Argument #1 to procedure `*' has invalid type
+  Argument #1 to procedure `*' has an invalid type:
 
     string
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `*' from module `scheme' has type
+  This is the expression:
+
+    x
+
+  Procedure `*' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `foo#blabla', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#+ 1 'x)
 
-  Argument #2 to procedure `+' has invalid type
+  Argument #2 to procedure `+' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `+' from module `scheme' has type
+  This is the expression:
+
+    'x
+
+  Procedure `+' from module `scheme' has this type:
 
     (#!rest number -> number)
 
 Warning: Deprecated identifier `deprecated-procedure'
   At toplevel
-  In expression
+  In expression:
 
     deprecated-procedure
 
@@ -442,7 +494,7 @@ Warning: Deprecated identifier `deprecated-procedure'
 
 Warning: Deprecated identifier `another-deprecated-procedure'
   At toplevel
-  In expression
+  In expression:
 
     another-deprecated-procedure
 
@@ -452,482 +504,641 @@ Warning: Deprecated identifier `another-deprecated-procedure'
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (apply1 scheme#+ (scheme#list 'a 2 3))
 
-  Argument #2 to procedure `apply1' has invalid type
+  Argument #2 to procedure `apply1' has an invalid type:
 
     (list symbol fixnum fixnum)
 
-  The expected type is
+  The expected type is:
 
     (list-of number)
 
-  Procedure `apply1' has type
+  It is a call to `list' from module `scheme' which has this type:
+
+    (#!rest * -> list)
+
+  This is the expression:
+
+    (scheme#list 'a 2 3)
+
+  Procedure `apply1' has this type:
 
     ((#!rest 'a143 -> 'b144) (list-of 'a143) -> 'b144)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (apply1 scheme#+ (scheme#cons 'a (scheme#cons 2 (scheme#cons 3 ...))))
 
-  Argument #2 to procedure `apply1' has invalid type
+  Argument #2 to procedure `apply1' has an invalid type:
 
     (list symbol fixnum fixnum)
 
-  The expected type is
+  The expected type is:
 
     (list-of number)
 
-  Procedure `apply1' has type
+  It is a call to `cons' from module `scheme' which has this type:
+
+    ('a331 'b332 -> (pair 'a331 'b332))
+
+  This is the expression:
+
+    (scheme#cons 'a (scheme#cons 2 (scheme#cons 3 '())))
+
+  Procedure `apply1' has this type:
 
     ((#!rest 'a143 -> 'b144) (list-of 'a143) -> 'b144)
 
 Note: Predicate is always true (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (chicken.base#fixnum? x)
 
   The predicate will always return true.
 
-  Procedure `fixnum?' from module `chicken.base' is a predicate for
+  Procedure `fixnum?' from module `chicken.base' is a predicate for:
 
     fixnum
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#symbol? x)
 
   The predicate will always return false.
 
-  Procedure `symbol?' from module `scheme' is a predicate for
+  Procedure `symbol?' from module `scheme' is a predicate for:
 
     symbol
 
-  The given argument has type
+  The given argument has this type:
 
     (or char string)
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string? x)
 
   The predicate will always return false.
 
-  Procedure `string?' from module `scheme' is a predicate for
+  Procedure `string?' from module `scheme' is a predicate for:
 
     string
 
-  The given argument has type
+  The given argument has this type:
 
     (not (or char string))
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (char-or-string? x)
 
   The predicate will always return false.
 
-  Procedure `char-or-string?' is a predicate for
+  Procedure `char-or-string?' is a predicate for:
 
     (or char string)
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#symbol? x)
 
   The predicate will always return false.
 
-  Procedure `symbol?' from module `scheme' is a predicate for
+  Procedure `symbol?' from module `scheme' is a predicate for:
 
     symbol
 
-  The given argument has type
+  The given argument has this type:
 
     (or char string)
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string? x)
 
   The predicate will always return false.
 
-  Procedure `string?' from module `scheme' is a predicate for
+  Procedure `string?' from module `scheme' is a predicate for:
 
     string
 
-  The given argument has type
+  The given argument has this type:
 
     fixnum
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#symbol? x)
 
   The predicate will always return false.
 
-  Procedure `symbol?' from module `scheme' is a predicate for
+  Procedure `symbol?' from module `scheme' is a predicate for:
 
     symbol
 
-  The given argument has type
+  The given argument has this type:
 
     char
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string? x)
 
   The predicate will always return false.
 
-  Procedure `string?' from module `scheme' is a predicate for
+  Procedure `string?' from module `scheme' is a predicate for:
 
     string
 
-  The given argument has type
+  The given argument has this type:
 
     symbol
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#symbol? x)
 
   The predicate will always return false.
 
-  Procedure `symbol?' from module `scheme' is a predicate for
+  Procedure `symbol?' from module `scheme' is a predicate for:
 
     symbol
 
-  The given argument has type
+  The given argument has this type:
 
     (or char string)
 
 Note: Predicate is always false (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string? x)
 
   The predicate will always return false.
 
-  Procedure `string?' from module `scheme' is a predicate for
+  Procedure `string?' from module `scheme' is a predicate for:
 
     string
 
-  The given argument has type
+  The given argument has this type:
 
     symbol
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (f (scheme#list))
 
-  Argument #1 to procedure `f' has invalid type
+  Argument #1 to procedure `f' has an invalid type:
 
     null
 
-  The expected type is
+  The expected type is:
 
     pair
 
-  Procedure `f' has type
+  It is a call to `list' from module `scheme' which has this type:
+
+    (#!rest * -> list)
+
+  This is the expression:
+
+    (scheme#list)
+
+  Procedure `f' has this type:
 
     (pair -> *)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (f (scheme#list 1))
 
-  Argument #1 to procedure `f' has invalid type
+  Argument #1 to procedure `f' has an invalid type:
 
     (list fixnum)
 
-  The expected type is
+  The expected type is:
 
     null
 
-  Procedure `f' has type
+  It is a call to `list' from module `scheme' which has this type:
+
+    (#!rest * -> list)
+
+  This is the expression:
+
+    (scheme#list 1)
+
+  Procedure `f' has this type:
 
     (null -> *)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (f (scheme#cons 1 2))
 
-  Argument #1 to procedure `f' has invalid type
+  Argument #1 to procedure `f' has an invalid type:
 
     (pair fixnum fixnum)
 
-  The expected type is
+  The expected type is:
 
     list
 
-  Procedure `f' has type
+  It is a call to `cons' from module `scheme' which has this type:
+
+    ('a331 'b332 -> (pair 'a331 'b332))
+
+  This is the expression:
+
+    (scheme#cons 1 2)
+
+  Procedure `f' has this type:
 
     (list -> *)
 
-Warning: In `vector-ref-warn1', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#vector-ref', index -1 out of range for vector of length 3
+Warning: Negative vector index (scrutiny-tests.scm:XXX) 
+  In `vector-ref-warn1', a toplevel procedure
+  In procedure call:
 
-Warning: In `vector-ref-warn2', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#vector-ref', index 3 out of range for vector of length 3
+    (scheme#vector-ref v1 -1)
 
-Warning: In `vector-ref-warn3', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#vector-ref', index 4 out of range for vector of length 3
+  Procedure `vector-ref' from module `scheme' is called with a negative index -1.
+
+Warning: Vector index out of range (scrutiny-tests.scm:XXX) 
+  In `vector-ref-warn2', a toplevel procedure
+  In procedure call:
+
+    (scheme#vector-ref v1 3)
+
+  Procedure `vector-ref' from module `scheme' is called with index `3' for a vector of length `3'.
+
+Warning: Vector index out of range (scrutiny-tests.scm:XXX) 
+  In `vector-ref-warn3', a toplevel procedure
+  In procedure call:
+
+    (scheme#vector-ref v1 4)
+
+  Procedure `vector-ref' from module `scheme' is called with index `4' for a vector of length `3'.
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `vector-ref-standard-warn1', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#vector-ref v1 'bad)
 
-  Argument #2 to procedure `vector-ref' has invalid type
+  Argument #2 to procedure `vector-ref' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     fixnum
 
-  Procedure `vector-ref' from module `scheme' has type
+  This is the expression:
+
+    'bad
+
+  Procedure `vector-ref' from module `scheme' has this type:
 
     ((vector-of 'a384) fixnum -> 'a384)
 
-Warning: In `vector-set!-warn1', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#vector-set!', index -1 out of range for vector of length 3
+Warning: Negative vector index (scrutiny-tests.scm:XXX) 
+  In `vector-set!-warn1', a toplevel procedure
+  In procedure call:
 
-Warning: In `vector-set!-warn2', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#vector-set!', index 3 out of range for vector of length 3
+    (scheme#vector-set! v1 -1 'whatever)
 
-Warning: In `vector-set!-warn3', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#vector-set!', index 4 out of range for vector of length 3
+  Procedure `vector-set!' from module `scheme' is called with a negative index -1.
+
+Warning: Vector index out of range (scrutiny-tests.scm:XXX) 
+  In `vector-set!-warn2', a toplevel procedure
+  In procedure call:
+
+    (scheme#vector-set! v1 3 'whatever)
+
+  Procedure `vector-set!' from module `scheme' is called with index `3' for a vector of length `3'.
+
+Warning: Vector index out of range (scrutiny-tests.scm:XXX) 
+  In `vector-set!-warn3', a toplevel procedure
+  In procedure call:
+
+    (scheme#vector-set! v1 4 'whatever)
+
+  Procedure `vector-set!' from module `scheme' is called with index `4' for a vector of length `3'.
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `vector-set!-standard-warn1', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#vector-set! v1 'bad 'whatever)
 
-  Argument #2 to procedure `vector-set!' has invalid type
+  Argument #2 to procedure `vector-set!' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     fixnum
 
-  Procedure `vector-set!' from module `scheme' has type
+  This is the expression:
+
+    'bad
+
+  Procedure `vector-set!' from module `scheme' has this type:
 
     (vector fixnum * -> undefined)
 
-Warning: In `list-ref-warn1', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#list-ref', index -1 is negative, which is never valid
+Warning: Negative list index (scrutiny-tests.scm:XXX) 
+  In `list-ref-warn1', a toplevel procedure
+  In procedure call:
+
+    (scheme#list-ref l1 -1)
+
+  Procedure `list-ref' from module `scheme' is called with a negative index -1.
+
+Warning: Negative list index (scrutiny-tests.scm:XXX) 
+  In `list-ref-warn2', a toplevel procedure
+  In procedure call:
+
+    (scheme#list-ref l2 -1)
+
+  Procedure `list-ref' from module `scheme' is called with a negative index -1.
+
+Warning: Negative list index (scrutiny-tests.scm:XXX) 
+  In `list-ref-warn3', a toplevel procedure
+  In procedure call:
+
+    (scheme#list-ref l3 -1)
 
-Warning: In `list-ref-warn2', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#list-ref', index -1 is negative, which is never valid
+  Procedure `list-ref' from module `scheme' is called with a negative index -1.
 
-Warning: In `list-ref-warn3', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#list-ref', index -1 is negative, which is never valid
+Warning: List index out of range (scrutiny-tests.scm:XXX) 
+  In `list-ref-warn4', a toplevel procedure
+  In procedure call:
 
-Warning: In `list-ref-warn4', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#list-ref', index 3 out of range for proper list of length 3
+    (scheme#list-ref l1 3)
 
-Warning: In `list-ref-warn5', a toplevel procedure
-  (scrutiny-tests.scm:XXX) in procedure call to `scheme#list-ref', index 4 out of range for proper list of length 3
+  Procedure `list-ref' from module `scheme' is called with index `3' for a list of length `3'.
+
+Warning: List index out of range (scrutiny-tests.scm:XXX) 
+  In `list-ref-warn5', a toplevel procedure
+  In procedure call:
+
+    (scheme#list-ref l1 4)
+
+  Procedure `list-ref' from module `scheme' is called with index `4' for a list of length `3'.
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-standard-warn1', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list-ref l1 'bad)
 
-  Argument #2 to procedure `list-ref' has invalid type
+  Argument #2 to procedure `list-ref' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     fixnum
 
-  Procedure `list-ref' from module `scheme' has type
+  This is the expression:
+
+    'bad
+
+  Procedure `list-ref' from module `scheme' has this type:
 
     ((list-of 'a366) fixnum -> 'a366)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-standard-warn2', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list-ref l1 'bad)
 
-  Argument #2 to procedure `list-ref' has invalid type
+  Argument #2 to procedure `list-ref' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     fixnum
 
-  Procedure `list-ref' from module `scheme' has type
+  This is the expression:
+
+    'bad
+
+  Procedure `list-ref' from module `scheme' has this type:
 
     ((list-of 'a366) fixnum -> 'a366)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-standard-warn3', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list-ref l2 'bad)
 
-  Argument #2 to procedure `list-ref' has invalid type
+  Argument #2 to procedure `list-ref' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     fixnum
 
-  Procedure `list-ref' from module `scheme' has type
+  This is the expression:
+
+    'bad
+
+  Procedure `list-ref' from module `scheme' has this type:
 
     ((list-of 'a366) fixnum -> 'a366)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-standard-warn4', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (scheme#list-ref l2 'bad)
 
-  Argument #2 to procedure `list-ref' has invalid type
+  Argument #2 to procedure `list-ref' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     fixnum
 
-  Procedure `list-ref' from module `scheme' has type
+  This is the expression:
+
+    'bad
+
+  Procedure `list-ref' from module `scheme' has this type:
 
     ((list-of 'a366) fixnum -> 'a366)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-type-warn1', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (chicken.base#add1 (scheme#list-ref l1 1))
 
-  Argument #1 to procedure `add1' has invalid type
+  Argument #1 to procedure `add1' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `add1' from module `chicken.base' has type
+  It is a call to `list-ref' from module `scheme' which has this type:
+
+    ((list-of 'a366) fixnum -> 'a366)
+
+  This is the expression:
+
+    (scheme#list-ref l1 1)
+
+  Procedure `add1' from module `chicken.base' has this type:
 
     (number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-type-warn2', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (chicken.base#add1 (scheme#list-ref l2 1))
 
-  Argument #1 to procedure `add1' has invalid type
+  Argument #1 to procedure `add1' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `add1' from module `chicken.base' has type
+  It is a call to `list-ref' from module `scheme' which has this type:
+
+    ((list-of 'a366) fixnum -> 'a366)
+
+  This is the expression:
+
+    (scheme#list-ref l2 1)
+
+  Procedure `add1' from module `chicken.base' has this type:
 
     (number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `list-ref-type-warn3', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (chicken.base#add1 (scheme#list-ref l3 1))
 
-  Argument #1 to procedure `add1' has invalid type
+  Argument #1 to procedure `add1' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `add1' from module `chicken.base' has type
+  It is a call to `list-ref' from module `scheme' which has this type:
+
+    ((list-of 'a366) fixnum -> 'a366)
+
+  This is the expression:
+
+    (scheme#list-ref l3 1)
+
+  Procedure `add1' from module `chicken.base' has this type:
 
     (number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `append-result-type-warn1', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (chicken.base#add1 (scheme#list-ref l1 1))
 
-  Argument #1 to procedure `add1' has invalid type
+  Argument #1 to procedure `add1' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `add1' from module `chicken.base' has type
+  It is a call to `list-ref' from module `scheme' which has this type:
+
+    ((list-of 'a366) fixnum -> 'a366)
+
+  This is the expression:
+
+    (scheme#list-ref l1 1)
+
+  Procedure `add1' from module `chicken.base' has this type:
 
     (number -> number)
 
 Warning: Invalid argument (scrutiny-tests.scm:XXX) 
   In `append-result-type-warn2', a toplevel procedure
-  In procedure call
+  In procedure call:
 
     (chicken.base#add1 (scheme#list-ref l3 3))
 
-  Argument #1 to procedure `add1' has invalid type
+  Argument #1 to procedure `add1' has an invalid type:
 
     symbol
 
-  The expected type is
+  The expected type is:
 
     number
 
-  Procedure `add1' from module `chicken.base' has type
+  It is a call to `list-ref' from module `scheme' which has this type:
+
+    ((list-of 'a366) fixnum -> 'a366)
+
+  This is the expression:
+
+    (scheme#list-ref l3 3)
+
+  Procedure `add1' from module `chicken.base' has this type:
 
     (number -> number)
 
diff --git a/tests/specialization.expected b/tests/specialization.expected
index 20a2e1d4..57ce4feb 100644
--- a/tests/specialization.expected
+++ b/tests/specialization.expected
@@ -3,49 +3,49 @@
 
 Note: Predicate is always true (specialization-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string? a)
 
   The predicate will always return true.
 
-  Procedure `string?' from module `scheme' is a predicate for
+  Procedure `string?' from module `scheme' is a predicate for:
 
     string
 
-  The given argument has type
+  The given argument has this type:
 
     string
 
 Note: Test is always true (specialization-tests.scm:XXX) 
   At toplevel
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#string? a) 'ok 'no)
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     true
 
 Note: Predicate is always false (specialization-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#string? a)
 
   The predicate will always return false.
 
-  Procedure `string?' from module `scheme' is a predicate for
+  Procedure `string?' from module `scheme' is a predicate for:
 
     string
 
-  The given argument has type
+  The given argument has this type:
 
     symbol
 
 Note: Test is always false (specialization-tests.scm:XXX) 
   At toplevel
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#string? a) 'ok 'no)
 
@@ -53,52 +53,52 @@ Note: Test is always false (specialization-tests.scm:XXX)
 
 Note: Predicate is always true (specialization-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#input-port? p)
 
   The predicate will always return true.
 
-  Procedure `input-port?' from module `scheme' is a predicate for
+  Procedure `input-port?' from module `scheme' is a predicate for:
 
     input-port
 
-  The given argument has type
+  The given argument has this type:
 
     input/output-port
 
 Note: Test is always true (specialization-tests.scm:XXX) 
   At toplevel
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#input-port? p) 'ok 'no)
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     true
 
 Note: Predicate is always true (specialization-tests.scm:XXX) 
   At toplevel
-  In procedure call
+  In procedure call:
 
     (scheme#output-port? p)
 
   The predicate will always return true.
 
-  Procedure `output-port?' from module `scheme' is a predicate for
+  Procedure `output-port?' from module `scheme' is a predicate for:
 
     output-port
 
-  The given argument has type
+  The given argument has this type:
 
     input/output-port
 
 Note: Test is always true (specialization-tests.scm:XXX) 
   At toplevel
-  In conditional expression
+  In conditional expression:
 
     (if (scheme#output-port? p) 'ok 'no)
 
-  Test condition has always true value of type
+  Test condition has always true value of type:
 
     true
Trap