Skip to content

Commit 1be67dc

Browse files
committed
Prevent infinite loop in compiler for some invalid type specs
1 parent ef1450d commit 1be67dc

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

lib/elixir/lib/kernel/typespec.ex

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -947,8 +947,11 @@ defmodule Kernel.Typespec do
947947

948948
[head | tail] ->
949949
case Macro.expand_once(head, env) do
950-
head when is_atom(head) -> :elixir_aliases.concat([head | tail])
951-
_ -> alias
950+
head when is_atom(head) ->
951+
:elixir_aliases.concat([head | tail])
952+
953+
_ ->
954+
compile_error(env, "unexpected expression in typespec: #{Macro.to_string(alias)}")
952955
end
953956
end
954957
end

lib/elixir/test/elixir/typespec_test.exs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ defmodule TypespecTest do
7575
@type my_type :: %URI.t(){}
7676
end
7777
end
78+
79+
assert_raise Kernel.TypespecError,
80+
~r"unexpected expression in typespec: t\.Foo",
81+
fn ->
82+
test_module do
83+
@type my_type :: t.Foo
84+
end
85+
end
7886
end
7987

8088
test "invalid function specification" do
@@ -120,7 +128,7 @@ defmodule TypespecTest do
120128

121129
test "redefined type" do
122130
assert_raise Kernel.TypespecError,
123-
~r"type foo/0 is already defined in .*test/elixir/typespec_test.exs:126",
131+
~r"type foo/0 is already defined in .*test/elixir/typespec_test.exs:134",
124132
fn ->
125133
test_module do
126134
@type foo :: atom
@@ -129,7 +137,7 @@ defmodule TypespecTest do
129137
end
130138

131139
assert_raise Kernel.TypespecError,
132-
~r"type foo/2 is already defined in .*test/elixir/typespec_test.exs:136",
140+
~r"type foo/2 is already defined in .*test/elixir/typespec_test.exs:144",
133141
fn ->
134142
test_module do
135143
@type foo :: atom
@@ -139,7 +147,7 @@ defmodule TypespecTest do
139147
end
140148

141149
assert_raise Kernel.TypespecError,
142-
~r"type foo/0 is already defined in .*test/elixir/typespec_test.exs:145",
150+
~r"type foo/0 is already defined in .*test/elixir/typespec_test.exs:153",
143151
fn ->
144152
test_module do
145153
@type foo :: atom

0 commit comments

Comments
 (0)