Skip to content

Commit 65e67cd

Browse files
author
José Valim
committed
Ensure we emit a warning for recursive non used calls
1 parent 6b91e46 commit 65e67cd

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

lib/elixir/src/elixir_def_local.erl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ macro_for(_Tuple, _All, nil) -> false;
1414
macro_for(Tuple, All, Module) ->
1515
try elixir_def:lookup_definition(Module, Tuple) of
1616
{ { Tuple, Kind, Line, _, _, _, _ }, Clauses } when Kind == defmacro; All, Kind == defmacrop ->
17+
%% This function is only called if S#elixir_scope.function /= Tuple
1718
elixir_import:record(Tuple, Module, Module),
1819
get_function(Line, Module, Clauses);
1920
_ ->
@@ -27,7 +28,9 @@ function_for(Module, Name, Arity) ->
2728
Tuple = { Name, Arity },
2829
case elixir_def:lookup_definition(Module, Tuple) of
2930
{ { Tuple, _, Line, _, _, _, _ }, Clauses } ->
30-
elixir_import:record(Tuple, Module, Module),
31+
%% There is no need to record such calls
32+
%% since they come from funtions that were
33+
%% already analyzed at compilation time.
3134
get_function(Line, Module, Clauses);
3235
_ ->
3336
[_|T] = erlang:get_stacktrace(),

lib/elixir/src/elixir_dispatch.erl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ import_function(Meta, Name, Arity, S) ->
4343
require_function(Meta, Receiver, Name, Arity, S);
4444
nomatch ->
4545
Module = S#elixir_scope.module,
46-
elixir_import:record({ Name, Arity }, Module, Module),
46+
case S#elixir_scope.function of
47+
Tuple -> ok;
48+
_ -> elixir_import:record(Tuple, Module, Module)
49+
end,
4750
{ { 'fun', ?line(Meta), { function, Name, Arity } }, S }
4851
end.
4952

lib/elixir/src/elixir_translator.erl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,11 @@ translate_fn(Meta, Clauses, S) ->
578578

579579
%% Locals
580580

581-
translate_local(Meta, Name, Args, #elixir_scope{local=nil,module=Module} = S) ->
582-
elixir_import:record({ Name, length(Args) }, Module, Module),
581+
translate_local(Meta, Name, Args, #elixir_scope{local=nil,module=Module,function=Function} = S) ->
582+
case { Name, length(Args) } of
583+
Function -> ok;
584+
Tuple -> elixir_import:record(Tuple, Module, Module)
585+
end,
583586
Line = ?line(Meta),
584587
{ TArgs, NS } = translate_args(Args, S),
585588
{ { call, Line, { atom, Line, Name }, TArgs }, NS };
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
Code.require_file "../test_helper.exs", __DIR__
2+
3+
defmodule Kernel.WarningTest do
4+
use ExUnit.Case, async: true
5+
6+
import ExUnit.CaptureIO
7+
8+
test :invalid_token do
9+
assert capture_io(fn ->
10+
defmodule Sample do
11+
defp hello(0), do: hello(1)
12+
defp hello(1), do: :ok
13+
end
14+
end) =~ %r"function hello/1 is unused"
15+
after
16+
purge Sample
17+
end
18+
19+
defp purge(module) do
20+
:code.delete module
21+
:code.purge module
22+
end
23+
end

0 commit comments

Comments
 (0)