Skip to content

Commit 2f2ad5c

Browse files
committed
Add additional emptiness checks for tuple elements
1 parent 6f92d3c commit 2f2ad5c

2 files changed

Lines changed: 22 additions & 2 deletions

File tree

lib/elixir/lib/module/types/descr.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4990,8 +4990,13 @@ defmodule Module.Types.Descr do
49904990
defp tuple_sizes_strategy(_, _, _, _), do: :none
49914991

49924992
# Intersects two lists of types, and _appends_ the extra elements to the result.
4993-
defp zip_non_empty_intersection!([], types2, acc), do: Enum.reverse(acc, types2)
4994-
defp zip_non_empty_intersection!(types1, [], acc), do: Enum.reverse(acc, types1)
4993+
defp zip_non_empty_intersection!([], types2, acc) do
4994+
if Enum.any?(types2, &empty?/1), do: throw(:empty), else: Enum.reverse(acc, types2)
4995+
end
4996+
4997+
defp zip_non_empty_intersection!(types1, [], acc) do
4998+
if Enum.any?(types1, &empty?/1), do: throw(:empty), else: Enum.reverse(acc, types1)
4999+
end
49955000

49965001
defp zip_non_empty_intersection!([type1 | rest1], [type2 | rest2], acc) do
49975002
zip_non_empty_intersection!(rest1, rest2, [non_empty_intersection!(type1, type2) | acc])

lib/elixir/test/elixir/module/types/descr_test.exs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,21 @@ defmodule Module.Types.DescrTest do
292292

293293
assert intersection(tuple([term(), integer()]), tuple([atom(), term()]))
294294
|> equal?(tuple([atom(), integer()]))
295+
296+
empty_field =
297+
closed_map(key: atom([:value]))
298+
|> difference(open_map(key: atom(), optional: if_set(atom())))
299+
300+
assert empty?(empty_field)
301+
refute empty_field == none()
302+
303+
assert intersection(open_tuple([integer()]), tuple([integer(), empty_field]))
304+
|> equal?(none())
305+
306+
assert intersection(tuple([integer(), empty_field]), open_tuple([integer()]))
307+
|> equal?(none())
308+
309+
assert intersection(tuple(), tuple([integer(), empty_field])) |> equal?(none())
295310
end
296311

297312
test "map" do

0 commit comments

Comments
 (0)