Skip to content

Commit 8e27ce4

Browse files
authored
Preserve optional static part on difference (#15503)
Fixes #15502
1 parent afedada commit 8e27ce4

2 files changed

Lines changed: 17 additions & 6 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ defmodule Module.Types.Descr do
333333
keep_optional: 1, remove_optional: 1, remove_optional_static: 1, optional_to_term: 1}
334334
defp keep_optional(descr) do
335335
case descr do
336+
%{dynamic: %{optional: 1}, optional: 1} -> %{dynamic: %{optional: 1}, optional: 1}
336337
%{dynamic: %{optional: 1}} -> %{dynamic: %{optional: 1}}
337338
%{optional: 1} -> %{optional: 1}
338339
_ -> @none

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ defmodule Module.Types.DescrTest do
114114
)
115115
end
116116

117+
test "optional" do
118+
# Test that union preserves optional properties
119+
t = opt_union(term(), dynamic(not_set()))
120+
assert subtype?(term(), t)
121+
assert subtype?(dynamic(), t)
122+
assert subtype?(dynamic(integer()), t)
123+
end
124+
117125
test "tuple" do
118126
assert equal?(opt_union(tuple(), tuple()), tuple())
119127

@@ -622,6 +630,14 @@ defmodule Module.Types.DescrTest do
622630
assert empty?(opt_difference(none(), dynamic()))
623631
assert empty?(opt_difference(dynamic(integer()), integer()))
624632
end
633+
634+
test "optional" do
635+
# Test that difference preserves optional properties
636+
x = if_set(dynamic(integer()))
637+
term_map = opt_union(integer(), opt_difference(term(), integer()))
638+
assert equal?(term_map, term())
639+
assert equal?(opt_difference(x, term()), opt_difference(x, term_map))
640+
end
625641

626642
test "tuple" do
627643
assert empty?(opt_difference(open_tuple([atom()]), open_tuple([term()])))
@@ -1033,12 +1049,6 @@ defmodule Module.Types.DescrTest do
10331049
refute subtype?(if_set(term()), term())
10341050
assert subtype?(if_set(term()), if_set(term()))
10351051
refute subtype?(if_set(term()), if_set(dynamic(term())))
1036-
1037-
# Test that union+dynamic optimizations preserves properties
1038-
t = opt_union(term(), dynamic(not_set()))
1039-
assert subtype?(term(), t)
1040-
assert subtype?(dynamic(), t)
1041-
assert subtype?(dynamic(integer()), t)
10421052
end
10431053

10441054
test "list" do

0 commit comments

Comments
 (0)