diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex index 3b5da375168..7dd894d6860 100644 --- a/lib/elixir/lib/integer.ex +++ b/lib/elixir/lib/integer.ex @@ -297,8 +297,9 @@ defmodule Integer do defp undigits([], _base, acc), do: acc - defp undigits([digit | _], base, _) when is_integer(digit) and digit >= base, - do: raise(ArgumentError, "invalid digit #{digit} in base #{base}") + defp undigits([digit | _], base, _) + when is_integer(digit) and (digit >= base or digit <= -base), + do: raise(ArgumentError, "invalid digit #{digit} in base #{base}") defp undigits([digit | tail], base, acc) when is_integer(digit), do: undigits(tail, base, acc * base + digit) diff --git a/lib/elixir/test/elixir/integer_test.exs b/lib/elixir/test/elixir/integer_test.exs index 5069eb58da0..db94d6b07a9 100644 --- a/lib/elixir/test/elixir/integer_test.exs +++ b/lib/elixir/test/elixir/integer_test.exs @@ -144,6 +144,14 @@ defmodule IntegerTest do assert_raise ArgumentError, "invalid digit 17 in base 16", fn -> Integer.undigits([1, 2, 17], 16) end + + assert_raise ArgumentError, "invalid digit -10 in base 10", fn -> + Integer.undigits([-10], 10) + end + + assert_raise ArgumentError, "invalid digit -17 in base 16", fn -> + Integer.undigits([1, 2, -17], 16) + end end test "parse/2" do