From 535c5a30881d889b1af774eca25ce03f96b10a02 Mon Sep 17 00:00:00 2001 From: Lukasz Samson Date: Sun, 12 Jul 2026 09:10:11 +0200 Subject: [PATCH] Drop empty map lines in map_fetch_key_static no maps inhabit required key with `none()`. It should not contribute to the fetched value type Fixes #15592 --- lib/elixir/lib/module/types/descr.ex | 2 +- lib/elixir/test/elixir/module/types/descr_test.exs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/module/types/descr.ex b/lib/elixir/lib/module/types/descr.ex index 5bee8403ed..3ba033b728 100644 --- a/lib/elixir/lib/module/types/descr.ex +++ b/lib/elixir/lib/module/types/descr.ex @@ -3139,7 +3139,7 @@ defmodule Module.Types.Descr do end defp map_fetch_key_static(%{map: bdd}, key) do - bdd |> map_bdd_to_dnf_with_empty() |> map_dnf_fetch_static(key) + bdd |> map_bdd_to_dnf_remove_empty() |> map_dnf_fetch_static(key) end defp map_fetch_key_static(%{}, _key), do: {false, none()} diff --git a/lib/elixir/test/elixir/module/types/descr_test.exs b/lib/elixir/test/elixir/module/types/descr_test.exs index 70adcf749e..636897806e 100644 --- a/lib/elixir/test/elixir/module/types/descr_test.exs +++ b/lib/elixir/test/elixir/module/types/descr_test.exs @@ -2458,6 +2458,14 @@ defmodule Module.Types.DescrTest do |> opt_difference(open_map(a: atom([:foo, :bar]))) |> opt_difference(open_map(a: atom([:foo, :baz]))) |> map_fetch_key(:a) == {false, integer()} + + t = closed_map(a: term()) + knife = open_map(c: none()) + cover = opt_union(t, knife) + t2 = opt_difference(cover, opt_difference(cover, t)) + assert equal?(t, t2) + assert map_fetch_key(t, :a) == {false, term()} + assert map_fetch_key(t2, :a) == map_fetch_key(t, :a) end # Times out without a projection-only map_fetch_key path