Skip to content

Fix abs_squared, csc and to_polar specs - #32

Merged
polvalente merged 1 commit into
elixir-nx:mainfrom
lukaszsamson:fix-specs
Oct 20, 2026
Merged

polvalente merged 1 commit into
elixir-nx:mainfrom
lukaszsamson:fix-specs

Conversation

@lukaszsamson

Copy link
Copy Markdown
Contributor

Found with SpecLint on elixir 1.20.4

lib/complex.ex:692: warning: Complex.abs_squared/1: inferred return includes :infinity or :nan, which the spec does not declare
    @spec abs_squared(t() | number() | non_finite_number()) :: number()
    inferred: (%Complex{re: :nan, im: :nan} or :nan) -> :nan
    inferred: (%Complex{} or :infinity or :neg_infinity) -> :infinity
    inferred: (%Complex{re: float() or integer(), im: float() or integer()} or float() or integer()) -> dynamic(float() or integer())
lib/complex.ex:1623: warning: Complex.csc/1: inferred return includes :infinity or :nan or :neg_infinity or
  (%Complex{
     re: :infinity or :nan or :neg_infinity or float(),
     im: :infinity or :nan or :neg_infinity or float()
   } and not %Complex{re: float() or integer(), im: float() or integer()}) or float() or integer(), which the spec does not declare
    @spec csc(t()) :: t()
    @spec csc(number()) :: number()
    inferred: (%Complex{im: :nan} or %Complex{re: :nan} or
  %Complex{re: float() or integer(), im: :infinity or :nan or :neg_infinity} or
  %Complex{
    re: :infinity or :nan or :neg_infinity,
    im: :infinity or :nan or :neg_infinity or float() or integer()
  } or :infinity or :nan or :neg_infinity or
  (%Complex{im: not :nan} and
     not (%Complex{re: :nan} or
            %Complex{re: :infinity or :nan or :neg_infinity, im: float() or integer()} or
            %Complex{re: float() or integer(), im: :infinity or :nan or :neg_infinity})) or
  (%Complex{re: :infinity or :nan or :neg_infinity, im: :infinity or :nan or :neg_infinity} and
     not (%Complex{im: :nan} or %Complex{re: :nan})) or float() or integer()) -> dynamic(
  %Complex{
    re: :infinity or :nan or :neg_infinity or float(),
    im: :infinity or :nan or :neg_infinity or float()
  } or :infinity or :nan or :neg_infinity or float() or integer()
)
lib/complex.ex:350: warning: Complex.to_polar/1: inferred clause (float() or integer()) -> {float() or integer(), integer()} has a return disjoint from the spec return {:infinity or :nan or :neg_infinity or float(), :infinity or :nan or :neg_infinity or float()}
    @spec to_polar(t() | number() | non_finite_number()) ::
  {float() | non_finite_number(), float() | non_finite_number()}
    inferred: (%Complex{}) -> dynamic({:infinity or :nan or float() or integer(), term()})
    inferred: (not %Complex{}) -> dynamic({not %Complex{}, term()})
    inferred: (float() or integer()) -> dynamic({float() or integer(), integer()})
    inferred: (:infinity) -> {:infinity, integer()}
    inferred: (:neg_infinity) -> dynamic({:infinity, term()})
    inferred: (:nan) -> {:nan, :nan}

The functions return non-finite values and integers: Complex.abs_squared(:nan) #=> :nan, Complex.csc(0) #=> :infinity, Complex.to_polar(3) #=> {3, 0}. The specs now say so, reusing non_finite_number(). Not changed: Complex.csc(Complex.new(0, 0)) returns a %Complex{} with NaN parts, which t() (number parts) does not cover; I left t() alone.

@polvalente
polvalente merged commit 44161a0 into elixir-nx:main Oct 20, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants