# Type instability issue with parameterizable struct and tuples

**URL:** <https://discourse.julialang.org/t/type-instability-issue-with-parameterizable-struct-and-tuples/93088>\
**Category:** General Usage\
**Created:** [January 17, 2023, 12:37pm UTC](https://discourse.julialang.org/t/type-instability-issue-with-parameterizable-struct-and-tuples/93088 "2023-01-17T12:37:48Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![zsoerenm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zsoerenm/32/664_2.png) [@zsoerenm](https://discourse.julialang.org/u/zsoerenm)\
**Post date:** [January 17, 2023, 12:37pm UTC](https://discourse.julialang.org/t/type-instability-issue-with-parameterizable-struct-and-tuples/93088/1 "2023-01-17T12:37:49Z")

</div>

Here is a MWE:

```julia
struct Foo{T}
    buffer::Vector{Complex{T}}
end

function Foo(T, num_samples)
    Foo(Vector{Complex{T}}(undef, num_samples))
end

function foos(T, states, num_samples)
    map(y -> map(x -> Foo(T, num_samples), y), states)
end
function foos(states, num_samples)
    foos(Float32, states, num_samples)
end

```

```julia
julia> @code_warntype foos(([1],), 10)
MethodInstance for foos(::Tuple{Vector{Int64}}, ::Int64)
  from foos(states, num_samples::Integer) in Main at REPL[4]:1
Arguments
  #self#::Core.Const(foos)
  states::Tuple{Vector{Int64}}
  num_samples::Int64
Body::Tuple{Vector} # This is red
1 ─ %1 = Main.foos(Main.Float32, states, num_samples)::Tuple{Vector}
└── return %1

```

It looks like it can not infer the complete Tuple.  
I used Cthulhu to find the root cause of this and found out that the DataType is the problem.  
If I make the following change

```julia
function foos(T, states, num_samples)
    map(y -> map(x -> Foo(Float32, num_samples), y), states) # previously: map(y -> map(x -> Foo(T, num_samples), y), states)
end

```

everything is type stable:

```julia
julia> @code_warntype foos(([1],), 10)
MethodInstance for foos(::Tuple{Vector{Int64}}, ::Int64)
  from foos(states, num_samples::Integer) in Main at REPL[4]:1
Arguments
  #self#::Core.Const(foos)
  states::Tuple{Vector{Int64}}
  num_samples::Int64
Body::Tuple{Vector{Foo{Float32}}}
1 ─ %1 = Main.foos(Main.Float32, states, num_samples)::Tuple{Vector{Foo{Float32}}}
└── return %1

```

How can I fix this type instability without hard coding `T` to be `Float32`?

```julia
julia> versioninfo()
Julia Version 1.8.5
Commit 17cfb8e65ea (2023-01-08 06:45 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 16 × AMD Ryzen 7 PRO 5850U with Radeon Graphics
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-13.0.1 (ORCJIT, znver3)
  Threads: 1 on 16 virtual cores

```

---

<div class="post-metadata">

**Author:** ![JeffreySarnoff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jeffreysarnoff/32/1980_2.png) [@JeffreySarnoff](https://discourse.julialang.org/u/JeffreySarnoff)\
**Post date:** [January 17, 2023, 1:01pm UTC](https://discourse.julialang.org/t/type-instability-issue-with-parameterizable-struct-and-tuples/93088/2 "2023-01-17T13:01:08Z")

</div>

do it this way

```julia
struct Foo{T}
    buffer::Vector{Complex{T}}
end

 function Foo(::Type{T}, num_samples) where {T}
     Foo(Vector{Complex{T}}(undef, num_samples))
 end

function foos(::Type{T}, states, num_samples) where {T}
    map(y -> map(x -> Foo(T, num_samples), y), states)
end

function foos(states, num_samples)
    foos(Float32, states, num_samples)
end

```

then

```julia
julia> @code_warntype foos(([1],), 10)
MethodInstance for foos(::Tuple{Vector{Int64}}, ::Int64)
  from foos(states, num_samples) @ Main REPL[9]:1
Arguments
  #self#::Core.Const(foos)
  states::Tuple{Vector{Int64}}
  num_samples::Int64
Body::Tuple{Vector{Foo{Float32}}}
1 ─ %1 = Main.foos(Main.Float32, states, num_samples)::Tuple{Vector{Foo{Float32}}}
└── return %1

```
