cs: fix encuoraged and cross-module inlining of set!
When an inlined `set!` mutates a variable that's bound in the inlined function, the `set!` target was not updated to refer to the inlined binding. Closes #3817
This commit is contained in:
parent
849d66adaa
commit
180983fb4b
|
@ -7132,6 +7132,21 @@
|
|||
|
||||
(f (+ 6.0 (one)) (+ 6.0 (one)))))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Regression test to checking inlingin with `set!`:
|
||||
|
||||
(module check-inline-of-set!-expression racket/base
|
||||
(require racket/performance-hint)
|
||||
(begin-encourage-inline
|
||||
(define (f x)
|
||||
(let ([y 0])
|
||||
(set! y (+ y x))
|
||||
y)))
|
||||
(define result (list (f 1) (f 2)))
|
||||
(provide result))
|
||||
|
||||
(test '(1 2) dynamic-require ''check-inline-of-set!-expression 'result)
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(report-errs)
|
||||
|
|
|
@ -12722,10 +12722,12 @@
|
|||
(values id_1 rhs_0)))))))
|
||||
(case-lambda
|
||||
((id_0 rhs_0)
|
||||
(list
|
||||
'set!
|
||||
id_0
|
||||
(clone-expr rhs_0 env_0 mutated_0)))
|
||||
(let ((app_0
|
||||
(clone-expr id_0 env_0 mutated_0)))
|
||||
(list
|
||||
'set!
|
||||
app_0
|
||||
(clone-expr rhs_0 env_0 mutated_0))))
|
||||
(args
|
||||
(raise-binding-result-arity-error 2 args))))
|
||||
(if (if (eq? '|#%variable-reference| hd_0)
|
||||
|
|
|
@ -207,7 +207,7 @@
|
|||
[`(begin-unsafe ,exps ...)
|
||||
`(begin-unsafe . ,(clone-body exps env mutated))]
|
||||
[`(set! ,id ,rhs)
|
||||
`(set! ,id ,(clone-expr rhs env mutated))]
|
||||
`(set! ,(clone-expr id env mutated) ,(clone-expr rhs env mutated))]
|
||||
[`(#%variable-reference) v]
|
||||
[`(#%variable-reference ,id)
|
||||
`(#%variable-reference ,(clone-expr id env mutated))]
|
||||
|
|
Loading…
Reference in New Issue
Block a user