Fail gracefully on bad top-level declaration
This commit is contained in:
parent
412b0b8b6d
commit
325d69e96d
@ -706,7 +706,8 @@ check_modifiers(Env, Contracts) ->
|
|||||||
{true, []} -> type_error({contract_has_no_entrypoints, Con});
|
{true, []} -> type_error({contract_has_no_entrypoints, Con});
|
||||||
_ -> ok
|
_ -> ok
|
||||||
end;
|
end;
|
||||||
{namespace, _, _, Decls} -> check_modifiers1(namespace, Decls)
|
{namespace, _, _, Decls} -> check_modifiers1(namespace, Decls);
|
||||||
|
Decl -> type_error({bad_top_level_decl, Decl})
|
||||||
end || C <- Contracts ],
|
end || C <- Contracts ],
|
||||||
destroy_and_report_type_errors(Env).
|
destroy_and_report_type_errors(Env).
|
||||||
|
|
||||||
@ -2301,6 +2302,15 @@ mk_error({cannot_call_init_function, Ann}) ->
|
|||||||
Msg = "The 'init' function is called exclusively by the create contract transaction\n"
|
Msg = "The 'init' function is called exclusively by the create contract transaction\n"
|
||||||
"and cannot be called from the contract code.\n",
|
"and cannot be called from the contract code.\n",
|
||||||
mk_t_err(pos(Ann), Msg);
|
mk_t_err(pos(Ann), Msg);
|
||||||
|
mk_error({bad_top_level_decl, Decl}) ->
|
||||||
|
What = case element(1, Decl) of
|
||||||
|
letval -> "function or entrypoint";
|
||||||
|
_ -> "contract or namespace"
|
||||||
|
end,
|
||||||
|
Id = element(3, Decl),
|
||||||
|
Msg = io_lib:format("The definition of '~s' must appear inside a ~s.\n",
|
||||||
|
[pp_expr("", Id), What]),
|
||||||
|
mk_t_err(pos(Decl), Msg);
|
||||||
mk_error(Err) ->
|
mk_error(Err) ->
|
||||||
Msg = io_lib:format("Unknown error: ~p\n", [Err]),
|
Msg = io_lib:format("Unknown error: ~p\n", [Err]),
|
||||||
mk_t_err(pos(0, 0), Msg).
|
mk_t_err(pos(0, 0), Msg).
|
||||||
|
@ -493,6 +493,8 @@ failing_contracts() ->
|
|||||||
[<<?Pos(7, 28)
|
[<<?Pos(7, 28)
|
||||||
"The 'init' function is called exclusively by the create contract transaction\n"
|
"The 'init' function is called exclusively by the create contract transaction\n"
|
||||||
"and cannot be called from the contract code.">>])
|
"and cannot be called from the contract code.">>])
|
||||||
|
, ?TEST(bad_top_level_decl,
|
||||||
|
[<<?Pos(1, 1) "The definition of 'square' must appear inside a contract or namespace.">>])
|
||||||
].
|
].
|
||||||
|
|
||||||
-define(Path(File), "code_errors/" ??File).
|
-define(Path(File), "code_errors/" ??File).
|
||||||
|
3
test/contracts/bad_top_level_decl.aes
Normal file
3
test/contracts/bad_top_level_decl.aes
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
function square(x) = x ^ 2
|
||||||
|
contract Main =
|
||||||
|
entrypoint main() = square(10)
|
Loading…
x
Reference in New Issue
Block a user