From 4535058e48fc8edc44be20b92a182279eb9e1569 Mon Sep 17 00:00:00 2001 From: Chimrod <> Date: Wed, 5 Jun 2024 22:32:55 +0200 Subject: Typeof: Do not raise warning when assigning an integer in a string variable --- lib/syntax/type_of.ml | 12 +++++++++--- test/type_of.ml | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/syntax/type_of.ml b/lib/syntax/type_of.ml index b991e43..d0437c9 100644 --- a/lib/syntax/type_of.ml +++ b/lib/syntax/type_of.ml @@ -454,9 +454,15 @@ module Instruction = struct let report' = Option.map snd variable.index |> Option.value ~default:[] in let report = List.rev_append report' report in - match right_expression.empty with - | true -> report - | false -> ( + match + ( right_expression.empty, + Get_type.get_type (Lazy.force right_expression.result) ) + with + | true, _ + (* It’s allowed to assign an integer in any kind of variable *) + | _, Get_type.(Integer) -> + report + | false, _ -> ( let var_type = Lazy.from_val (Get_type.ident variable) in let op1 = arg_of_repr var_type variable.pos in let op2 = arg_of_repr right_expression.result right_expression.pos in diff --git a/test/type_of.ml b/test/type_of.ml index a387bf6..d2be5e7 100644 --- a/test/type_of.ml +++ b/test/type_of.ml @@ -26,6 +26,7 @@ let _test_instruction : string -> Qsp_syntax.Report.t list -> unit = Check._test_instruction let type_mismatch () = _test_instruction {|abc = 'ABC'|} (message Error) +let assign_int_str () = _test_instruction {|$abc = 123|} [] let type_mismatch2 () = _test_instruction {|abc[''] = $Var|} (message Warn) let type_conversion () = @@ -75,7 +76,8 @@ let wrong_predicate () = let test = ( "Typechecking", [ - Alcotest.test_case "Assign" `Quick type_mismatch; + Alcotest.test_case "Assign str to int" `Quick type_mismatch; + Alcotest.test_case "Assign int to str" `Quick assign_int_str; Alcotest.test_case "Assign array" `Quick type_mismatch2; Alcotest.test_case "Conversion" `Quick type_conversion; Alcotest.test_case "Conversion'" `Quick type_conversion'; -- cgit v1.2.3