diff --git a/src/Tracing.jl b/src/Tracing.jl index 207968d186..ee024d95a1 100644 --- a/src/Tracing.jl +++ b/src/Tracing.jl @@ -366,15 +366,41 @@ end for P in (Ptr, Core.LLVMPtr, Base.RefValue) @eval Base.@nospecializeinfer function traced_type_inner( - @nospecialize(PT::Type{<:$P}), + @nospecialize(PT::Type{$P}), seen, mode::TraceMode, @nospecialize(track_numbers::Type) ) - T = eltype(PT) - return $P{traced_type_inner(T, seen, mode, track_numbers)} + return $P end end +for P in (Ptr, Base.RefValue) + @eval Base.@nospecializeinfer function traced_type_inner( + @nospecialize(PT::Type{$P{T}}), + seen, + mode::TraceMode, + @nospecialize(track_numbers::Type) + ) where {T} + return $P{traced_type_inner(PT.parameters[1], seen, mode, track_numbers)} + end +end + +Base.@nospecializeinfer function traced_type_inner( + @nospecialize(PT::Type{Core.LLVMPtr{T}}), + seen, + mode::TraceMode, + @nospecialize(track_numbers::Type) +) where {T} + return Core.LLVMPtr{traced_type_inner(PT.body.parameters[1], seen, mode, track_numbers)} +end +Base.@nospecializeinfer function traced_type_inner( + @nospecialize(PT::Type{Core.LLVMPtr{T,A}}), + seen, + mode::TraceMode, + @nospecialize(track_numbers::Type) +) where {T,A} + return Core.LLVMPtr{traced_type_inner(PT.parameters[1], seen, mode, track_numbers),A} +end Base.@nospecializeinfer function traced_type_inner( @nospecialize(VT::Type{<:Val}), diff --git a/test/tracing.jl b/test/tracing.jl index 4953a30239..a6e14c816e 100644 --- a/test/tracing.jl +++ b/test/tracing.jl @@ -165,6 +165,11 @@ end NTuple{nsteps,SpectralVariable3D} where {nsteps,SpectralVariable3D}, NTuple{nsteps,SpectralVariable3D} where {nsteps,SpectralVariable3D}, ), + ( + Base.RefValue{A} where {A}, + Base.RefValue{A} where {A}, + Base.RefValue{A} where {A}, + ), (Wrapper{Symbol,Symbol}, Wrapper{Symbol,Symbol}, Wrapper{Symbol,Symbol}), ( Wrapper{Float64,Vector{Float64}},