diff --git a/base/inference.jl b/base/inference.jl index e2d3e6a6932ad..1050efba149b6 100644 --- a/base/inference.jl +++ b/base/inference.jl @@ -857,8 +857,10 @@ function precise_container_types(args, types, vtypes::VarTable, sv) result = cell(n) for i = 1:n ai = args[i]; ti = types[i]; tti = widenconst(ti) - if isa(ai,Expr) && ai.head === :call && (abstract_evals_to_constant(ai.args[1], svec, vtypes, sv) || - abstract_evals_to_constant(ai.args[1], tuple, vtypes, sv)) + if isa(ti, Const) && (isa(ti.val, SimpleVector) || isa(ti.val, Tuple)) + result[i] = Any[ abstract_eval_constant(x) for x in ti.val ] + elseif isa(ai,Expr) && ai.head === :call && (abstract_evals_to_constant(ai.args[1], svec, vtypes, sv) || + abstract_evals_to_constant(ai.args[1], tuple, vtypes, sv)) aa = ai.args result[i] = Any[ (isa(aa[j],Expr) ? aa[j].typ : abstract_eval(aa[j],vtypes,sv)) for j=2:length(aa) ] if _any(isvarargtype, result[i]) diff --git a/test/inference.jl b/test/inference.jl index 1dcf0b881dcb2..f1faa5f5b0fac 100644 --- a/test/inference.jl +++ b/test/inference.jl @@ -252,3 +252,10 @@ end let g() = Int <: Real ? 1 : "" @test Base.return_types(g, Tuple{}) == [Int] end + +# issue #10880 +function cat10880(a, b) + Tuple{a.parameters..., b.parameters...} +end +@test Base.return_types(cat10880, Tuple{Type{Tuple{Int8,Int16}},Type{Tuple{Int32}}})[1] == + Type{Tuple{Int8,Int16,Int32}}