# Subtyping with union as type parameter

**URL:** <https://discourse.julialang.org/t/subtyping-with-union-as-type-parameter/32326>\
**Category:** General Usage\
**Created:** [December 16, 2019, 10:19am UTC](https://discourse.julialang.org/t/subtyping-with-union-as-type-parameter/32326 "2019-12-16T10:19:31Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![rapus95](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rapus95/32/3773_2.png) [@rapus95](https://discourse.julialang.org/u/rapus95)\
**Post date:** [December 16, 2019, 10:19am UTC](https://discourse.julialang.org/t/subtyping-with-union-as-type-parameter/32326/1 "2019-12-16T10:19:31Z")

</div>

```julia
abstract type AbstractGrid{T, F, V} <: AbstractArray{Union{T,Missing},2} end

```

Why the `Union{T,Missing}` impedes the compilation here?  
I always get a `UndefRefError: access to undefined reference`.

EDIT: Seems to be related to Revise @tim.holy

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [December 16, 2019, 11:13am UTC](https://discourse.julialang.org/t/subtyping-with-union-as-type-parameter/32326/2 "2019-12-16T11:13:00Z")

</div>

```julia
julia> using Revise

julia> abstract type AbstractGrid{T, F, V} <: AbstractArray{Union{T,Missing},2} end
# no error

```

?

---

<div class="post-metadata">

**Author:** ![rapus95](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rapus95/32/3773_2.png) [@rapus95](https://discourse.julialang.org/u/rapus95)\
**Post date:** [December 16, 2019, 11:37am UTC](https://discourse.julialang.org/t/subtyping-with-union-as-type-parameter/32326/3 "2019-12-16T11:37:04Z")

</div>

use  
`includet("mod.jl")`  
where mod.jl contains:

```julia
module SomeModule
abstract type AbstractType <: AbstractArray{Union{Int,Missing},2} end
end

```

results in that error:

```julia
julia> includet("mod.jl")
UndefRefError: access to undefined reference
Stacktrace:
 [1] getindex at .\array.jl:744 [inlined]
 [2] lookup_var at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:4 [inlined]
 [3] lookup_or_eval(::Any, ::JuliaInterpreter.Frame, ::Any) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:77
 [4] lookup_or_eval(::Any, ::JuliaInterpreter.Frame, ::Any) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:87
 [5] evaluate_abstracttype(::Any, ::JuliaInterpreter.Frame, ::Expr) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:318
 [6] step_expr!(::Any, ::JuliaInterpreter.Frame, ::Any, ::Bool) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:467
 [7] #methods_by_execution!#14(::Bool, ::Bool, ::typeof(Revise.methods_by_execution!), ::Any, ::Revise.CodeTrackingMethodInfo, ::Dict{Module,Array{Expr,1}}, ::JuliaInterpreter.Frame) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\lowered.jl:70
 [8] #methods_by_execution! at .\none:0 [inlined]
 [9] #methods_by_execution!#9(::Base.Iterators.Pairs{Symbol,Bool,Tuple{Symbol},NamedTuple{(:define,),Tuple{Bool}}}, ::typeof(Revise.methods_by_execution!), ::Any, ::Revise.CodeTrackingMethodInfo, ::Dict{Module,Array{Expr,1}}, ::Module, ::Expr) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\lowered.jl:49
 [10] #methods_by_execution! at .\none:0 [inlined]
 [11] #eval_with_signatures#63(::Bool, ::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(Revise.eval_with_signatures), ::Module, ::Expr) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:351
 [12] eval_with_signatures at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:349 [inlined]
 [13] (::Revise.var"#61#62"{OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}},OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}},Module})() at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:285
 [14] with_logstate(::Revise.var"#61#62"{OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}},OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}},Module}, ::Base.CoreLogging.LogState) at .\logging.jl:395
 [15] with_logger at .\logging.jl:491 [inlined]
 [16] eval_new! at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:275 [inlined]
 [17] eval_new!(::OrderedCollections.OrderedDict{Module,OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}}}, ::OrderedCollections.OrderedDict{Module,OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}}}) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:327
 [18] revise() at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:543
 [19] revise at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:567 [inlined]
 [20] run_backend(::REPL.REPLBackend) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:970
 [21] (::Revise.var"#79#81"{REPL.REPLBackend})() at .\task.jl:333
while evaluating
begin
    #= C:\Users\Matthis\.julia\dev\GridEnhancing\src\mod.jl:1 =#
    #= C:\Users\Matthis\.julia\dev\GridEnhancing\src\mod.jl:1 =#
    #= C:\Users\Matthis\.julia\dev\GridEnhancing\src\mod.jl:2 =#
    abstract type AbstractType <: AbstractArray{Union{Int, Missing}, 2} end
end
in module Main.SomeModule
┌ Error: evaluation error
│ mod = Main.SomeModule
│ ex =
│ quote
│ #= C:\Users\Matthis\.julia\dev\GridEnhancing\src\mod.jl:1 =#
│ #= C:\Users\Matthis\.julia\dev\GridEnhancing\src\mod.jl:1 =#
│ #= C:\Users\Matthis\.julia\dev\GridEnhancing\src\mod.jl:2 =#
│ abstract type AbstractType <: AbstractArray{Union{Int, Missing}, 2} end
│ end
│ exception =
│ UndefRefError: access to undefined reference
│ Stacktrace:
│ [1] getindex at .\array.jl:744 [inlined]
│ [2] lookup_var at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:4 [inlined]
│ [3] lookup_or_eval(::Any, ::JuliaInterpreter.Frame, ::Any) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:77
│ [4] lookup_or_eval(::Any, ::JuliaInterpreter.Frame, ::Any) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:87
│ [5] evaluate_abstracttype(::Any, ::JuliaInterpreter.Frame, ::Expr) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:318
│ [6] step_expr!(::Any, ::JuliaInterpreter.Frame, ::Any, ::Bool) at C:\Users\Matthis\.julia\packages\JuliaInterpreter\ATirK\src\interpret.jl:467
│ [7] #methods_by_execution!#14(::Bool, ::Bool, ::typeof(Revise.methods_by_execution!), ::Any, ::Revise.CodeTrackingMethodInfo, ::Dict{Module,Array{Expr,1}}, ::JuliaInterpreter.Frame) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\lowered.jl:70
│ [8] #methods_by_execution! at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\lowered.jl:0 [inlined]
│ [9] #methods_by_execution!#9(::Base.Iterators.Pairs{Symbol,Bool,Tuple{Symbol,Symbol},NamedTuple{(:define, :skip_include),Tuple{Bool,Bool}}}, ::typeof(Revise.methods_by_execution!), ::Any, ::Revise.CodeTrackingMethodInfo, ::Dict{Module,Array{Expr,1}}, ::Module, ::Expr) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\lowered.jl:49
│ [10] #methods_by_execution! at .\none:0 [inlined]
│ [11] #eval_with_signatures#63(::Bool, ::Base.Iterators.Pairs{Symbol,Bool,Tuple{Symbol},NamedTuple{(:skip_include,),Tuple{Bool}}}, ::typeof(Revise.eval_with_signatures), ::Module, ::Expr) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:351
│ [12] #eval_with_signatures at .\none:0 [inlined]
│ [13] #instantiate_sigs!#64(::Bool, ::Base.Iterators.Pairs{Symbol,Bool,Tuple{Symbol},NamedTuple{(:skip_include,),Tuple{Bool}}}, ::typeof(Revise.instantiate_sigs!), ::OrderedCollections.OrderedDict{Module,OrderedCollections.OrderedDict{Revise.RelocatableExpr,Union{Nothing, Array{Any,1}}}}) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:359
│ [14] #instantiate_sigs! at .\none:0 [inlined]
│ [15] #track#69(::Bool, ::Bool, ::typeof(Revise.track), ::Module, ::String) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:614
│ [16] #track at .\none:0 [inlined]
│ [17] includet(::Module, ::String) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:662
│ [18] includet(::String) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:672
│ [19] top-level scope at REPL[3]:1
│ [20] eval(::Module, ::Any) at .\boot.jl:330
│ [21] eval_user_input(::Any, ::REPL.REPLBackend) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.3\REPL\src\REPL.jl:86
│ [22] run_backend(::REPL.REPLBackend) at C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\Revise.jl:973
│ [23] (::Revise.var"#79#81"{REPL.REPLBackend})() at .\task.jl:333
└ @ Revise C:\Users\Matthis\.julia\packages\Revise\cbX7Q\src\lowered.jl:52

```

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [December 16, 2019, 5:48pm UTC](https://discourse.julialang.org/t/subtyping-with-union-as-type-parameter/32326/4 "2019-12-16T17:48:31Z")

</div>

This will be fixed by JuliaInterpreter 0.7.6, scheduled to be released momentarily.
