Opened 11 years ago

Closed 11 years ago

#255 closed defect (fixed)

CCL does not do sufficient compile time argument list checking

Reported by: hans Owned by: gb
Priority: major Milestone:
Component: Compiler Version:
Keywords: Cc:

Description

With normal compilation setting, CCL does not detect that the argument list supplied when invoking a function is invalid.

Under certain circumstances that I have not yet isolated, CCL creates the error message "Function call arguments don't match current definition of <function>" when it finds invalid arguments. This is better, but still very unspecific, and makes locating errors harder than one would wish for.

As in:

foo.lisp:
(defun foo (&key a) (declare (ignore a)))
(defun bar () (foo :b 2)) 

Compiled with CCL:

paracetamol 25_> ccl -n -e '(compile-file "/tmp/foo.lisp")' -e '(quit)'
paracetamol 26_> 

SBCL generates useful output:

paracetamol 26_> sbcl --no-userinit --eval '(compile-file "/tmp/foo.lisp")'  --e
val '(quit)'
This is SBCL 1.0.11, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.

; compiling file "/tmp/foo.lisp" (written 12 MAR 2008 11:50:55 AM):
; compiling (DEFUN FOO ...)
; compiling (DEFUN BAR ...)
; file: /tmp/foo.lisp
; in: DEFUN BAR
;     (FOO :B 2)
; 
; caught STYLE-WARNING:
;   :B is not a known argument keyword.
; 
; compilation unit finished
;   caught 1 STYLE-WARNING condition


; /tmp/foo.fasl written
; compilation finished in 0:00:00

as does cmucl (no suprise, but still)

netzhansa 5_> lisp -eval '(compile-file "/tmp/foo.lisp")' -eval '(quit)'

; Python version 1.1, VM version Intel x86 on 12 MAR 08 01:01:34 pm.
; Compiling: /tmp/foo.lisp 12 MAR 08 01:01:00 pm

; Converted FOO.
; Compiling DEFUN FOO: 

; 
; 
; File: /tmp/foo.lisp

; In: DEFUN BAR

;   (FOO :B 2)
; Warning: :B is not a known argument keyword.
; 
; Converted BAR.
; Compiling DEFUN BAR: 
; Byte Compiling Top-Level Form: 

; Compilation unit finished.
;   1 warning


; /tmp/foo.x86f written.
; Compilation finished in 0:00:01.
netzhansa 6_> 

As does CLISP:

paracetamol 29_> clisp -x '(compile-file "/tmp/foo.lisp")'
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.44 (2008-02-02) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2008

Type :h and hit Enter for context help.

;; Compiling file /tmp/foo.lisp ...
WARNING in BAR in line 2 :
keyword :B is not allowed for function FOO.
The only allowed keyword is :A.
[FOO was defined in line 1]
;; Wrote file /tmp/foo.fas
0 errors, 1 warning
#P"/tmp/foo.fas" ;
1 ;
1
Bye.
paracetamol 30_> 

Change History (2)

comment:1 Changed 11 years ago by gb

  • Status changed from new to assigned

This was reported by a customer and is in their bug tracking system (which apparently no one ever looks at.)

Catching cases of mismatches is much better in the working-0711 branch, and I'm in the process of moving those changes into the trunk and arranging that the conditions are reported less ... tersely.

comment:2 Changed 11 years ago by gb

  • Resolution set to fixed
  • Status changed from assigned to closed

I think that those changes were moved into the trunk/1.2 several months ago.

Note: See TracTickets for help on using tickets.