diff --git a/mats/cptypes.ms b/mats/cptypes.ms index bd4a3989df..a14af82f71 100644 --- a/mats/cptypes.ms +++ b/mats/cptypes.ms @@ -1106,4 +1106,9 @@ (cptypes/once-equivalent-expansion? '(vector? (list 1 (vector 2 (display 3) 4))) '(begin (display 3) #f)) + ; regression test: check that the compiler doesn't loop forever + ; when the return arity is unknown + (cptypes-equivalent-expansion? + '(lambda (f) (box? (box (f)))) + '(lambda (f) (#3%$value (f)) #t)) ) diff --git a/s/cptypes.ss b/s/cptypes.ss index 9ceb756e99..ff2609e2d1 100644 --- a/s/cptypes.ss +++ b/s/cptypes.ss @@ -173,6 +173,12 @@ Notes: `(if ,e1 ,e2 ,e3)])] [(case-lambda ,preinfo ,cl* ...) void-rec] + [(call ,preinfo ,pr ,e) + (guard (eq? (primref-name pr) '$value)) + (cond + [(single-valued? e) + (make-seq 'effect e void-rec)] + [else ir])] [(call ,preinfo ,pr ,e* ...) (let ([flags (primref-flags pr)]) (cond