Skip to content

Commit 8533df2

Browse files
tsuberyJosé Valim
authored andcommitted
Fix redefined function source location (#5720)
When functions are redefined in a different file, the translation uses the first definition source location for all subsequent definitions. This manifests itself as warnings that are ascribed to the wrong file. Fixes #5719 Signed-off-by: José Valim <[email protected]>
1 parent 9e8ac51 commit 8533df2

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

lib/elixir/src/elixir_def.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,12 @@ store_each(Check, Kind, File, Location, Module, Defaults, {function, Ann, Name,
303303

304304
{FinalAnn, FinalLocation, FinalDefaults} = case ets:take(Defs, {def, Tuple}) of
305305
[{_, StoredKind, StoredAnn, StoredFile, StoredCheck,
306-
StoredLocation, {StoredDefaults, LastHasBody, LastDefaults}}] ->
306+
_StoredLocation, {StoredDefaults, LastHasBody, LastDefaults}}] ->
307307
check_valid_kind(Ann, File, Name, Arity, Kind, StoredKind),
308308
(Check and StoredCheck) andalso
309309
check_valid_clause(Ann, File, Name, Arity, Kind, Data, StoredAnn, StoredFile),
310310
check_valid_defaults(Ann, File, Name, Arity, Kind, Defaults, StoredDefaults, LastDefaults, LastHasBody),
311-
{StoredAnn, StoredLocation, {max(Defaults, StoredDefaults), HasBody, Defaults}};
311+
{StoredAnn, Location, {max(Defaults, StoredDefaults), HasBody, Defaults}};
312312
[] ->
313313
{Ann, Location, {Defaults, HasBody, Defaults}}
314314
end,

lib/elixir/test/elixir/kernel/warning_test.exs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,31 @@ defmodule Kernel.WarningTest do
2828
purge Sample
2929
end
3030

31+
test "unused variable in redefined function in different file" do
32+
output = capture_err(fn ->
33+
Code.eval_string """
34+
defmodule Sample do
35+
defmacro __using__(_) do
36+
quote location: :keep do
37+
def function(arg)
38+
end
39+
end
40+
end
41+
"""
42+
Code.eval_string("""
43+
defmodule RedefineSample do
44+
use Sample
45+
def function(var123), do: nil
46+
end
47+
""", [], file: "redefine_sample.ex")
48+
end)
49+
assert output =~ "redefine_sample.ex:3"
50+
assert output =~ "variable \"var123\" is unused"
51+
after
52+
purge Sample
53+
purge RedefineSample
54+
end
55+
3156
test "useless literal" do
3257
message = "code block contains unused literal \"oops\""
3358

0 commit comments

Comments
 (0)