From ac8a9fb3f9c1a07cc96defebc77baec17ea8d9cd Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Wed, 8 Jul 2026 11:34:55 -0500 Subject: [PATCH] Fix idx/rt getfield --- src/rules/typeunstablerules.jl | 16 ++++++++-------- test/typeunstable.jl | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/rules/typeunstablerules.jl b/src/rules/typeunstablerules.jl index bd5a17d3f0..7283fc455a 100644 --- a/src/rules/typeunstablerules.jl +++ b/src/rules/typeunstablerules.jl @@ -1226,8 +1226,8 @@ function rt_jl_getfield_aug( dptr::T, ::Type{Val{symname}}, ::Val{isconst}, - dptrs::Vararg{T2,Nargs}, -) where {NT,T,T2,Nargs,symname,isconst} + dptrs::Vararg{T,Nargs}, +) where {NT,T,Nargs,symname,isconst} res = if dptr isa Base.RefValue Base.getfield(dptr[], symname) else @@ -1274,8 +1274,8 @@ function idx_jl_getfield_aug( dptr::T, ::Type{Val{symname}}, ::Val{isconst}, - dptrs::Vararg{T2,Nargs}, -) where {NT,T,T2,Nargs,symname,isconst} + dptrs::Vararg{T,Nargs}, +) where {NT,T,Nargs,symname,isconst} res = if dptr isa Base.RefValue Base.getfield(dptr[], symname + 1) else @@ -1343,8 +1343,8 @@ function rt_jl_getfield_rev( dret, ::Type{Val{symname}}, ::Val{isconst}, - dptrs::Vararg{T2,Nargs}, -) where {T,T2,Nargs,symname,isconst} + dptrs::Vararg{T,Nargs}, +) where {T,Nargs,symname,isconst} cur = if dptr isa Base.RefValue getfield(dptr[], symname) else @@ -1425,8 +1425,8 @@ function idx_jl_getfield_rev( dret, ::Type{Val{symname}}, ::Val{isconst}, - dptrs::Vararg{T2,Nargs}, -) where {T,T2,Nargs,symname,isconst} + dptrs::Vararg{T,Nargs}, +) where {T,Nargs,symname,isconst} cur = if dptr isa Base.RefValue Base.getfield(dptr[], symname + 1) else diff --git a/test/typeunstable.jl b/test/typeunstable.jl index dd45b76b9c..b1a69d08a1 100644 --- a/test/typeunstable.jl +++ b/test/typeunstable.jl @@ -263,4 +263,26 @@ end idx = Base.inferencebarrier(2) res = Enzyme.autodiff(set_runtime_activity(Forward), getfield_unstable_fn, Duplicated([2.0, 3.0], [1.0, 0.0]), Const(idx)) @test res[1] ≈ 3.0 +end + +struct MiniProblem3280{U, P, K} + u0::U + tspan::Tuple{Float64, Float64} + p::P + kwargs::K +end + +function loss_3280(p) + prob = MiniProblem3280([1.0], (0.0, 1.0), p, pairs((;))) + active_field = Enzyme.Compiler.idx_jl_getfield_aug( + Val(NamedTuple{(1,)}), prob, Val{2}, Val(false)) + return sum(abs2, active_field) +end + +@testset "idx_jl_getfield_aug calling convention (Issue 3280 reproducer)" begin + p = [0.5] + dp = zero(p) + Enzyme.autodiff(set_runtime_activity(Reverse), Enzyme.Const(loss_3280), Enzyme.Active, + Enzyme.Duplicated(p, dp)) + @test dp ≈ [1.0] end \ No newline at end of file