Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

type assert Core.SimpleVector in typejoin_union_tuple #57631

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

nsajko
Copy link
Contributor

@nsajko nsajko commented Mar 4, 2025

Should get rid of some invalidation on running user code.

Should get rid of some invalidation on running user code.
@nsajko
Copy link
Contributor Author

nsajko commented Mar 4, 2025

To clarify, the type instability that causes the invalidations is caused by the fact that, when T is not inferred exactly (so a subtype of Type, but not DataType), T.parameters is inferred as Any, so length(p) is likewise inferred as Any instead of as Int. Then, for example, the 1:lr call gets compiled as (::Colon)(::Int64, ::Real), which gets invalidated when a new subtype of Real is introduced with a certain promote_rule.

@nsajko
Copy link
Contributor Author

nsajko commented Mar 4, 2025

Decreases the invalidation count from loading the package TypeDomainNaturalNumbers from 957 to 923. Measured using:

./julia -E 'using SnoopCompileCore; i=(@snoop_invalidations using TypeDomainNaturalNumbers); using SnoopCompile; length(uinvalidated(i))'

@nsajko nsajko requested a review from aviatesk March 6, 2025 17:13
@nsajko
Copy link
Contributor Author

nsajko commented Mar 6, 2025

Sorry for bothering you aviatesk, but can you please review, the change is just adding a (concrete) type assert to improve type stability.

Copy link
Member

@aviatesk aviatesk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure why this type annotation reduces the number of invalidations. T::DataType should be enough to allow the compiler to infer this information.

@nsajko
Copy link
Contributor Author

nsajko commented Mar 7, 2025

You're right, it's an inference regression, created issue #57667.

@nsajko
Copy link
Contributor Author

nsajko commented Mar 8, 2025

I think this should be merged as a quick fix given that inference issue doesn't seem trivial to fix.

@adienes
Copy link
Member

adienes commented Mar 8, 2025

I think this should be merged as a quick fix

I might suggest a (broken) test case and a TODO comment alongside the fix if so

@nsajko
Copy link
Contributor Author

nsajko commented Mar 8, 2025

Not sure if there's a good way to test for something here. Ref #55625 (comment)

Good idea regarding adding a broken test, I'll make that PR for #57667 EDIT: actually, no, that doesn't seem like a completely robust test either.

@nsajko
Copy link
Contributor Author

nsajko commented Mar 8, 2025

To be clear, it's not apparent to me the inference issue (#57667) is something that will ever be fixed, it's a bit speculative. So merging this PR right now seems like the obvious choice. The pattern of type.parameters::Core.SimpleVector is used all over the place already anyway.

@adienes
Copy link
Member

adienes commented Mar 8, 2025

Gotcha makes sense

@nsajko nsajko added the backport 1.12 Change should be backported to release-1.12 label Mar 9, 2025
@nsajko
Copy link
Contributor Author

nsajko commented Mar 11, 2025

