Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions src/julia-syntax.scm
Original file line number Diff line number Diff line change
Expand Up @@ -4063,14 +4063,12 @@ f(x) = yt(x)
(and vi (vinfo:nospecialize vi))))

(define (toplevel-preserving? e)
(and (pair? e) (memq (car e) '(if elseif block trycatch tryfinally trycatchelse))))
(and (pair? e) (memq (car e) '(if elseif block trycatch tryfinally trycatchelse = const))))

(define (map-cl-convert exprs fname lam namemap defined toplevel interp opaq toplevel-pure parsed-method-stack (globals (table)) (locals (table)))
(if toplevel
(map (lambda (x)
(let ((tl (lift-toplevel (cl-convert x fname lam namemap defined
(and toplevel (toplevel-preserving? x))
interp opaq toplevel-pure parsed-method-stack globals locals))))
(let ((tl (lift-toplevel (cl-convert x fname lam namemap defined toplevel interp opaq toplevel-pure parsed-method-stack globals locals))))
(if (null? (cdr tl))
(car tl)
`(block ,@(cdr tl) ,(car tl)))))
Expand Down Expand Up @@ -4473,7 +4471,7 @@ f(x) = yt(x)
(cl-convert (cadr e) fname lam namemap defined toplevel interp opaq toplevel-pure parsed-method-stack globals locals))
(else
(cons (car e)
(map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq toplevel-pure parsed-method-stack globals locals))))))))
(map-cl-convert (cdr e) fname lam namemap defined (and toplevel (toplevel-preserving? e)) interp opaq toplevel-pure parsed-method-stack globals locals))))))))

;; wrapper for `cl-convert-`
(define (cl-convert e fname lam namemap defined toplevel interp opaq toplevel-pure (parsed-method-stack '()) (globals (table)) (locals (table)))
Expand Down
44 changes: 44 additions & 0 deletions test/syntax.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4617,3 +4617,47 @@ end
@test_throws UndefVarError macroexpand(@__MODULE__, :(@undefined_macro(x)))
@test_throws UndefVarError macroexpand!(@__MODULE__, :(@undefined_macro(x)))
end

# #59755 - Don't hoist global declarations out of toplevel-preserving syntax
module M59755 end
@testset "toplevel-preserving syntax" begin
Core.eval(M59755, :(if true
global v1::Bool
else
const v1 = 1
end))
@test !isdefined(M59755, :v1)
@test Base.binding_kind(M59755, :v1) == Base.PARTITION_KIND_GLOBAL
@test Core.get_binding_type(M59755, :v1) == Bool

Core.eval(M59755, :(if false
global v2::Bool
else
const v2 = 2
end))
@test M59755.v2 === 2
@test Base.binding_kind(M59755, :v2) == Base.PARTITION_KIND_CONST

Core.eval(M59755, :(v3 = if true
global v4::Bool
4
else
const v4 = 5
6
end))
@test M59755.v3 == 4
@test !isdefined(M59755, :v4)
@test Base.binding_kind(M59755, :v4) == Base.PARTITION_KIND_GLOBAL
@test Core.get_binding_type(M59755, :v4) == Bool

Core.eval(M59755, :(v5 = if false
global v6::Bool
4
else
const v6 = 5
6
end))
@test M59755.v5 === 6
@test M59755.v6 === 5
@test Base.binding_kind(M59755, :v6) == Base.PARTITION_KIND_CONST
end