jeremyjh / dialyxir

Mix tasks to simplify use of Dialyzer in Elixir projects.
Apache License 2.0
1.69k stars 141 forks source link

Dializer failed pattern match in 'case' clause in 'with' clause #483

Open ByeongUkChoi opened 1 year ago

ByeongUkChoi commented 1 year ago

Precheck

Environment

Current behavior

dializer succeeds in Foo.test_1/0 But Foo.test_2/0 failed

defmodule Foo do
  def test_1() do
    with {:ok, _} <- aa(),
         {:ok, _} <- bb(),
         {:ok, _} <- cc() do
      :success
    else
      nil -> :error_c
      {:error, _} -> :error_a
      {:error, _, _} -> :error_b
    end
  end

  def test_2() do
    with {:ok, _} <- aa(),
         {:ok, _} <- bb(),
         {:ok, _} <- cc() do
      :success
    else
      nil ->
        :error_c

      err ->
        case err do
          {:error, _} -> :error_a
          {:error, _, _} -> :error_b
        end
    end
  end

  defp aa() do
    if Enum.random(0..1) == 1 do
      {:ok, 1}
    else
      {:error, 2}
    end
  end

  defp bb() do
    if Enum.random(0..1) == 1 do
      {:ok, 3}
    else
      {:error, 4, 5}
    end
  end

  defp cc() do
    if Enum.random(0..1) == 1 do
      {:ok, 6}
    else
      nil
    end
  end
end

Expected behavior

Everyone needs to succeed. all functions(test_1, test_2) work successfully.