Skip to content

Commit 11379eb

Browse files
authored
fix JuliaLang#31238, ssavalue with no def with return on RHS (JuliaLang#35399)
1 parent 98ee67c commit 11379eb

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

src/julia-syntax.scm

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,7 +2348,7 @@
23482348
'gc_preserve
23492349
(lambda (e)
23502350
(let* ((s (make-ssavalue))
2351-
(r (gensy)))
2351+
(r (make-ssavalue)))
23522352
`(block
23532353
(= ,s (gc_preserve_begin ,@(cddr e)))
23542354
(= ,r ,(expand-forms (cadr e)))
@@ -4269,6 +4269,7 @@ f(x) = yt(x)
42694269
(linetable '(list))
42704270
(labltable (table))
42714271
(ssavtable (table))
4272+
(reachable #t)
42724273
(current-loc 0)
42734274
(current-file file)
42744275
(current-line line)
@@ -4279,13 +4280,16 @@ f(x) = yt(x)
42794280
(not (and (pair? e) (eq? (car e) 'meta))))
42804281
(begin (set! linetable (cons `(line ,line ,file) linetable))
42814282
(set! current-loc 1)))
4282-
(set! code (cons e code))
4283-
(set! i (+ i 1))
4284-
(set! locs (cons current-loc locs)))
4283+
(if (or reachable
4284+
(and (pair? e) (memq (car e) '(meta inbounds gc_preserve_begin gc_preserve_end aliasscope popaliasscope))))
4285+
(begin (set! code (cons e code))
4286+
(set! i (+ i 1))
4287+
(set! locs (cons current-loc locs)))))
42854288
(let loop ((stmts (cdr body)))
42864289
(if (pair? stmts)
42874290
(let ((e (car stmts)))
4288-
(cond ((and (pair? e) (eq? (car e) 'line))
4291+
(cond ((atom? e) (emit e))
4292+
((eq? (car e) 'line)
42894293
(if (and (= current-line 0) (length= e 2) (pair? linetable))
42904294
;; (line n) after push_loc just updates the line for the new file
42914295
(begin (set-car! (cdr (car linetable)) (cadr e))
@@ -4311,13 +4315,21 @@ f(x) = yt(x)
43114315
(set! current-loc (car l))
43124316
(set! current-line (cadr l))
43134317
(set! current-file (caddr l))))
4314-
((and (pair? e) (eq? (car e) 'label))
4318+
((eq? (car e) 'label)
4319+
(set! reachable #t)
43154320
(put! labltable (cadr e) i))
43164321
((and (assignment? e) (ssavalue? (cadr e)))
4317-
(put! ssavtable (cadr (cadr e)) i)
4318-
(emit (caddr e)))
4322+
(let ((idx (and (ssavalue? (caddr e)) (get ssavtable (cadr (caddr e)) #f))))
4323+
;; if both lhs and rhs are ssavalues, merge them
4324+
(if idx
4325+
(put! ssavtable (cadr (cadr e)) idx)
4326+
(begin
4327+
(put! ssavtable (cadr (cadr e)) i)
4328+
(emit (caddr e))))))
43194329
(else
4320-
(emit e)))
4330+
(emit e)
4331+
(if (or (eq? (car e) 'goto) (eq? (car e) 'return))
4332+
(set! reachable #f))))
43214333
(loop (cdr stmts)))))
43224334
(vector (reverse code) (reverse locs) (reverse linetable) ssavtable labltable)))
43234335

test/syntax.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,6 +2219,15 @@ end
22192219
@test Meta.parse("aa\UE0080", raise=false) ==
22202220
Expr(:error, "invalid character \"\Ue0080\" near column 3")
22212221

2222+
# issue #31238
2223+
a31238, b31238 = let x
2224+
return 1
2225+
end
2226+
@test !@isdefined(a31238) && !@isdefined(b31238)
2227+
@test @eval((a31238, b31238) = let x
2228+
return 1
2229+
end) === 1
2230+
22222231
# issue #35201
22232232
h35201(x; k=1) = (x, k)
22242233
f35201(c) = h35201((;c...), k=true)

0 commit comments

Comments
 (0)