Hi,
I was curious how far would ecl get when compiling sbcl and found that ecl seems to struggle with compiling local functions (error log bellow).
The problem is that the huge function parse-lambda-list being compiled has a flet (scan-opt/key) inside, which is compiled into a separate C function which does not see the other stuff, namely "volatile struct ecl_cclosure aux_closure;" is missing in the separate C function for flet scan-opt/key.
I could not find a reduced testcase but I guess this is a bug in the ecl compiler?
Tomas
=====
;;; Compiling src/compiler/parse-lambda-list.lisp. ;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=0 ;;; ;;; Compiling (DEFMACRO LAMBDA-LIST-KEYWORD-MASK ...). ;;; Compiling (DEFUN LL-KWDS-RESTP ...). ;;; Compiling (DEFUN LL-KWDS-KEYP ...). ;;; Compiling (DEFUN LL-KWDS-ALLOWP ...). ;;; Compiling (DEFUN PARSE-LAMBDA-LIST ...). ;;; Compiling (DEFUN PARSE-DS-LAMBDA-LIST ...). ;;; Compiling (DEFMACRO WITH-DS-LAMBDA-LIST-PARTS ...). ;;; Compiling (DEFUN PARSE-OPTIONAL-ARG-SPEC ...). ;;; Compiling (DEFUN PARSE-KEY-ARG-SPEC ...). ;;; Compiling (DEFUN META-ABSTRACTIFY-DS-LAMBDA-LIST ...). ;;; Compiling (DEFUN MAKE-LAMBDA-LIST ...). ;;; Compiling (DEFUN UNPARSE-DS-LAMBDA-LIST ...). ;;; Compiling (DEFUN DS-LAMBDA-LIST-VARIABLES ...). ;;; Compiling (DEFUN DS-LAMBDA-LIST-MATCH-P ...). ;;; Compiling (DEFUN DS-LAMBDA-LIST-MATCHER ...). ;;; Compiling (DEFUN EMIT-DS-LAMBDA-LIST-MATCH ...). ;;; Compiling (DEFUN EMIT-DS-BIND-CHECK ...). ;;; Compiling (DEFUN EXPAND-DS-BIND ...). ;;; Compiling (DEFUN COMPILER-MACRO-ARGS ...). ;;; Compiling (DEFUN GET-DS-BIND-CONTEXT ...). ;;; Compiling (DEFUN DS-BIND-ERROR ...). ;;; Compiling (DEFUN CHECK-DS-BIND-KEYS ...). ;;; Compiling (DEFUN CHECK-DS-LIST ...). ;;; Compiling (DEFUN CHECK-DS-LIST/&REST ...). ;;; Compiling (DEFUN CHECK-DS-LIST/&KEY ...). ;;; Compiling (DEFUN CMACRO-CHECK-DS-LIST/&KEY ...). ;;; Compiling (DEFUN DS-GETF ...). ;;; Compiling (DEF!MACRO NAMED-DS-BIND ...). ;;; Compiling (DEFUN MAKE-MACRO-LAMBDA ...). ;;; Compiling (DEFVAR *STRIP-LAMBA-LIST-RETAIN-AUX* ...). ;;; Compiling (DEFUN STRIP-LAMBDA-LIST ...). ;;; End of Pass 1. ;;; Emitting code for LAMBDA-LIST-KEYWORD-MASK. ;;; Emitting code for LL-KWDS-RESTP. ;;; Emitting code for LL-KWDS-KEYP. ;;; Emitting code for LL-KWDS-ALLOWP. ;;; Emitting code for PARSE-LAMBDA-LIST. ;;; Emitting code for CROAK. ;;; Emitting code for DEFAULTP. ;;; Emitting code for NEED-BINDABLE. ;;; Emitting code for NEED-SYMBOL. ;;; Emitting code for NEED-ARG. ;;; Emitting code for REPORT-SUSPICIOUS. ;;; Emitting code for CHECK-SUSPICIOUS. ;;; Emitting code for PROBABLY-LL-KEYWORD-P. ;;; Emitting code for DESTRUCTURING-P. ;;; Emitting code for SCAN-OPT/KEY. ;;; Emitting code for PARSE-DS-LAMBDA-LIST. ;;; Emitting code for PARSE*. ;;; Emitting code for PARSE. ;;; Emitting code for #:G116. ;;; Emitting code for #:G117. ;;; Emitting code for WITH-DS-LAMBDA-LIST-PARTS. ;;; Emitting code for PARSE-OPTIONAL-ARG-SPEC. ;;; Emitting code for PARSE-KEY-ARG-SPEC. ;;; Emitting code for META-ABSTRACTIFY-DS-LAMBDA-LIST. ;;; Emitting code for RECURSE. ;;; Emitting code for PROCESS-OPT/KEY. ;;; Emitting code for #:G175. ;;; Emitting code for MAKE-LAMBDA-LIST. ;;; Emitting code for UNPARSE-DS-LAMBDA-LIST. ;;; Emitting code for MEMOIZE. ;;; Emitting code for RECURSE. ;;; Emitting code for MAYBE-DEFAULT. ;;; Emitting code for PROCESS-OPT. ;;; Emitting code for #:G230. ;;; Emitting code for DS-LAMBDA-LIST-VARIABLES. ;;; Emitting code for SCAN. ;;; Emitting code for SUPPLIEDP-VAR. ;;; Emitting code for COPY. ;;; Emitting code for RECURSE. ;;; Emitting code for DS-LAMBDA-LIST-MATCH-P. ;;; Emitting code for RECURSE. ;;; Emitting code for DS-LAMBDA-LIST-MATCHER. ;;; Emitting code for EMIT-DS-LAMBDA-LIST-MATCH. ;;; Emitting code for EMIT-DS-BIND-CHECK. ;;; Emitting code for EXPAND-DS-BIND. ;;; Emitting code for DESCEND. ;;; Emitting code for GEN-TEST. ;;; Emitting code for BIND-IF. ;;; Emitting code for BIND-PAT. ;;; Emitting code for CAST/POP. ;;; Emitting code for COMPILER-MACRO-ARGS. ;;; Emitting code for GET-DS-BIND-CONTEXT. ;;; Emitting code for DS-BIND-ERROR. ;;; Emitting code for CHECK-DS-BIND-KEYS. ;;; Emitting code for CHECK-DS-LIST. ;;; Emitting code for CHECK-DS-LIST/&REST. ;;; Emitting code for CHECK-DS-LIST/&KEY. ;;; Emitting code for CMACRO-CHECK-DS-LIST/&KEY. ;;; Emitting code for DS-GETF. ;;; Emitting code for NAMED-DS-BIND. ;;; Emitting code for MAKE-MACRO-LAMBDA. ;;; Emitting code for #:G485. ;;; Emitting code for STRIP-LAMBDA-LIST. ;;; Emitting code for #:G489. ;;; Emitting code for #:G509. In file included from /nix/store/4ha569nsijgnp7ywq89prpn6643h132m-ecl-16.1.2/include/ecl/ecl.h:84:0, from /nix/store/4ha569nsijgnp7ywq89prpn6643h132m-ecl-16.1.2/include/ecl/ecl-cmp.h:29, from obj/from-host/src/compiler/parse-lambda-list.c:5: obj/from-host/src/compiler/parse-lambda-list.c: In function 'LC14scan_opt_key': obj/from-host/src/compiler/parse-lambda-list.c:1222:15: error: 'aux_closure' undeclared (first use in this function) if (Null((aux_closure.env=env0,cl_env_copy->function=(cl_object)&aux_closure,LC12defaultp(2, v5arg, v2what_kind)))) { goto L8; } ^ /nix/store/4ha569nsijgnp7ywq89prpn6643h132m-ecl-16.1.2/include/ecl/cons.h:27:27: note: in definition of macro 'Null' #define Null(x) ((x)==ECL_NIL) ^ obj/from-host/src/compiler/parse-lambda-list.c:1222:15: note: each undeclared identifier is reported only once for each function it appears in if (Null((aux_closure.env=env0,cl_env_copy->function=(cl_object)&aux_closure,LC12defaultp(2, v5arg, v2what_kind)))) { goto L8; } ^ /nix/store/4ha569nsijgnp7ywq89prpn6643h132m-ecl-16.1.2/include/ecl/cons.h:27:27: note: in definition of macro 'Null' #define Null(x) ((x)==ECL_NIL) ^ obj/from-host/src/compiler/parse-lambda-list.c:1222:31: error: 'env0' undeclared (first use in this function) if (Null((aux_closure.env=env0,cl_env_copy->function=(cl_object)&aux_closure,LC12defaultp(2, v5arg, v2what_kind)))) { goto L8; } ^ /nix/store/4ha569nsijgnp7ywq89prpn6643h132m-ecl-16.1.2/include/ecl/cons.h:27:27: note: in definition of macro 'Null' #define Null(x) ((x)==ECL_NIL) ^ ;;; Internal error: ;;; ** Error code 1 when executing ;;; (RUN-PROGRAM "gcc" ("-I." "-I/nix/store/4ha569nsijgnp7ywq89prpn6643h132m-ecl-16.1.2/include/" "-I/nix/store/6f3nbgg28xxyq2mdzdxl0j06dry90sgl-gmp-5.1.3/include" "-I/nix/store/nnjvmplfmzpc22ls4p9h4c7c61rppzc5-libffi-3.2.1/include" "-D_GNU_SOURCE" ...)) Condition of type: SIMPLE-ERROR couldn't compile "src/compiler/parse-lambda-list.lisp"
Available restarts:
1. (RESTART-TOPLEVEL) Go back to Top-Level REPL.
Broken at SB-COLD::LOAD-OR-CLOAD-XCOMPILER. In: #<process TOP-LEVEL>. File: #P"/tmp/nix-build-sbcl-1.3.3.drv-0/sbcl-1.3.3/src/cold/defun-load-or-cload-xcompiler.lisp" (Position #1305)