diff --git a/base/tuple.jl b/base/tuple.jl index 2b94d1d946e44..e614a89518223 100644 --- a/base/tuple.jl +++ b/base/tuple.jl @@ -268,12 +268,16 @@ function ==(t1::Tuple, t2::Tuple) if length(t1) != length(t2) return false end + anymissing = false for i = 1:length(t1) - if !(t1[i] == t2[i]) - return false - end + eq = (t1[i] == t2[i]) + if ismissing(eq) + anymissing = true + elseif !eq + return false + end end - return true + return anymissing ? missing : true end const tuplehash_seed = UInt === UInt64 ? 0x77cfa1eef01bca90 : 0xf01bca90 diff --git a/test/missing.jl b/test/missing.jl index a2ea8e3b1eaba..81b09667dd1d0 100644 --- a/test/missing.jl +++ b/test/missing.jl @@ -202,6 +202,7 @@ end @test Union{Int, Missing}[1] == Union{Float64, Missing}[1.0] @test Union{Int, Missing}[1] == [1.0] @test Union{Bool, Missing}[true] == BitArray([true]) + @test !([missing, 1] == [missing, 2]) @test !(Union{Int, Missing}[1] == [2]) @test !([1] == Union{Int, Missing}[2]) @test !(Union{Int, Missing}[1] == Union{Int, Missing}[2]) @@ -217,11 +218,26 @@ end @test !(Union{Int, Missing}[1] != Union{Float64, Missing}[1.0]) @test !(Union{Int, Missing}[1] != [1.0]) @test !(Union{Bool, Missing}[true] != BitArray([true])) + @test [missing, 1] != [missing, 2] @test Union{Int, Missing}[1] != [2] @test [1] != Union{Int, Missing}[2] @test Union{Int, Missing}[1] != Union{Int, Missing}[2] end +@testset "== and != on tuples" begin + @test ismissing((1, missing) == (1, missing)) + @test ismissing(("a", missing) == ("a", missing)) + @test ismissing((missing,) == (missing,)) + @test ismissing((missing, 2) == (1, missing)) + @test !((missing, 1) == (missing, 2)) + + @test ismissing((1, missing) != (1, missing)) + @test ismissing(("a", missing) != ("a", missing)) + @test ismissing((missing,) != (missing,)) + @test ismissing((missing, 2) != (1, missing)) + @test (missing, 1) != (missing, 2) +end + @testset "any & all" begin @test any([true, missing]) @test any(x -> x == 1, [1, missing])