@@ -2990,7 +2990,7 @@ defmodule Module.Types.Descr do
29902990 bdd_leaf ( tag , fields_store ( key , t_diff , fields ) )
29912991 end
29922992
2993- _ ->
2993+ :none ->
29942994 bdd_difference ( map1 , map2 )
29952995 end
29962996
@@ -3011,7 +3011,7 @@ defmodule Module.Types.Descr do
30113011 :disjoint -> :disjoint
30123012 :left_subtype_of_right -> :subtype
30133013 { :one_key_difference , _ , v1 , v2 } -> if subtype? ( v1 , v2 ) , do: :subtype , else: :none
3014- _ -> :none
3014+ :none -> :none
30153015 end
30163016 end
30173017
@@ -4332,16 +4332,20 @@ defmodule Module.Types.Descr do
43324332 do: { false , map_domain_tag_to_type ( tag ) , map_new ( tag , fields ) }
43334333
43344334 # Continue to eliminate negations while length of list of negs decreases
4335- defp map_eliminate_while_negs_decrease ( tag , fields , [ ] ) , do: { tag , fields , [ ] }
4335+ defp map_eliminate_while_negs_decrease ( tag , fields , [ ] ) , do: [ { tag , fields , [ ] } ]
43364336
43374337 defp map_eliminate_while_negs_decrease ( tag , fields , negs ) do
4338- n = length ( negs )
4339- { fields , negs } = maybe_eliminate_map_negations ( tag , fields , negs )
4340-
4341- if length ( negs ) < n do
4342- map_eliminate_while_negs_decrease ( tag , fields , negs )
4338+ try do
4339+ maybe_eliminate_map_negations ( tag , fields , negs )
4340+ catch
4341+ :empty -> [ ]
43434342 else
4344- { tag , fields , negs }
4343+ { fields , new_negs } ->
4344+ if length ( new_negs ) < length ( negs ) do
4345+ map_eliminate_while_negs_decrease ( tag , fields , new_negs )
4346+ else
4347+ [ { tag , fields , new_negs } ]
4348+ end
43454349 end
43464350 end
43474351
@@ -4366,7 +4370,10 @@ defmodule Module.Types.Descr do
43664370 :disjoint ->
43674371 { acc_fields , acc_negs }
43684372
4369- _ ->
4373+ :left_subtype_of_right ->
4374+ throw ( :empty )
4375+
4376+ :none ->
43704377 { acc_fields , [ neg | acc_negs ] }
43714378 end
43724379 end
@@ -4522,8 +4529,8 @@ defmodule Module.Types.Descr do
45224529
45234530 defp map_to_quoted ( bdd , opts ) do
45244531 bdd
4525- |> map_bdd_to_dnf_no_negations ( )
4526- |> Enum . map ( fn { tag , fields , negs } ->
4532+ |> map_bdd_to_dnf_with_negations ( )
4533+ |> Enum . flat_map ( fn { tag , fields , negs } ->
45274534 map_eliminate_while_negs_decrease ( tag , fields , negs )
45284535 end )
45294536 |> map_fusion ( )
0 commit comments