Skip to content

Commit 8c78a0e

Browse files
committed
Mark defguard expansion outside of guards as generated
1 parent e6857d5 commit 8c78a0e

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

lib/elixir/lib/kernel/utils.ex

+7-4
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,11 @@ defmodule Kernel.Utils do
330330

331331
quote do
332332
case Macro.Env.in_guard?(__CALLER__) do
333-
true -> unquote(literal_quote(unquote_every_ref(expr, vars)))
334-
false -> unquote(literal_quote(unquote_refs_once(expr, vars, env.module)))
333+
true ->
334+
unquote(literal_quote(unquote_every_ref(expr, vars), []))
335+
336+
false ->
337+
unquote(literal_quote(unquote_refs_once(expr, vars, env.module), generated: true))
335338
end
336339
end
337340
end
@@ -396,8 +399,8 @@ defmodule Kernel.Utils do
396399
end
397400
end
398401

399-
defp literal_quote(ast) do
400-
{:quote, [], [[do: ast]]}
402+
defp literal_quote(ast, args) do
403+
{:quote, [], [args, [do: ast]]}
401404
end
402405

403406
defp literal_unquote(ast) do

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

+18-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ defmodule Module.Types.IntegrationTest do
5454
end
5555
end
5656

57-
describe "undefined" do
57+
describe "undefined warnings" do
5858
test "handles Erlang modules" do
5959
files = %{
6060
"a.ex" => """
@@ -604,6 +604,23 @@ defmodule Module.Types.IntegrationTest do
604604
end
605605

606606
describe "regressions" do
607+
test "does not emit false positives from defguard" do
608+
files = %{
609+
"a.ex" => """
610+
defmodule A do
611+
defguard is_non_nil_arity_function(fun, arity)
612+
when arity != nil and is_function(fun, arity)
613+
614+
def check(fun, args) do
615+
is_non_nil_arity_function(fun, length(args))
616+
end
617+
end
618+
"""
619+
}
620+
621+
assert_no_warnings(files)
622+
end
623+
607624
test "do not parse binary segments as variables" do
608625
files = %{
609626
"a.ex" => """

0 commit comments

Comments
 (0)