Skip to content

Commit 0c81857

Browse files
author
José Valim
committed
Consistently raise for missing do option in definitions
Closes #7333.
1 parent bd0a2e8 commit 0c81857

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

lib/elixir/src/elixir_def.erl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,15 @@ run_with_location_change(File, E, Callback) ->
190190
def_to_clauses(_Kind, Meta, Args, [], nil, E) ->
191191
check_args_for_bodiless_clause(Meta, Args, E),
192192
[];
193-
def_to_clauses(Kind, Meta, _Args, _Guards, nil, E) ->
194-
elixir_errors:form_error(Meta, ?key(E, file), elixir_expand, {missing_option, Kind, [do]});
195193
def_to_clauses(_Kind, Meta, Args, Guards, [{do, Body}], _E) ->
196194
[{Meta, Args, Guards, Body}];
197-
def_to_clauses(Kind, Meta, Args, Guards, Body, _E) ->
198-
[{Meta, Args, Guards, {'try', [{origin, Kind} | Meta], [Body]}}].
195+
def_to_clauses(Kind, Meta, Args, Guards, Body, E) ->
196+
case is_list(Body) andalso lists:keyfind(do, 1, Body) of
197+
{do, _} ->
198+
[{Meta, Args, Guards, {'try', [{origin, Kind} | Meta], [Body]}}];
199+
false ->
200+
elixir_errors:form_error(Meta, ?key(E, file), elixir_expand, {missing_option, Kind, [do]})
201+
end.
199202

200203
run_on_definition_callbacks(Kind, Module, Name, Args, Guards, Body, E) ->
201204
Callbacks = ets:lookup_element(elixir_module:data_table(Module), on_definition, 2),

lib/elixir/test/elixir/kernel/errors_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,12 @@ defmodule Kernel.ErrorsTest do
701701
def foo(n) when is_number(n)
702702
end
703703
'''
704+
705+
assert_eval_raise CompileError, "nofile:2: missing :do option in \"def\"", '''
706+
defmodule Kernel.ErrorsTest.BodyessFunctionWithGuard do
707+
def foo(n) when is_number(n), true
708+
end
709+
'''
704710
end
705711

706712
test "invalid args for bodyless clause" do

0 commit comments

Comments
 (0)