diff --git a/lib/elixir/lib/module/types/descr.ex b/lib/elixir/lib/module/types/descr.ex index c2648be488e..0bf6d07f0f1 100644 --- a/lib/elixir/lib/module/types/descr.ex +++ b/lib/elixir/lib/module/types/descr.ex @@ -76,7 +76,7 @@ defmodule Module.Types.Descr do @not_set %{optional: 1} @term_or_optional Map.put(@term, :optional, 1) - @term_or_dynamic_optional Map.put(@term, :dynamic, %{optional: 1}) + @term_or_dynamic_optional Map.put(@term, :dynamic, @term_or_optional) @not_atom_or_optional Map.delete(@term_or_optional, :atom) @empty_intersection [0, :bdd_bot] diff --git a/lib/elixir/test/elixir/module/types/descr_test.exs b/lib/elixir/test/elixir/module/types/descr_test.exs index 54fa5401d68..fe5206b6c84 100644 --- a/lib/elixir/test/elixir/module/types/descr_test.exs +++ b/lib/elixir/test/elixir/module/types/descr_test.exs @@ -1033,6 +1033,12 @@ defmodule Module.Types.DescrTest do refute subtype?(if_set(term()), term()) assert subtype?(if_set(term()), if_set(term())) refute subtype?(if_set(term()), if_set(dynamic(term()))) + + # Test that union+dynamic optimizations preserves properties + t = opt_union(term(), dynamic(not_set())) + assert subtype?(term(), t) + assert subtype?(dynamic(), t) + assert subtype?(dynamic(integer()), t) end test "list" do