diff --git a/base/reflection.jl b/base/reflection.jl index 2df713a531fae..935809d66cc02 100644 --- a/base/reflection.jl +++ b/base/reflection.jl @@ -1003,12 +1003,15 @@ function datatype_fieldcount(t::DataType) return fieldcount(types) end return nothing - elseif isabstracttype(t) || (t.name === Tuple.name && isvatuple(t)) + elseif isabstracttype(t) return nothing end - if isdefined(t, :types) + if t.name === Tuple.name + isvatuple(t) && return nothing return length(t.types) end + # Equivalent to length(t.types), but `t.types` is lazy and we do not want + # to be forced to compute it. return length(t.name.names) end diff --git a/test/compiler/inference.jl b/test/compiler/inference.jl index 358b165f1d7e8..870eeaaf0687b 100644 --- a/test/compiler/inference.jl +++ b/test/compiler/inference.jl @@ -5725,3 +5725,6 @@ let interp = CachedConditionalInterp(); result.linfo.def.name === :func_cached_conditional end == 1 end + +# fieldcount on `Tuple` should constant fold, even though `.fields` not const +@test fully_eliminated(Base.fieldcount, Tuple{Type{Tuple{Nothing, Int, Int}}})