From 03413ab0d4fbd38e6a735bdcc3ccee8017191430 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Fri, 26 Nov 2021 18:50:36 +0200 Subject: [PATCH] Fix the comparison between unit and empty tuple --- src/aeso_ast_infer_types.erl | 6 +++++- test/contracts/contract_interface_polymorphism.aes | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index a084634..bd9b24a 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -921,6 +921,10 @@ compare_types({app_t, _, Type1, ArgsTypes1}, {app_t, _, Type2, ArgsTypes2}) -> compare_types(Type1, Type2) andalso compare_types(ArgsTypes1, ArgsTypes2); compare_types({tuple_t, _, Types1}, {tuple_t, _, Types2}) -> compare_types(Types1, Types2); +compare_types({tuple_t, _, []}, {id, _, "unit"}) -> + true; +compare_types({id, _, "unit"}, {tuple_t, _, []}) -> + true; compare_types(T1 = {Id, _, Type}, {Id, _, Type}) when ?is_type_id(T1) -> true; compare_types({if_t, _, {id, _, Id}, Ta1, Tb1}, {if_t, _, {id, _, Id}, Ta2, Tb2}) -> @@ -1447,7 +1451,7 @@ infer_letfun(Env = #env{ namespace = Namespace }, LetFun = {letfun, Ann, Fun, _, {{Name, Sig}, Clause} = infer_letfun1(Env, LetFun), {{Name, Sig}, desugar_clauses(Ann, Fun, Sig, [Clause])}. -infer_letfun1(Env0 = #env{ namespace = NS }, {letfun, Attrib, Fun = {id, NameAttrib, Name}, Args, What, GuardedBodies}) -> +infer_letfun1(Env0 = #env{ namespace = NS }, {letfun, Attrib, Fun = {id, NameAttrib, Name}, Args, What, GuardedBodies}) -> Env = Env0#env{ stateful = aeso_syntax:get_ann(stateful, Attrib, false), current_function = Fun }, {NewEnv, {typed, _, {tuple, _, TypedArgs}, {tuple_t, _, ArgTypes}}} = infer_pattern(Env, {tuple, [{origin, system} | NameAttrib], Args}), diff --git a/test/contracts/contract_interface_polymorphism.aes b/test/contracts/contract_interface_polymorphism.aes index 6eb9ab7..6d51bea 100644 --- a/test/contracts/contract_interface_polymorphism.aes +++ b/test/contracts/contract_interface_polymorphism.aes @@ -1,9 +1,9 @@ contract interface II = - entrypoint f : () => int + entrypoint f : () => unit contract interface I : II = - entrypoint g : () => int + entrypoint g : () => unit contract C : I = - entrypoint f() = 1 - entrypoint g() = 2 + entrypoint f() = () + entrypoint g() = ()