summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@dashbit.co>2020-02-09 18:15:21 +0100
committerJosé Valim <jose.valim@dashbit.co>2020-02-09 18:15:21 +0100
commitb2ee70ee74693d1a1d26495ccf4aefaf9ff430e2 (patch)
treea8c8097a12f61af95aff6e976544d7a8a94352b1
parentf2cb13c39b47fa25d62ffc4b5f25caf5cd3c3132 (diff)
downloadelixir-b2ee70ee74693d1a1d26495ccf4aefaf9ff430e2.tar.gz
Unpack extra guards from with matches, closes #9801
-rw-r--r--lib/elixir/src/elixir_erl_pass.erl4
-rw-r--r--lib/elixir/test/elixir/kernel/with_test.exs10
2 files changed, 12 insertions, 2 deletions
diff --git a/lib/elixir/src/elixir_erl_pass.erl b/lib/elixir/src/elixir_erl_pass.erl
index 530de8e9f..2c1e91a9f 100644
--- a/lib/elixir/src/elixir_erl_pass.erl
+++ b/lib/elixir/src/elixir_erl_pass.erl
@@ -415,8 +415,8 @@ translate_with_do([{'<-', Meta, [Left, Expr]} | Rest], Do, Else, S) ->
{Args, Guards} = elixir_utils:extract_guards(Left),
{TExpr, SR} = elixir_erl_pass:translate(Expr, S),
{TArgs, SA} = elixir_erl_clauses:match(fun elixir_erl_pass:translate/2, Args, SR),
- TGuards = elixir_erl_clauses:guards(Guards, [], SA),
- {TBody, SB} = translate_with_do(Rest, Do, Else, SA),
+ TGuards = elixir_erl_clauses:guards(Guards, SA#elixir_erl.extra_guards, SA),
+ {TBody, SB} = translate_with_do(Rest, Do, Else, SA#elixir_erl{extra_guards=[]}),
Clause = {clause, ?ann(Meta), [TArgs], TGuards, unblock(TBody)},
{{'case', ?ann(?generated(Meta)), TExpr, [Clause, Else]}, SB};
diff --git a/lib/elixir/test/elixir/kernel/with_test.exs b/lib/elixir/test/elixir/kernel/with_test.exs
index c756bbb19..e6c9ac2e6 100644
--- a/lib/elixir/test/elixir/kernel/with_test.exs
+++ b/lib/elixir/test/elixir/kernel/with_test.exs
@@ -73,6 +73,16 @@ defmodule Kernel.WithTest do
assert state == 1
end
+ test "with extra guards" do
+ var =
+ with %_{} = a <- struct(URI),
+ %_{} <- a do
+ :ok
+ end
+
+ assert var == :ok
+ end
+
test "errors in with" do
assert_raise RuntimeError, fn ->
with({:ok, res} <- oops(), do: res)