diff --git a/lib/elixir/lib/module/types/apply.ex b/lib/elixir/lib/module/types/apply.ex index cfd9db80d5..398314197b 100644 --- a/lib/elixir/lib/module/types/apply.ex +++ b/lib/elixir/lib/module/types/apply.ex @@ -1099,6 +1099,13 @@ defmodule Module.Types.Apply do end end + defp remote_apply(:erlang, :send, info, [_dest, message] = args_types, stack) do + case remote_apply(info, args_types, stack) do + {:ok, _type} -> {:ok, return(message, args_types, stack)} + other -> other + end + end + defp remote_apply(:erlang, :tl, _info, [list], stack) do case list_tl(list) do {:ok, value_type} -> {:ok, return(value_type, [list], stack)} diff --git a/lib/elixir/test/elixir/module/types/expr_test.exs b/lib/elixir/test/elixir/module/types/expr_test.exs index 0de7ebf4c7..52babfa3c5 100644 --- a/lib/elixir/test/elixir/module/types/expr_test.exs +++ b/lib/elixir/test/elixir/module/types/expr_test.exs @@ -444,6 +444,13 @@ defmodule Module.Types.ExprTest do ) == dynamic(tuple([integer(), integer(), binary()])) end + test "send returns the message" do + assert typecheck!(send(self(), {:msg, 1})) == tuple([atom([:msg]), integer()]) + + assert typeerror!(send(123, {:msg, 1})) =~ + "incompatible types given to Kernel.send/2" + end + test "undefined function warnings" do assert typewarn!(URI.unknown("foo")) == {dynamic(), "URI.unknown/1 is undefined or private"}