aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/syntax/type_of.ml12
-rw-r--r--test/type_of.ml4
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';