[LIGO-286] Tuple destructuring doesn't do left hand type inference in CameLIGO

This commit is contained in:
John David Pressman 2019-12-17 21:04:53 +00:00
parent 56001384b5
commit 310dde6dc9
3 changed files with 22 additions and 4 deletions

View File

@ -564,11 +564,11 @@ and simpl_declaration : Raw.declaration -> declaration Location.wrap list result
let%bind (v, v_type) = pattern_to_typed_var par_var in let%bind (v, v_type) = pattern_to_typed_var par_var in
let%bind v_type_expression = let%bind v_type_expression =
match v_type with match v_type with
| Some v_type -> ok @@ (simpl_type_expression v_type) | Some v_type -> ok (to_option (simpl_type_expression v_type))
| None -> fail @@ wrong_pattern "typed var tuple" par_var in | None -> ok None
let%bind v_type_expression = v_type_expression in in
let%bind simpl_rhs_expr = simpl_expression rhs_expr in let%bind simpl_rhs_expr = simpl_expression rhs_expr in
ok @@ loc x @@ Declaration_constant (Var.of_name v.value, Some v_type_expression, simpl_rhs_expr) ) ok @@ loc x @@ Declaration_constant (Var.of_name v.value, v_type_expression, simpl_rhs_expr) )
in let%bind variables = ok @@ npseq_to_list pt.value in let%bind variables = ok @@ npseq_to_list pt.value
in let%bind expr_bind_lst = in let%bind expr_bind_lst =
match let_rhs with match let_rhs with

View File

@ -0,0 +1,11 @@
type foobar = int * int
let test_t: foobar = 10, 25
let foo, bar = test_t
let type_tuple_d (p: unit) = foo + bar
type complex = string * int * string * nat
let test_t_2 = "hello", 10, "world", 50n
let hello, ten, world, fifty_n = test_t_2
let type_tuple_d_2 (p: unit) = hello ^ world

View File

@ -1765,6 +1765,12 @@ let key_hash () : unit result =
let%bind () = expect_eq program "check_hash_key" make_input make_expected in let%bind () = expect_eq program "check_hash_key" make_input make_expected in
ok () ok ()
let type_tuple_destruct () : unit result =
let%bind program = mtype_file "./contracts/type_tuple_destruct.mligo" in
let%bind () = expect_eq program "type_tuple_d" (e_unit ()) (e_int 35) in
let%bind () = expect_eq program "type_tuple_d_2" (e_unit ()) (e_string "helloworld") in
ok ()
let main = test_suite "Integration (End to End)" [ let main = test_suite "Integration (End to End)" [
test "key hash" key_hash ; test "key hash" key_hash ;
test "chain id" chain_id ; test "chain id" chain_id ;
@ -1899,4 +1905,5 @@ let main = test_suite "Integration (End to End)" [
test "simple_access (ligo)" simple_access_ligo; test "simple_access (ligo)" simple_access_ligo;
test "deep_access (ligo)" deep_access_ligo; test "deep_access (ligo)" deep_access_ligo;
test "entrypoints (ligo)" entrypoints_ligo ; test "entrypoints (ligo)" entrypoints_ligo ;
test "type tuple destruct (mligo)" type_tuple_destruct ;
] ]