diff --git a/base/inference.jl b/base/inference.jl index e0046531a11a42..068e6ae79723c1 100644 --- a/base/inference.jl +++ b/base/inference.jl @@ -968,8 +968,10 @@ function precise_container_types(args, types, vtypes::VarTable, sv) if isa(tti, TypeConstructor) tti = tti.body end - 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 6741e4644429b1..0e777699295d7c 100644 --- a/test/inference.jl +++ b/test/inference.jl @@ -415,3 +415,9 @@ gpure(x::Irrational) = fpure(x) @test @code_typed(gpure(π))[1].pure @test gpure() == gpure() == gpure() @test gpure(π) == gpure(π) == gpure(π) + +# issue #10880 +function cat10880(a, b) + Tuple{a.parameters..., b.parameters...} +end +@inferred cat10880(Tuple{Int8,Int16}, Tuple{Int32})