Skip to content

Commit 81975a2

Browse files
authored
Fix descr edge cases (#15338)
1 parent 133dfa8 commit 81975a2

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3242,15 +3242,15 @@ defmodule Module.Types.Descr do
32423242
end
32433243

32443244
defp map_literal_intersection_closed([{k1, v1} | t1], [{k2, _} | _] = l2) when k1 < k2 do
3245-
if v1 == @not_set do
3245+
if is_optional_static(v1) do
32463246
map_literal_intersection_closed(t1, l2)
32473247
else
32483248
throw(:empty)
32493249
end
32503250
end
32513251

32523252
defp map_literal_intersection_closed([{k1, _} | _] = l1, [{k2, v2} | t2]) when k1 > k2 do
3253-
if v2 == @not_set do
3253+
if is_optional_static(v2) do
32543254
map_literal_intersection_closed(l1, t2)
32553255
else
32563256
throw(:empty)
@@ -3262,8 +3262,8 @@ defmodule Module.Types.Descr do
32623262
end
32633263

32643264
defp map_literal_intersection_closed(t1, t2) do
3265-
if Enum.any?(t1, fn {_, v} -> v != @not_set end) or
3266-
Enum.any?(t2, fn {_, v} -> v != @not_set end) do
3265+
if Enum.any?(t1, fn {_, v} -> not is_optional_static(v) end) or
3266+
Enum.any?(t2, fn {_, v} -> not is_optional_static(v) end) do
32673267
throw(:empty)
32683268
end
32693269

@@ -5565,6 +5565,7 @@ defmodule Module.Types.Descr do
55655565
@doc """
55665566
Returns all of the values that are part of a tuple.
55675567
"""
5568+
def tuple_values(:term), do: :badtuple
55685569
def tuple_values(descr) when descr == %{}, do: :badtuple
55695570

55705571
def tuple_values(descr) do
@@ -5578,7 +5579,13 @@ defmodule Module.Types.Descr do
55785579

55795580
{dynamic, static} ->
55805581
if tuple_only?(static) and descr_key?(dynamic, :tuple) do
5581-
dynamic(process_tuples_values(Map.get(dynamic, :tuple, :bdd_bot)))
5582+
dynamic_value =
5583+
case dynamic do
5584+
:term -> term()
5585+
%{tuple: bdd} -> process_tuples_values(bdd)
5586+
end
5587+
5588+
dynamic(dynamic_value)
55825589
|> union(process_tuples_values(Map.get(static, :tuple, :bdd_bot)))
55835590
else
55845591
:badtuple

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,10 @@ defmodule Module.Types.DescrTest do
358358
closed_map(a: integer(), c: not_set())
359359
) ==
360360
closed_map(a: integer())
361+
362+
assert intersection(empty_map(), closed_map(a: if_set(integer()))) == empty_map()
363+
assert intersection(closed_map(a: if_set(integer())), empty_map()) == empty_map()
364+
refute disjoint?(empty_map(), closed_map(a: if_set(integer())))
361365
end
362366

363367
test "map with domain keys" do
@@ -1776,6 +1780,8 @@ defmodule Module.Types.DescrTest do
17761780
end
17771781

17781782
test "tuple_values" do
1783+
assert tuple_values(term()) == :badtuple
1784+
assert tuple_values(dynamic()) == dynamic()
17791785
assert tuple_values(integer()) == :badtuple
17801786
assert tuple_values(tuple([none()])) == :badtuple
17811787
assert tuple_values(tuple([])) == none()

0 commit comments

Comments
 (0)