diff --git a/lib/elixir/lib/range.ex b/lib/elixir/lib/range.ex index 1ed62a0c59d..58886331864 100644 --- a/lib/elixir/lib/range.ex +++ b/lib/elixir/lib/range.ex @@ -517,6 +517,10 @@ defmodule Range do defp normalize(first, last, step) when first > last, do: {first - abs(div(first - last, step) * step), first, -step} + # A single-element range holds the same element regardless of the step, so + # make the step positive to keep the progression in disjoint?/2 increasing. + defp normalize(first, last, step) when first == last, do: {first, last, abs(step)} + defp normalize(first, last, step), do: {first, last, step} @doc false diff --git a/lib/elixir/test/elixir/range_test.exs b/lib/elixir/test/elixir/range_test.exs index 16009818b55..508d2d29178 100644 --- a/lib/elixir/test/elixir/range_test.exs +++ b/lib/elixir/test/elixir/range_test.exs @@ -103,6 +103,11 @@ defmodule RangeTest do assert_overlap(-7..-5, -5..-1) assert Range.disjoint?(1..1, 1..1) == false + + # Single-element ranges still contain their element regardless of the step + assert Range.disjoint?(1..1//-2, 1..1//-2) == false + assert Range.disjoint?(3..3//-3, 1..5) == false + assert Range.disjoint?(1..5, 3..3//-3) == false end end