diff --git a/lib/elixir/src/elixir_erl_pass.erl b/lib/elixir/src/elixir_erl_pass.erl index 198e85ceb47..52003f9109f 100644 --- a/lib/elixir/src/elixir_erl_pass.erl +++ b/lib/elixir/src/elixir_erl_pass.erl @@ -425,8 +425,8 @@ translate_with_else(Meta, [{'else', Else}], S) -> RaiseClause = {'->', Generated, [[RaiseVar], RaiseExpr]}, Clauses = elixir_erl_clauses:get_clauses('else', [{'else', Else ++ [RaiseClause]}], match), - {TranslatedClauses, SC} = elixir_erl_clauses:clauses(Clauses, SV), - with_else_closure(Meta, TranslatedClauses, SC). + {TranslatedClauses, SC} = elixir_erl_clauses:clauses(Clauses, SV#elixir_erl{extra=pin_guard}), + with_else_closure(Meta, TranslatedClauses, SC#elixir_erl{extra=SV#elixir_erl.extra}). with_else_closure(Meta, TranslatedClauses, S) -> Ann = ?ann(Meta), diff --git a/lib/elixir/test/elixir/kernel/with_test.exs b/lib/elixir/test/elixir/kernel/with_test.exs index 0ad008186ba..c4a17f18e67 100644 --- a/lib/elixir/test/elixir/kernel/with_test.exs +++ b/lib/elixir/test/elixir/kernel/with_test.exs @@ -25,6 +25,30 @@ defmodule Kernel.WithTest do assert with({^key, res} <- ok(42), do: res) == 42 end + test "pin matching with multiple else" do + key = :error + + first_else = + with nil <- error() do + :ok + else + ^key -> :pinned + _other -> :other + end + + assert first_else == :pinned + + second_else = + with nil <- ok(42) do + :ok + else + ^key -> :pinned + _other -> :other + end + + assert second_else == :other + end + test "two levels with" do result = with {:ok, n1} <- ok(11),