Skip to content

Commit fabbf5e

Browse files
committed
Do not store not_set() on closed maps
1 parent 0435602 commit fabbf5e

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3167,7 +3167,12 @@ defmodule Module.Types.Descr do
31673167

31683168
# Directly inserts a key of a given type into every positive and negative map.
31693169
defp map_put_key_static(%{map: bdd} = descr, key, type) do
3170-
bdd = bdd_map(bdd, fn {tag, fields} -> {tag, Map.put(fields, key, type)} end)
3170+
bdd =
3171+
bdd_map(bdd, fn
3172+
{:closed, fields} when type == @not_set -> {:closed, fields}
3173+
{tag, fields} -> {tag, Map.put(fields, key, type)}
3174+
end)
3175+
31713176
%{descr | map: bdd}
31723177
end
31733178

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ defmodule Module.Types.MapTest do
9494
describe "Map.delete/2" do
9595
test "checking" do
9696
assert typecheck!(Map.delete(%{}, :key)) ==
97-
closed_map(key: not_set())
97+
empty_map()
9898

9999
assert typecheck!(Map.delete(%{key: 123}, :key)) ==
100-
closed_map(key: not_set())
100+
empty_map()
101101

102102
assert typecheck!([x], Map.delete(x, :key)) ==
103103
dynamic(open_map(key: not_set()))
@@ -108,8 +108,8 @@ defmodule Module.Types.MapTest do
108108
Map.delete(%{foo: 123}, if(condition?, do: :foo, else: :bar))
109109
) ==
110110
union(
111-
closed_map(foo: not_set()),
112-
closed_map(foo: integer(), bar: not_set())
111+
empty_map(),
112+
closed_map(foo: integer())
113113
)
114114

115115
assert typecheck!([x], Map.delete(x, 123)) == dynamic(open_map())
@@ -252,14 +252,13 @@ defmodule Module.Types.MapTest do
252252
describe "Map.from_struct/1" do
253253
test "checking" do
254254
assert typecheck!(Map.from_struct(%{})) ==
255-
closed_map(__struct__: not_set())
255+
empty_map()
256256

257257
assert typecheck!(Map.from_struct(%{key: 123})) ==
258-
closed_map(key: integer(), __struct__: not_set())
258+
closed_map(key: integer())
259259

260260
assert typecheck!(Map.from_struct(%URI{})) ==
261261
closed_map(
262-
__struct__: not_set(),
263262
authority: atom([nil]),
264263
fragment: atom([nil]),
265264
host: atom([nil]),

0 commit comments

Comments
 (0)