The following code (distilled from a much larger example), generates
compiler errors --
[File "bug5.lisp"] --
(defun spunk (a b)
(let (k m p q)
(multiple-value-setq
(k m p q)
(the (values t t t t)
(punk a b)))))
Here is the version info for CCL (running on Suse Linux) --
CMU Common Lisp 19b (19B), running on newt
With core: /usr/local/cmucl-19b/lib/cmucl/lib/lisp.core
Dumped on: Mon, 2005-06-27 20:09:58-04:00 on lorien
See <http://www.cons.org/cmucl/> for support information.
Loaded subsystems:
Python 1.1, target Intel x86
CLOS based on Gerd's PCL 2004/04/14 03:32:47
*features* =
(:GERDS-PCL :PCL-STRUCTURES :PORTABLE-COMMONLOOPS :PCL :CMU19 :CMU19B :PYTHON
:CONSERVATIVE-FLOAT-TYPE :MODULAR-ARITH :MP :X86 :LINKAGE-TABLE
:RELATIVE-PACKAGE-NAMES :LINUX :GLIBC2 :UNIX :RANDOM-MT19937 :GENCGC :PENTIUM
:I486 :HASH-NEW :HEAP-OVERFLOW-CHECK :STACK-CHECKING :COMMON :COMMON-LISP
:ANSI-CL :IEEE-FLOATING-POINT :CMU)
Running under slime, you compile the file thus:
CL-USER> (compile-file "bug5.lisp")
; Python version 1.1, VM version Intel x86 on 07 DEC 05 10:04:45 pm.
; Compiling: /home/classes/cs470/lib/prog/optop/bug5.lisp 07 DEC 05 09:54:07 pm
It's running under Slime, whose sldb buffer looks like this --
Error in function LISP::ASSERT-ERROR:
The assertion (NULL (KERNEL:ARGS-TYPE-REQUIRED C::ATYPE)) failed.
[Condition of type SIMPLE-ERROR]
Restarts:
0: [CONTINUE] Retry assertion.
1: [ABORT] Abort handling SLIME request.
2: [ABORT] Return to Top-Level.
Backtrace:
0: (LISP::ASSERT-ERROR (NULL (KERNEL:ARGS-TYPE-REQUIRED C::ATYPE)) NIL NIL)
1: (C::CONTINUATION-CHECK-TYPES #<Continuation c1> NIL)
Locals:
C::ATYPE = #<VALUES-TYPE (VALUES T T T T &REST T)>
C::CONT = #<Continuation c1>
COUNT = #:INVALID
COUNT#1 = #:INVALID
C::DEST = #:INVALID
C::FORCE-HAIRY = NIL
C::TYPES = #:INVALID
C::TYPES#1 = #:INVALID
[No catch-tags]
2: (C::GENERATE-TYPE-CHECKS #<C:COMPONENT 58B3C90D NAME= "DEFUN SPUNK">)
3: (C::IR1-PHASES #<C:COMPONENT 58B3C90D NAME= "DEFUN SPUNK">)
4: (C::COMPILE-COMPONENT #<C:COMPONENT 58B3C90D NAME= "DEFUN SPUNK">)
5: (C::COMPILE-TOP-LEVEL (#<LAMBDA 58B33DF5 NAME= "Top-Level Form" TYPE= #
WHERE-FROM= :DEFINED VARS= NIL>) NIL)
6: (C::CONVERT-AND-MAYBE-COMPILE #1=(C::%DEFUN (QUOTE SPUNK) (FUNCTION #) NIL
(QUOTE #)) (#1# C::ORIGINAL-SOURCE-START 0 0))
7: (C::PROCESS-FORM (C::%DEFUN (QUOTE SPUNK) (FUNCTION #) NIL (QUOTE #))
(C::ORIGINAL-SOURCE-START 0 0))
8: (C::PROCESS-FORM (DEFUN SPUNK (A B) (LET # #)) (C::ORIGINAL-SOURCE-START 0
0))
9: (C::PROCESS-FORM 2 (DEFUN SPUNK (A B) (LET # #)) (C::ORIGINAL-SOURCE-START
0 0))[:EXTERNAL]
10: (C::PROCESS-SOURCES #<Source-Info>)
11: ((FLET #:G0 C::SUB-COMPILE-FILE))
12: (C::SUB-COMPILE-FILE #<Source-Info> NIL)
13: (C::SUB-COMPILE-FILE 1 #<Source-Info> NIL)[:EXTERNAL]
14: (COMPILE-FILE "bug5.lisp" :OUTPUT-FILE T :ERROR-FILE ...)
15: (SWANK::EVAL-REGION "(compile-file \"bug5.lisp\")
" T)
16: ("DEFSLIMEFUN LISTENER-EVAL")
17: (SWANK::CALL-WITH-BUFFER-SYNTAX #<Closure Over Function "DEFSLIMEFUN
LISTENER-EVAL" {58B235B1}>)
18: ("DEFUN EVAL-FOR-EMACS")
19: ((METHOD SWANK-BACKEND:CALL-WITH-DEBUGGER-HOOK NIL (T T)) #<#1=unused-arg>
#<#1#> #<Function SWANK:SWANK-DEBUGGER-HOOK {5874B2D1}> #<Closure Over Function
"DEFUN EVAL-FOR-EMACS" {58B234D9}>)
20: ("DEFUN HANDLE-REQUEST")
21: ("DEFUN CALL-WITH-CONNECTION")
22: (SWANK::CALL-WITH-REDIRECTED-IO #<SWANK::CONNECTION {58939F9D}> #<Closure
Over Function "DEFUN CALL-WITH-CONNECTION" {58B23261}>)
23: (SWANK::CALL-WITH-CONNECTION #<SWANK::CONNECTION {58939F9D}> #<Function
"DEFUN HANDLE-REQUEST" {585E62B1}>)
24: (SWANK::HANDLE-REQUEST #<SWANK::CONNECTION {58939F9D}>)
25: (SWANK::PROCESS-AVAILABLE-INPUT #<Stream for descriptor 8> #<Closure Over
Function "DEFUN INSTALL-FD-HANDLER" {58B23251}>)
26: ((FLET SWANK::HANDLER SWANK::INSTALL-FD-HANDLER))
27: (LISP::SUB-SERVE-EVENT 1 0)
28: (SYSTEM:WAIT-UNTIL-FD-USABLE 0 :INPUT NIL)
29: (LISP::DO-INPUT #<Stream for Standard Input>)
30: (LISP::INPUT-CHARACTER #<Stream for Standard Input> NIL (LISP::*EOF*))
31: (LISP::SYNONYM-IN #<Synonym Stream to SYSTEM:*STDIN*> NIL (LISP::*EOF*))
32: (LISP::TWO-WAY-IN #<Two-Way Stream, Input = #<Synonym Stream to
SYSTEM:*STDIN*>, Output = #<Synonym Stream to SYSTEM:*STDOUT*>> NIL
(LISP::*EOF*))
33: (LISP::SYNONYM-IN #<Synonym Stream to SWANK::*CURRENT-STANDARD-INPUT*> NIL
(LISP::*EOF*))
34: (READ-CHAR #<Synonym Stream to SWANK::*CURRENT-STANDARD-INPUT*> NIL
(LISP::*EOF*) NIL)
35: (LISP::READ-PRESERVING-WHITESPACE-INTERNAL #<Synonym Stream to
SWANK::*CURRENT-STANDARD-INPUT*> NIL (:EOF) T)
36: (LISP::READ-PRESERVING-WHITESPACE-INTERNAL #<Synonym Stream to
SWANK::*CURRENT-STANDARD-INPUT*> NIL (:EOF) NIL)
37: (LISP::READ-PRESERVING-WHITESPACE-INTERNAL 4 #<Synonym Stream to
SWANK::*CURRENT-STANDARD-INPUT*> NIL (:EOF) ...)[:EXTERNAL]
38: (LISP::READ-INTERNAL #<Synonym Stream to SWANK::*CURRENT-STANDARD-INPUT*>
NIL (:EOF) NIL)
39: (READ #<Synonym Stream to SWANK::*CURRENT-STANDARD-INPUT*> NIL (:EOF) NIL)
40: (LISP::%TOP-LEVEL)
41: ((LABELS LISP::RESTART-LISP SAVE-LISP))
...
Note that I've toggled the locals on the frame for
c::continuation-check-types, to show that the continuation around the form
(the (values t t t t)
(punk a b))
seems to be relevant.
The bug occurs when the file is compiled directly under CMUCL as well,
without benefit of Slime.
-- Drew McDermott