Skip to content

Commit 972df19

Browse files
committed
Work around compiler bug in Erlang/OTP 27+
1 parent 02deafd commit 972df19

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5887,13 +5887,19 @@ defmodule Module.Types.Descr do
58875887
end
58885888
end
58895889

5890-
defp bdd_difference(bdd1, bdd2, leaf_compare) when is_tuple(bdd1) and is_tuple(bdd2) do
5891-
bdd_difference(bdd_expand(bdd1), bdd_expand(bdd2), bdd1, bdd2, leaf_compare)
5892-
end
5890+
# We could use bdd_expand but there was a bug in earlier versions
5891+
# of the Erlang compiler which would emit bad ,code, so we match one by one.
5892+
defp bdd_difference({_, _, _, _} = bdd1, bdd_leaf(_, _) = a2, leaf_compare),
5893+
do: bdd_difference(bdd1, {a2, :bdd_top, :bdd_bot, :bdd_bot}, bdd1, a2, leaf_compare)
58935894

5894-
defp bdd_difference(bdd1, bdd2, _leaf_compare) do
5895-
bdd_difference(bdd1, bdd2)
5896-
end
5895+
defp bdd_difference(bdd_leaf(_, _) = a1, {_, _, _, _} = bdd2, leaf_compare),
5896+
do: bdd_difference({a1, :bdd_top, :bdd_bot, :bdd_bot}, bdd2, a1, bdd2, leaf_compare)
5897+
5898+
defp bdd_difference({_, _, _, _} = bdd1, {_, _, _, _} = bdd2, leaf_compare),
5899+
do: bdd_difference(bdd1, bdd2, bdd1, bdd2, leaf_compare)
5900+
5901+
defp bdd_difference(bdd1, bdd2, _leaf_compare),
5902+
do: bdd_difference(bdd1, bdd2)
58975903

58985904
# We have two formulas for differences.
58995905
#

0 commit comments

Comments
 (0)