Skip to content

Commit e34dde7

Browse files
author
José Valim
committed
Ensure entries are sorted to avoid non-determinism in compilation, closes #4814
1 parent 1eb1137 commit e34dde7

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

lib/elixir/src/elixir_def.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ is_macro(_) -> false.
218218
unwrap_definitions(File, Module) ->
219219
Table = elixir_module:defs_table(Module),
220220
Entries = ets:match(Table, {{def, '$1'}, '_', '_', '_', '_', '_', '_'}),
221-
{All, Private} = unwrap_definition(Entries, File, Module, Table, [], []),
221+
{All, Private} = unwrap_definition(lists:sort(Entries), File, Module, Table, [], []),
222222
Unreachable = elixir_locals:warn_unused_local(File, Module, Private),
223223
split_definition(All, Unreachable, [], [], [], [], [], {[], []}).
224224

lib/elixir/test/elixir/module_test.exs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,17 @@ defmodule ModuleTest do
245245
assert ModuleHygiene.test == [1, 2, 3]
246246
end
247247

248+
test "ensure function clauses are ordered" do
249+
{_, _, binary, _} =
250+
defmodule Ordered do
251+
def foo(:foo), do: :bar
252+
def baz(:baz), do: :bat
253+
end
254+
atoms = :beam_lib.chunks(binary, [:atoms])
255+
assert :erlang.phash2(atoms) == 53987778
256+
end
257+
258+
# TODO: Remove this check once we depend only on 19
248259
if :erlang.system_info(:otp_release) >= '19' do
249260
test "create with generated true does not emit warnings" do
250261
contents =

0 commit comments

Comments
 (0)