From fcddd9c175cba2511558cba4e6e2e0005d821da5 Mon Sep 17 00:00:00 2001 From: Marius Gerbershagen Date: Tue, 3 Mar 2026 20:55:09 +0100 Subject: [PATCH] compiler.d: fix order of evaluation bug for nested eval-when forms --- src/c/compiler.d | 2 ++ src/tests/normal-tests/compiler.lsp | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/c/compiler.d b/src/c/compiler.d index 15a005815..23b4930b0 100644 --- a/src/c/compiler.d +++ b/src/c/compiler.d @@ -1649,10 +1649,12 @@ c_eval_when(cl_env_ptr env, cl_object args, int flags) { args = ECL_NIL; } else if (when_load_p(situation)) { if (when_compile_p(situation)) { + int result = compile_toplevel_body(env, args, flags); int current_mode = c_env->mode; c_env->mode = FLAG_EXECUTE; execute_each_form(env, args); c_env->mode = current_mode; + return result; } } else if (when_compile_p(situation)) { int current_mode = c_env->mode; diff --git a/src/tests/normal-tests/compiler.lsp b/src/tests/normal-tests/compiler.lsp index 044f5d305..5a3d9dce8 100644 --- a/src/tests/normal-tests/compiler.lsp +++ b/src/tests/normal-tests/compiler.lsp @@ -2678,3 +2678,26 @@ (is (typep (first +c.0113.3+) 'base-string)) (is (string= (first +c.0113.4+) "bb")) (is (and (typep (first +c.0113.4+) 'string) (not (typep (first +c.0113.4+) 'base-string)))))) + +;;; Date 2026-03-05 +;;; Description +;;; +;;; Wrong order of evaluation for nested eval-when forms in the +;;; bytecompiler. +;;; +(test cmp.0114.nested-eval-when + (eval '(defparameter *nested-eval-when-0114* "")) + (let* ((part-1 "So the last will be first, ") + (part-2 "and the first will be last.") + (ofile + (with-compiler ("nested-eval-when-0114.lsp") + `(eval-when (:load-toplevel :compile-toplevel :execute) + (eval-when (:compile-toplevel) + (setf *nested-eval-when-0114* + (concatenate 'string *nested-eval-when-0114* ,part-1))) + (setf *nested-eval-when-0114* + (concatenate 'string *nested-eval-when-0114* ,part-2)))))) + (delete-file "nested-eval-when-0114.lsp") + (delete-file ofile) + (is (equal (concatenate 'string part-1 part-2) + *nested-eval-when-0114*))))