Skip to content

Commit e04444c

Browse files
committed
Warn when invalid fun typespec is used
1 parent 7da4d65 commit e04444c

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

lib/elixir/lib/kernel/typespec.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,15 @@ defmodule Kernel.Typespec do
877877

878878
defp typespec({:fun, meta, args}, vars, caller, state) do
879879
{args, state} = :lists.mapfoldl(&typespec(&1, vars, caller, &2), state, args)
880-
{{:type, location(meta), :fun, args}, state}
880+
881+
if args != [] do
882+
IO.warn(
883+
"fun/#{length(args)} is not valid in typespecs. Either specify fun() or use (... -> return) instead",
884+
caller
885+
)
886+
end
887+
888+
{{:type, location(meta), :fun, []}, state}
881889
end
882890

883891
defp typespec({:..., _meta, _args}, _vars, caller, _state) do

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,20 @@ defmodule Kernel.WarningTest do
18181818
purge([Sample1, Sample2, Sample3])
18191819
end
18201820

1821+
test "invalid fun" do
1822+
assert_warn_eval(
1823+
[
1824+
"nofile:2: ",
1825+
"fun/1 is not valid in typespecs. Either specify fun() or use (... -> return) instead"
1826+
],
1827+
"""
1828+
defmodule InvalidFunType do
1829+
@type my_type :: fun(integer())
1830+
end
1831+
"""
1832+
)
1833+
end
1834+
18211835
test "invalid type annotations" do
18221836
assert_warn_eval(
18231837
[

0 commit comments

Comments
 (0)