From 6cb9140d9f58d3bccef711bd71e5ed95de0ed7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 15 Mar 2026 15:31:19 +0100 Subject: [PATCH] Remove unnecessary empty checks when computing previous types --- lib/elixir/lib/module/types/pattern.ex | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/lib/elixir/lib/module/types/pattern.ex b/lib/elixir/lib/module/types/pattern.ex index c3b3d2154b..1dec9c50ba 100644 --- a/lib/elixir/lib/module/types/pattern.ex +++ b/lib/elixir/lib/module/types/pattern.ex @@ -31,27 +31,21 @@ defmodule Module.Types.Pattern do defp args_to_previous([type]), do: upper_bound(type) defp args_to_previous(types), do: args_to_static_domain(types) - defp of_pattern_previous(types, {[], _}, _trees, _pattern_info, _tag, _stack, _context) do - {:ok, types, false} + defp of_pattern_previous(types, {[], _}, _stack) do + {types, false} end - defp of_pattern_previous(types, {_, descr}, trees, pattern_info, tag, stack, context) do + defp of_pattern_previous(types, {_, descr}, stack) do refined_types = case types do [type] -> [difference(type, descr)] [_ | _] -> args_to_domain(types) |> difference(descr) |> domain_to_flat_args(types) end - if index = Enum.find_index(types, &empty?/1) do - {_, _, pattern} = Enum.fetch!(trees, index) - context = badpattern_error(pattern, index, tag, stack, context) - {:error, error_vars(pattern_info, context)} - else - # check_previous? is an optimization. If types have not changed, - # it means args_types and previous are disjoint, and any further - # refinement will keep them disjoint, so no need to check for previous. - {:ok, refined_types, stack.mode != :infer and types != refined_types} - end + # check_previous? is an optimization. If types have not changed, + # it means args_types and previous are disjoint, and any further + # refinement will keep them disjoint, so no need to check for previous. + {refined_types, stack.mode != :infer and types != refined_types} end defp previous_to_string({list, _}) do @@ -247,8 +241,7 @@ defmodule Module.Types.Pattern do else _ -> nil end), - {:ok, types, check_previous?} <- - of_pattern_previous(types, previous, trees, pattern_info, tag, stack, context), + {types, check_previous?} = of_pattern_previous(types, previous, stack), {:ok, _types, context} <- of_pattern_refine(types, changed, pattern_info, tag, stack, context) do {trees, pattern_precise? and guard_precise?, check_previous?,