From 6029d10d755a36b9305e2f86557008beb8be651f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Baru=C4=8Di=C4=87?= Date: Mon, 27 Sep 2021 16:32:24 +0200 Subject: [PATCH] Base: `intersect` keep the container type A bug was introduced for 3 arguments version of `intersect` in #41769. The container type always changed to `Set`: ``` julia> intersect(BitSet([1,2]), [1,2], [2]) Set{Int64} with 1 element: 2 ``` This is an attempt to return to the original behavior: ``` julia> intersect(BitSet([1,2]), [1,2], [2]) BitSet with 1 element: 2 ``` --- base/abstractset.jl | 8 +++++++- test/sets.jl | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/base/abstractset.jl b/base/abstractset.jl index c4ec114c1a645..fb17f250b4b72 100644 --- a/base/abstractset.jl +++ b/base/abstractset.jl @@ -129,7 +129,13 @@ Set{Int64} with 1 element: """ function intersect(s::AbstractSet, itr, itrs...) T = promote_eltype(s, itr, itrs...) - return intersect!(Set{T}(s), itr, itrs...) + if T == promote_eltype(s, itr) + out = intersect(s, itr) + else + out = union!(emptymutable(s, T), s) + intersect!(out, itr) + end + return intersect!(out, itrs...) end intersect(s) = union(s) intersect(s::AbstractSet, itr) = mapfilter(in(s), push!, itr, emptymutable(s, promote_eltype(s, itr))) diff --git a/test/sets.jl b/test/sets.jl index b49507876265d..5e5857e599a5b 100644 --- a/test/sets.jl +++ b/test/sets.jl @@ -254,6 +254,8 @@ end end @test intersect(Set([1]), BitSet()) isa Set{Int} @test intersect(BitSet([1]), Set()) isa Set{Any} + @test intersect(BitSet([1]), Set([1])) isa BitSet + @test intersect(BitSet([1]), Set([1]), Set([1])) isa BitSet @test intersect([1], BitSet()) isa Vector{Int} # intersect must uniquify @test intersect([1, 2, 1]) == intersect!([1, 2, 1]) == [1, 2] @@ -276,6 +278,10 @@ end @test eltype(intersect(a, a, b)) == Float64 end end + + # 3-argument version is correctly covered + @test intersect(Set([1,2]), Set([2]), Set([1,2,3])) == Set([2]) + @test intersect(Set([1,2]), Set([2]), Set([1.,2,3])) == Set([2.]) end @testset "setdiff" begin