Skip to content

Commit a342311

Browse files
committed
Fix loop while unifying type variables, closes #11658
1 parent b7bc1c3 commit a342311

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

lib/elixir/lib/module/types/unify.ex

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,15 @@ defmodule Module.Types.Unify do
130130

131131
%{^var => {:var, new_var} = var_type} ->
132132
unify_result =
133-
if var_source? do
134-
unify(var_type, type, stack, context)
135-
else
136-
unify(type, var_type, stack, context)
133+
cond do
134+
recursive_type?(var_type, [], context) ->
135+
{:ok, var_type, put_in(context.types[var], var_type)}
136+
137+
var_source? ->
138+
unify(var_type, type, stack, context)
139+
140+
true ->
141+
unify(type, var_type, stack, context)
137142
end
138143

139144
case unify_result do

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,5 +744,17 @@ defmodule Module.Types.TypesTest do
744744
)
745745
) == :none
746746
end
747+
748+
test "nested map updates" do
749+
assert warning(
750+
[state],
751+
(
752+
_foo = state.key.user_id
753+
_bar = state.key.user_id
754+
state = %{state | key: %{state.key | other_id: 1}}
755+
_baz = state.key.user_id
756+
)
757+
) == :none
758+
end
747759
end
748760
end

0 commit comments

Comments
 (0)