diff --git a/module/language/tree-il/peval.scm b/module/language/tree-il/peval.scm index 7dfbf6fb6..062d2ee26 100644 --- a/module/language/tree-il/peval.scm +++ b/module/language/tree-il/peval.scm @@ -1550,7 +1550,7 @@ top-level bindings from ENV and return the resulting expression." (_ #f))) (let ((tag (for-value tag)) - (body (for-tail body))) + (body (for-values body))) (cond ((find-definition tag 1) (lambda (val op) @@ -1582,9 +1582,9 @@ top-level bindings from ENV and return the resulting expression." ,(make-primitive-ref #f 'values) ,@(abort-args body) ,(abort-tail body))) - (for-value handler))))) + (for-tail handler))))) (else - (make-prompt src tag body (for-value handler)))))) + (make-prompt src tag body (for-tail handler)))))) (($ src tag args tail) (make-abort src (for-value tag) (map for-value args) (for-value tail)))))) diff --git a/test-suite/tests/control.test b/test-suite/tests/control.test index 0d95dba8e..e5da24d90 100644 --- a/test-suite/tests/control.test +++ b/test-suite/tests/control.test @@ -427,3 +427,13 @@ (cons (car xs) (k (cdr xs)))))))) (reset* (lambda () (visit xs)))) (traverse '(1 2 3 4 5)))))) + +(with-test-prefix/c&e "shift/reset optimization" + ;; Although a call-with-prompt continuation might accept only a single + ;; value, it doesn't mean that the body can't provide a possibly + ;; different number of values to other continuations. + (pass-if-equal "bug #14347" + '(3.1 2 3) + (call-with-values + (lambda () (let ((k (reset (shift k k) (values 3.1 2 3)))) (k))) + list)))