From e79f7fb99e4e939de8116809e0bc2f45813099f6 Mon Sep 17 00:00:00 2001 From: pnezis Date: Fri, 10 Jul 2026 19:34:10 +0300 Subject: [PATCH] Reject non-integer arguments in `Integer.extended_gcd/2` zero clauses The zero base-case clauses guarded only on comparison with 0, so under Erlang term ordering non-integer arguments (floats, atoms) matched when the other argument was 0, e.g. `Integer.extended_gcd(2.5, 0)` returned `{2.5, 1, 0}` instead of raising, violating the spec and diverging from `Integer.gcd/2`. --- lib/elixir/lib/integer.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex index 5506fac8d09..d8ed7ed1547 100644 --- a/lib/elixir/lib/integer.ex +++ b/lib/elixir/lib/integer.ex @@ -545,10 +545,10 @@ defmodule Integer do @doc since: "1.12.0" @spec extended_gcd(integer, integer) :: {non_neg_integer, integer, integer} def extended_gcd(0, 0), do: {0, 0, 0} - def extended_gcd(0, b) when b > 0, do: {b, 0, 1} - def extended_gcd(0, b) when b < 0, do: {-b, 0, -1} - def extended_gcd(a, 0) when a > 0, do: {a, 1, 0} - def extended_gcd(a, 0) when a < 0, do: {-a, -1, 0} + def extended_gcd(0, b) when is_integer(b) and b > 0, do: {b, 0, 1} + def extended_gcd(0, b) when is_integer(b) and b < 0, do: {-b, 0, -1} + def extended_gcd(a, 0) when is_integer(a) and a > 0, do: {a, 1, 0} + def extended_gcd(a, 0) when is_integer(a) and a < 0, do: {-a, -1, 0} def extended_gcd(integer1, integer2) when is_integer(integer1) and is_integer(integer2) do extended_gcd(integer2, integer1, 0, 1, 1, 0)