Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions lib/elixir/lib/module/types/descr.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3000,8 +3000,12 @@ defmodule Module.Types.Descr do
end
end

defp map_union_strategy([], [], _tag1, _tag2, status) do
status
defp map_union_strategy([], [], tag1, tag2, status) do
case status do
:left_subtype_of_right when tag1 == :open and tag2 == :closed -> :none
:right_subtype_of_left when tag1 == :closed and tag2 == :open -> :none
_ -> status
end
end

defp map_union_strategy(l1, l2, tag1, tag2, status) do
Expand Down
8 changes: 8 additions & 0 deletions lib/elixir/test/elixir/module/types/descr_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@ defmodule Module.Types.DescrTest do
a_integer_open = open_map(a: integer())
assert equal?(union(closed_map(a: integer()), a_integer_open), a_integer_open)

closed = closed_map(a: integer(), b: atom())
open = open_map(a: integer(), b: boolean())

assert subtype?(closed, union(closed, open))
assert subtype?(open, union(closed, open))
assert subtype?(closed, union(open, closed))
assert subtype?(open, union(open, closed))

# Domain key types
atom_to_atom = open_map([{domain_key(:atom), atom()}])
atom_to_integer = open_map([{domain_key(:atom), integer()}])
Expand Down
Loading