From f6133edc923d811e35625c6ac0e39cd4648cd822 Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Fri, 28 Mar 2025 21:06:08 +0000 Subject: [PATCH] fix opaque_closure sparam capture Fix #54236 Fix #54357 --- src/julia-syntax.scm | 1 + test/opaque_closure.jl | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index 0e1618ed140a6..0b6f56ac838a6 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -4109,6 +4109,7 @@ f(x) = yt(x) (capt-var-access v fname opaq) v))) cvs))) + (set-car! (cdddr (lam:vinfo lam2)) '()) ;; must capture static_parameters as values inside opaque_closure `(new_opaque_closure ,(cadr e) ,(or (caddr e) '(call (core apply_type) (core Union))) ,(or (cadddr e) '(core Any)) ,allow-partial (opaque_closure_method (null) ,nargs ,isva ,functionloc ,(convert-lambda lam2 (car (lam:args lam2)) #f '() (symbol-to-idx-map cvs) parsed-method-stack)) diff --git a/test/opaque_closure.jl b/test/opaque_closure.jl index 6c988b068a668..7b02578a86621 100644 --- a/test/opaque_closure.jl +++ b/test/opaque_closure.jl @@ -390,3 +390,20 @@ let ir = first(only(Base.code_ircode(sin, (Int,)))) oc = Core.OpaqueClosure(ir; do_compile=false) @test oc(1) == sin(1) end + +function typed_add54236(::Type{T}) where T + return @opaque (x::Int)->T(x) + T(1) +end +let f = typed_add54236(Float64) + @test f isa Core.OpaqueClosure + @test f(32) === 33.0 +end + +f54357(g, ::Type{AT}) where {AT} = Base.Experimental.@opaque AT->_ (args...) -> g((args::AT)...) +let f = f54357(+, Tuple{Int,Int}) + @test f isa Core.OpaqueClosure + @test f(32, 34) === 66 + g = f54357(+, Tuple{Float64,Float64}) + @test g isa Core.OpaqueClosure + @test g(32.0, 34.0) === 66.0 +end