From fc08fe09a5b305296a5c52dde92957a61ff62ca4 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Tue, 14 Jun 2022 13:27:00 +0400 Subject: [PATCH] Add tests for calling constrained functions --- src/aeso_ast_infer_types.erl | 8 ++++++++ test/aeso_compiler_tests.erl | 8 +++++++- test/contracts/comparable_typevar_constraints.aes | 11 ++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 0a7fa39..d52144b 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -2645,6 +2645,14 @@ unify1(_Env, {uvar, A, R}, T, When) -> end; unify1(Env, T, {uvar, A, R}, When) -> unify1(Env, {uvar, A, R}, T, When); +unify1(Env, {constrained_t, _, Cs, UVar = {uvar, _, _}}, Type2, When) -> + [ add_constraint({is_ord, UVar}) || {id, _, "ord"} <- Cs ], + [ add_constraint({is_eq, UVar}) || {id, _, "eq"} <- Cs ], + unify1(Env, UVar, Type2, When); +unify1(Env, Type1, UVar = {constrained_t, _, Cs, {uvar, _, _}}, When) -> + [ add_constraint({is_ord, UVar}) || {id, _, "ord"} <- Cs ], + [ add_constraint({is_eq, UVar}) || {id, _, "eq"} <- Cs ], + unify1(Env, Type1, UVar, When); unify1(_Env, {tvar, _, X}, {tvar, _, X}, _When) -> true; %% Rigid type variables unify1(_Env, {constrained_t, _, Cs, {tvar, _, X}}, {constrained_t, _, Cs, {tvar, _, X}}, _When) -> true; unify1(Env, [A|B], [C|D], When) -> diff --git a/test/aeso_compiler_tests.erl b/test/aeso_compiler_tests.erl index 397d583..a84eeaf 100644 --- a/test/aeso_compiler_tests.erl +++ b/test/aeso_compiler_tests.erl @@ -881,7 +881,13 @@ failing_contracts() -> < bool)` are not comparable by inequality">>, < bool)` are not comparable by equality">> + "Values of type `custom_record((int, char) => bool)` are not comparable by equality">>, + <>, + < 'a` are not comparable by inequality">>, + < 'b` are not comparable by equality">> ]) , ?TYPE_ERROR(warnings, [<= y // fail function record_of_nomcomp_eq (x : custom_record(lam), y : custom_record(lam)) = x == y // pass - entrypoint init() = () \ No newline at end of file + entrypoint init() = + let passing_ord_ord = passing_ord([1], [2]) // pass + let passing_ord_eq = passing_ord({[1] = 2}, {[2] = 3}) // fail + let passing_ord_noncomp = passing_ord((x) => x, (x) => x) // fail + + let passing_eq_ord = passing_eq([1], [2]) // pass + let passing_eq_eq = passing_eq({[1] = 2}, {[2] = 3}) // pass + let passing_eq_noncomp = passing_eq((x) => x, (x) => x) // fail + + () \ No newline at end of file