From bc4e207dcd0dbc957b4a398488ec7495c47b42e8 Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Tue, 9 Feb 2021 15:08:55 -0500 Subject: [PATCH] fix bug in `let` when a global var is both shadowed and used in an RHS (#39570) --- src/julia-syntax.scm | 44 ++++++++++++++------------------------------ test/core.jl | 9 --------- test/syntax.jl | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 39 deletions(-) diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index 6329293e3a795..bac71d5bc1dee 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -1221,41 +1221,25 @@ (decl? (cadar binds))) (let ((vname (decl-var (cadar binds)))) (loop (cdr binds) - (if (expr-contains-eq vname (caddar binds)) - (let ((tmp (make-ssavalue))) - `(scope-block - (block ,@hs - (= ,tmp ,(caddar binds)) - (scope-block - (block - (local-def ,(cadar binds)) - (= ,vname ,tmp) - ,blk))))) - `(scope-block - (block ,@hs - (local-def ,(cadar binds)) - (= ,vname ,(caddar binds)) - ,blk)))))) + (let ((tmp (make-ssavalue))) + `(block (= ,tmp ,(caddar binds)) + (scope-block + (block ,@hs + (local-def ,(cadar binds)) + (= ,vname ,tmp) + ,blk))))))) ;; (a, b, c, ...) = rhs ((and (pair? (cadar binds)) (eq? (caadar binds) 'tuple)) (let ((vars (lhs-vars (cadar binds)))) (loop (cdr binds) - (if (expr-contains-p (lambda (x) (memq x vars)) (caddr (car binds))) - ;; use more careful lowering if there are name conflicts. issue #25652 - (let ((temp (make-ssavalue))) - `(block - (= ,temp ,(caddr (car binds))) - (scope-block - (block ,@hs - ,@(map (lambda (v) `(local-def ,v)) vars) - (= ,(cadr (car binds)) ,temp) - ,blk)))) - `(scope-block - (block ,@hs - ,@(map (lambda (v) `(local-def ,v)) vars) - ,(car binds) - ,blk)))))) + (let ((tmp (make-ssavalue))) + `(block (= ,tmp ,(caddar binds)) + (scope-block + (block ,@hs + ,@(map (lambda (v) `(local-def ,v)) vars) + (= ,(cadar binds) ,tmp) + ,blk))))))) (else (error "invalid let syntax")))) (else (error "invalid let syntax"))))))))) diff --git a/test/core.jl b/test/core.jl index 40d7e5748239b..f1f11d40af4c7 100644 --- a/test/core.jl +++ b/test/core.jl @@ -4124,15 +4124,6 @@ let ex = quote @test ex.args[2] == :test end -# issue #25652 -x25652 = 1 -x25652_2 = let (x25652, _) = (x25652, nothing) - x25652 = x25652 + 1 - x25652 -end -@test x25652_2 == 2 -@test x25652 == 1 - # issue #15180 function f15180(x::T) where T X = Vector{T}(undef, 1) diff --git a/test/syntax.jl b/test/syntax.jl index ac4ccef86660b..2df99168b6ee8 100644 --- a/test/syntax.jl +++ b/test/syntax.jl @@ -2678,3 +2678,21 @@ end @test f((b=3, c=2, a=4)) == (4, 3) @test_throws ErrorException f((;)) end + +# issue #25652 +x25652 = 1 +x25652_2 = let (x25652, _) = (x25652, nothing) + x25652 = x25652 + 1 + x25652 +end +@test x25652_2 == 2 +@test x25652 == 1 + +@test let x = x25652 + x25652 = x+3 + x25652 +end == 4 +@test let (x,) = (x25652,) + x25652 = x+3 + x25652 +end == 4