the tree of invalidations fixed by this PR
{
    "method_instance": {
        "method": "typejoin_union_tuple(T::DataType) @ Base promotion.jl:200",
        "method_instance": "MethodInstance for Base.typejoin_union_tuple(::Type{Tuple{UnitRange{Int64}, Symbol, Any}})"
    },
    "children": [
        {
            "method_instance": {
                "method": "promote_typejoin_union(::Type{T}) where T @ Base promotion.jl:185",
                "method_instance": "MethodInstance for Base.promote_typejoin_union(::Type{Tuple{UnitRange{Int64}, Symbol, Any}})"
            },
            "children": [
                {
                    "method_instance": {
                        "method": "_collect(c, itr, ::Base.EltypeUnknown, isz::Union{Base.HasLength, Base.HasShape}) @ Base array.jl:807",
                        "method_instance": "MethodInstance for Base._collect(::Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, ::Base.Generator{Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, typeof(values)}, ::Base.EltypeUnknown, ::Base.HasShape{1})"
                    },
                    "children": [
                        {
                            "method_instance": {
                                "method": "collect_similar(cont, itr) @ Base array.jl:732",
                                "method_instance": "MethodInstance for Base.collect_similar(::Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, ::Base.Generator{Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, typeof(values)})"
                            },
                            "children": [
                                {
                                    "method_instance": {
                                        "method": "map(f, A::AbstractArray) @ Base abstractarray.jl:3361",
                                        "method_instance": "MethodInstance for map(::typeof(values), ::Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}})"
                                    },
                                    "children": [
                                        {
                                            "method_instance": {
                                                "method": "show(io::IO, s::A) where A<:AnnotatedString @ Base strings/annotated.jl:173",
                                                "method_instance": "MethodInstance for show(::IOBuffer, ::A) where A<:Base.AnnotatedString"
                                            },
                                            "children": [
                                            ]
                                        },
                                        {
                                            "method_instance": {
                                                "method": "show(io::IO, s::A) where A<:AnnotatedString @ Base strings/annotated.jl:173",
                                                "method_instance": "MethodInstance for show(::IOBuffer, ::A) where A<:Base.AnnotatedString"
                                            },
                                            "children": [
                                                {
                                                    "method_instance": {
                                                        "method": "var\"#sprint#443\"(context, sizehint::Integer, ::typeof(sprint), f::Function, args...) @ Base strings/io.jl:110",
                                                        "method_instance": "MethodInstance for Base.var\"#sprint#443\"(::Nothing, ::Int64, ::typeof(sprint), ::typeof(show), ::AbstractString)"
                                                    },
                                                    "children": [
                                                        {
                                                            "method_instance": {
                                                                "method": "kwcall(::NamedTuple, ::typeof(sprint), f::Function, args...) @ Base strings/io.jl:110",
                                                                "method_instance": "MethodInstance for Core.kwcall(::@NamedTuple{context::Nothing}, ::typeof(sprint), ::typeof(show), ::AbstractString)"
                                                            },
                                                            "children": [
                                                                {
                                                                    "method_instance": {
                                                                        "method": "var\"#repr#446\"(context, ::typeof(repr), x) @ Base strings/io.jl:286",
                                                                        "method_instance": "MethodInstance for Base.var\"#repr#446\"(::Nothing, ::typeof(repr), ::AbstractString)"
                                                                    },
                                                                    "children": [
                                                                        {
                                                                            "method_instance": {
                                                                                "method": "repr(x; context) @ Base strings/io.jl:286",
                                                                                "method_instance": "MethodInstance for repr(::AbstractString)"
                                                                            },
                                                                            "children": [
                                                                                {
                                                                                    "method_instance": {
                                                                                        "method": "(::Base.JuliaSyntax.var\"#Kind##0#Kind##1\")() @ Base.JuliaSyntax ~/tmp/jl/julia-git/invalidations_build/base/JuliaSyntax/src/kinds.jl:47",
                                                                                        "method_instance": "MethodInstance for (::Base.JuliaSyntax.var\"#Kind##0#Kind##1\"{<:AbstractString})()"
                                                                                    },
                                                                                    "children": [
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "get(default::Union{Function, Type}, h::Dict{K, V}, key) where {K, V} @ Base dict.jl:524",
                                                                                                "method_instance": "MethodInstance for get(::Base.JuliaSyntax.var\"#Kind##0#Kind##1\"{<:AbstractString}, ::Dict{String, UInt16}, ::AbstractString)"
                                                                                            },
                                                                                            "children": [
                                                                                                {
                                                                                                    "method_instance": {
                                                                                                        "method": "Base.JuliaSyntax.Kind(s::AbstractString) @ Base.JuliaSyntax ~/tmp/jl/julia-git/invalidations_build/base/JuliaSyntax/src/kinds.jl:45",
                                                                                                        "method_instance": "MethodInstance for Base.JuliaSyntax.Kind(::AbstractString)"
                                                                                                    },
                                                                                                    "children": [
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "(::Base.JuliaSyntax.var\"#_register_kinds!##0#_register_kinds!##1\")(n) @ Base.JuliaSyntax none:0",
                                                                                                                "method_instance": "MethodInstance for (::Base.JuliaSyntax.var\"#_register_kinds!##0#_register_kinds!##1\"{Dict{String, UInt16}})(::String)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "var\"@K_str\"(__source__::LineNumberNode, __module__::Module, s) @ Base.JuliaSyntax ~/tmp/jl/julia-git/invalidations_build/base/JuliaSyntax/src/kinds.jl:160",
                                                                                                                "method_instance": "MethodInstance for var\"@K_str\"(::LineNumberNode, ::Module, ::Any)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        }
                                                                                                    ]
                                                                                                }
                                                                                            ]
                                                                                        }
                                                                                    ]
                                                                                },
                                                                                {
                                                                                    "method_instance": {
                                                                                        "method": "docerror(ex) @ Base.Docs docs/Docs.jl:742",
                                                                                        "method_instance": "MethodInstance for Base.Docs.docerror(::Any)"
                                                                                    },
                                                                                    "children": [
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                            },
                                                                                            "children": [
                                                                                            ]
                                                                                        },
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                            },
                                                                                            "children": [
                                                                                            ]
                                                                                        },
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "calldoc(__source__, __module__, str, def::Expr) @ Base.Docs docs/Docs.jl:386",
                                                                                                "method_instance": "MethodInstance for Base.Docs.calldoc(::Any, ::Any, ::Any, ::Expr)"
                                                                                            },
                                                                                            "children": [
                                                                                                {
                                                                                                    "method_instance": {
                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                    },
                                                                                                    "children": [
                                                                                                    ]
                                                                                                },
                                                                                                {
                                                                                                    "method_instance": {
                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                    },
                                                                                                    "children": [
                                                                                                    ]
                                                                                                }
                                                                                            ]
                                                                                        },
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "calldoc(__source__, __module__, str, def::Expr) @ Base.Docs docs/Docs.jl:386",
                                                                                                "method_instance": "MethodInstance for Base.Docs.calldoc(::LineNumberNode, ::Module, ::Any, ::Expr)"
                                                                                            },
                                                                                            "children": [
                                                                                                {
                                                                                                    "method_instance": {
                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                    },
                                                                                                    "children": [
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x) @ Base.Docs docs/Docs.jl:647",
                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                    ]
                                                                                                                },
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                    ]
                                                                                                                }
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x) @ Base.Docs docs/Docs.jl:647",
                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
                                                                                                                "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "docm(source::LineNumberNode, mod::Module, ::Any, ::Any, x...) @ Base.Docs docs/Docs.jl:631",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Any, ::Any, ::Vararg{Any})"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                    ]
                                                                                                                },
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "docm(source::LineNumberNode, mod::Module, meta, ex) @ Base.Docs docs/Docs.jl:639",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                        {
                                                                                                                            "method_instance": {
                                                                                                                                "method": "docm(source::LineNumberNode, mod::Module, ::Any, ::Any, x...) @ Base.Docs docs/Docs.jl:631",
                                                                                                                                "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Any, ::Any, ::Vararg{Any})"
                                                                                                                            },
                                                                                                                            "children": [
                                                                                                                            ]
                                                                                                                        }
                                                                                                                    ]
                                                                                                                },
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "loaddocs(docs::Base.CoreDocs.DocLinkedList) @ Base.Docs docs/Docs.jl:758",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs.loaddocs(::Base.CoreDocs.DocLinkedList)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                    ]
                                                                                                                },
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs.multidoc(::Any, ::Any, ::Any, ::Expr, ::Bool)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                    ]
                                                                                                                },
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Any, ::Expr, ::Bool)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                        {
                                                                                                                            "method_instance": {
                                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                                            },
                                                                                                                            "children": [
                                                                                                                            ]
                                                                                                                        }
                                                                                                                    ]
                                                                                                                },
                                                                                                                {
                                                                                                                    "method_instance": {
                                                                                                                        "method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
                                                                                                                        "method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Expr, ::Expr, ::Bool)"
                                                                                                                    },
                                                                                                                    "children": [
                                                                                                                        {
                                                                                                                            "method_instance": {
                                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                            },
                                                                                                                            "children": [
                                                                                                                                {
                                                                                                                                    "method_instance": {
                                                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any)"
                                                                                                                                    },
                                                                                                                                    "children": [
                                                                                                                                        {
                                                                                                                                            "method_instance": {
                                                                                                                                                "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                                "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                                            },
                                                                                                                                            "children": [
                                                                                                                                            ]
                                                                                                                                        }
                                                                                                                                    ]
                                                                                                                                },
                                                                                                                                {
                                                                                                                                    "method_instance": {
                                                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                                    },
                                                                                                                                    "children": [
                                                                                                                                    ]
                                                                                                                                },
                                                                                                                                {
                                                                                                                                    "method_instance": {
                                                                                                                                        "method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
                                                                                                                                        "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                                    },
                                                                                                                                    "children": [
                                                                                                                                    ]
                                                                                                                                },
                                                                                                                                {
                                                                                                                                    "method_instance": {
                                                                                                                                        "method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
                                                                                                                                        "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                                    },
                                                                                                                                    "children": [
                                                                                                                                        {
                                                                                                                                            "method_instance": {
                                                                                                                                                "method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
                                                                                                                                                "method_instance": "MethodInstance for Base.Docs.multidoc(::Any, ::Any, ::Any, ::Expr, ::Bool)"
                                                                                                                                            },
                                                                                                                                            "children": [
                                                                                                                                                {
                                                                                                                                                    "method_instance": {
                                                                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
                                                                                                                                                    },
                                                                                                                                                    "children": [
                                                                                                                                                    ]
                                                                                                                                                },
                                                                                                                                                {
                                                                                                                                                    "method_instance": {
                                                                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                                                                    },
                                                                                                                                                    "children": [
                                                                                                                                                    ]
                                                                                                                                                }
                                                                                                                                            ]
                                                                                                                                        },
                                                                                                                                        {
                                                                                                                                            "method_instance": {
                                                                                                                                                "method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
                                                                                                                                                "method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Any, ::Expr, ::Bool)"
                                                                                                                                            },
                                                                                                                                            "children": [
                                                                                                                                            ]
                                                                                                                                        },
                                                                                                                                        {
                                                                                                                                            "method_instance": {
                                                                                                                                                "method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
                                                                                                                                                "method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Expr, ::Expr, ::Bool)"
                                                                                                                                            },
                                                                                                                                            "children": [
                                                                                                                                            ]
                                                                                                                                        }
                                                                                                                                    ]
                                                                                                                                }
                                                                                                                            ]
                                                                                                                        }
                                                                                                                    ]
                                                                                                                }
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
                                                                                                                "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        },
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
                                                                                                                "method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        }
                                                                                                    ]
                                                                                                }
                                                                                            ]
                                                                                        },
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "calldoc(__source__, __module__, str, def::Expr) @ Base.Docs docs/Docs.jl:386",
                                                                                                "method_instance": "MethodInstance for Base.Docs.calldoc(::LineNumberNode, ::Module, ::Expr, ::Expr)"
                                                                                            },
                                                                                            "children": [
                                                                                                {
                                                                                                    "method_instance": {
                                                                                                        "method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
                                                                                                        "method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
                                                                                                    },
                                                                                                    "children": [
                                                                                                    ]
                                                                                                }
                                                                                            ]
                                                                                        }
                                                                                    ]
                                                                                },
                                                                                {
                                                                                    "method_instance": {
                                                                                        "method": "tryparse_internal(::Type{BigInt}, s::AbstractString, startpos::Int64, endpos::Int64, base_::Integer, raise::Bool) @ Base.GMP gmp.jl:290",
                                                                                        "method_instance": "MethodInstance for Base.tryparse_internal(::Type{BigInt}, ::AbstractString, ::Int64, ::Int64, ::Int64, ::Bool)"
                                                                                    },
                                                                                    "children": [
                                                                                        {
                                                                                            "method_instance": {
                                                                                                "method": "var\"#tryparse#467\"(base::Union{Nothing, Integer}, ::typeof(tryparse), ::Type{T}, s::AbstractString) where T<:Integer @ Base parse.jl:248",
                                                                                                "method_instance": "MethodInstance for Base.var\"#tryparse#467\"(::Nothing, ::typeof(tryparse), ::Type{BigInt}, ::AbstractString)"
                                                                                            },
                                                                                            "children": [
                                                                                                {
                                                                                                    "method_instance": {
                                                                                                        "method": "tryparse(::Type{T}, s::AbstractString; base) where T<:Integer @ Base parse.jl:248",
                                                                                                        "method_instance": "MethodInstance for tryparse(::Type{BigInt}, ::AbstractString)"
                                                                                                    },
                                                                                                    "children": [
                                                                                                        {
                                                                                                            "method_instance": {
                                                                                                                "method": "var\"@big_str\"(__source__::LineNumberNode, __module__::Module, s) @ Base int.jl:698",
                                                                                                                "method_instance": "MethodInstance for Core.var\"@big_str\"(::LineNumberNode, ::Module, ::Any)"
                                                                                                            },
                                                                                                            "children": [
                                                                                                            ]
                                                                                                        }
                                                                                                    ]
                                                                                                }
                                                                                            ]
                                                                                        }
                                                                                    ]
                                                                                }
                                                                            ]
                                                                        }
                                                                    ]
                                                                }
                                                            ]
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

@nsajko
Copy link
Contributor Author

nsajko commented Mar 11, 2025

@aviatesk as you can see above, the MethodInstance is:

Base.typejoin_union_tuple(::Type{Tuple{UnitRange{Int64}, Symbol, Any}})

Even though we have Type{Tuple{UnitRange{Int64}, Symbol, Any}} <: DataType, not all subtypes of Type{Tuple{UnitRange{Int64}, Symbol, Any}} are DataType, they're merely required to be equal to a DataType. That's the crux of the issue.

For example:

  • we have: Tuple{UnitRange{Int64}, Symbol, X} where {X} isa Type{Tuple{UnitRange{Int64}, Symbol, Any}}
  • but: !(Tuple{UnitRange{Int64}, Symbol, X} where {X} isa DataType)

Also see the linked issue #57667 and PR #57275.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport 1.12 Change should be backported to release-1.12 invalidations
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants