Skip to content

Commit 1c17f1e

Browse files
authored
Fix bug when using pinned variable in with else block (#13667)
1 parent a39f469 commit 1c17f1e

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

lib/elixir/src/elixir_erl_pass.erl

+2-2
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,8 @@ translate_with_else(Meta, [{'else', Else}], S) ->
425425
RaiseClause = {'->', Generated, [[RaiseVar], RaiseExpr]},
426426

427427
Clauses = elixir_erl_clauses:get_clauses('else', [{'else', Else ++ [RaiseClause]}], match),
428-
{TranslatedClauses, SC} = elixir_erl_clauses:clauses(Clauses, SV),
429-
with_else_closure(Meta, TranslatedClauses, SC).
428+
{TranslatedClauses, SC} = elixir_erl_clauses:clauses(Clauses, SV#elixir_erl{extra=pin_guard}),
429+
with_else_closure(Meta, TranslatedClauses, SC#elixir_erl{extra=SV#elixir_erl.extra}).
430430

431431
with_else_closure(Meta, TranslatedClauses, S) ->
432432
Ann = ?ann(Meta),

lib/elixir/test/elixir/kernel/with_test.exs

+24
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,30 @@ defmodule Kernel.WithTest do
2525
assert with({^key, res} <- ok(42), do: res) == 42
2626
end
2727

28+
test "pin matching with multiple else" do
29+
key = :error
30+
31+
first_else =
32+
with nil <- error() do
33+
:ok
34+
else
35+
^key -> :pinned
36+
_other -> :other
37+
end
38+
39+
assert first_else == :pinned
40+
41+
second_else =
42+
with nil <- ok(42) do
43+
:ok
44+
else
45+
^key -> :pinned
46+
_other -> :other
47+
end
48+
49+
assert second_else == :other
50+
end
51+
2852
test "two levels with" do
2953
result =
3054
with {:ok, n1} <- ok(11),

0 commit comments

Comments
 (0)