From 44855863aa5be116e22d59fe5f64a121aaadbe57 Mon Sep 17 00:00:00 2001 From: KristofferC Date: Mon, 18 Oct 2021 09:32:35 +0200 Subject: [PATCH] revert isequal inference improvement (#40594) to fix #42457 --- base/tuple.jl | 12 ++++-------- test/tuple.jl | 8 ++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/base/tuple.jl b/base/tuple.jl index b45e1efc91413..28be1338a5cb1 100644 --- a/base/tuple.jl +++ b/base/tuple.jl @@ -380,14 +380,10 @@ filter(f, t::Tuple) = length(t) < 32 ? filter_rec(f, t) : Tuple(filter(f, collec ## comparison ## -isequal(t1::Tuple, t2::Tuple) = length(t1) == length(t2) && _isequal(t1, t2) -_isequal(::Tuple{}, ::Tuple{}) = true -function _isequal(t1::Tuple{Any,Vararg{Any,N}}, t2::Tuple{Any,Vararg{Any,N}}) where {N} - isequal(t1[1], t2[1]) || return false - t1, t2 = tail(t1), tail(t2) - # avoid dynamic dispatch by telling the compiler relational invariants - return isa(t1, Tuple{}) ? true : _isequal(t1, t2::Tuple{Any,Vararg{Any}}) -end +isequal(t1::Tuple, t2::Tuple) = (length(t1) == length(t2)) && _isequal(t1, t2) +_isequal(t1::Tuple{}, t2::Tuple{}) = true +_isequal(t1::Tuple{Any}, t2::Tuple{Any}) = isequal(t1[1], t2[1]) +_isequal(t1::Tuple, t2::Tuple) = isequal(t1[1], t2[1]) && _isequal(tail(t1), tail(t2)) function _isequal(t1::Any32, t2::Any32) for i = 1:length(t1) if !isequal(t1[i], t2[i]) diff --git a/test/tuple.jl b/test/tuple.jl index b5f8477130d03..acd542d883241 100644 --- a/test/tuple.jl +++ b/test/tuple.jl @@ -671,3 +671,11 @@ end # https://github.com/JuliaLang/julia/issues/40814 @test Base.return_types(NTuple{3,Int}, (Vector{Int},)) == Any[NTuple{3,Int}] + +@testset "inference through isequal #42457" begin + function fluffs(a::Tuple{Int,Int,Int}, b::Tuple)::Bool + return Base.isequal(a, Base.inferencebarrier(b)::Tuple) + end + + @test fluffs((1, 1, 1), (1, 1, 1)) +end