@@ -462,6 +462,16 @@ module Err = struct
462462 case
463463 in
464464 Errors. raise_spanned_error msg pos
465+
466+ let unexpected_variable_scope ~var_scope ~expected_scope (Pos. Mark (v , pos )) =
467+ let varname = Com. get_var_name v in
468+ let msg =
469+ Pp. spr
470+ " Variable %s is a %a variable, which should be a %s variable in this \
471+ context"
472+ varname Com. format_simple_scope var_scope expected_scope
473+ in
474+ Errors. raise_spanned_error msg pos
465475end
466476
467477type syms = Com.DomainId .t Pos .marked Com.DomainIdMap .t
@@ -1515,8 +1525,29 @@ let check_var_space (m_sp_opt : Com.var_space) (env : var_env) : unit =
15151525 | Some _ -> ()
15161526 | None -> Err. unknown_var_space sp_name (Pos. get m_sp)))
15171527
1518- let check_variable (m_sp_opt : Com.var_space ) (m_vn : Com.m_var_name )
1519- (idx_mem : var_mem_type ) (env : var_env ) : unit =
1528+ let check_right_scope ~env ~must_be (Pos. Mark (var , _ ) as m_vn ) =
1529+ let v_name = Com. get_normal_var var in
1530+ let var =
1531+ let id = StrMap. find v_name env.vars in
1532+ IntMap. find id env.prog.prog_dict
1533+ in
1534+ match must_be with
1535+ | `Tgv when Com.Var. is_tgv var -> ()
1536+ | `Ref when Com.Var. is_ref var -> ()
1537+ | `Temp when Com.Var. is_temp var -> ()
1538+ | `Tgv ->
1539+ Err. unexpected_variable_scope m_vn ~var_scope: var.scope
1540+ ~expected_scope: " TGV"
1541+ | `Ref ->
1542+ Err. unexpected_variable_scope m_vn ~var_scope: var.scope
1543+ ~expected_scope: " reference"
1544+ | `Temp ->
1545+ Err. unexpected_variable_scope m_vn ~var_scope: var.scope
1546+ ~expected_scope: " temp"
1547+
1548+ let check_variable ?(must_be : [ `Tgv | `Ref | `Temp ] option )
1549+ (m_sp_opt : Com.var_space ) (m_vn : Com.m_var_name ) (idx_mem : var_mem_type )
1550+ (env : var_env ) : unit =
15201551 let decl_mem, decl_pos = Pos. to_couple @@ get_var_mem_type m_vn env in
15211552 (match (decl_mem, idx_mem) with
15221553 | _ , Both | Num , Num | Table , Table -> ()
@@ -1525,6 +1556,9 @@ let check_variable (m_sp_opt : Com.var_space) (m_vn : Com.m_var_name)
15251556 | Both, Table -> Err.mixed_variable_used_as_table decl_pos (Pos.get m_vn)*)
15261557 | Num , Table -> Err. variable_used_as_table decl_pos (Pos. get m_vn)
15271558 | Table , Num -> Err. table_used_as_variable decl_pos (Pos. get m_vn));
1559+ (match must_be with
1560+ | None -> ()
1561+ | Some must_be -> check_right_scope ~env ~must_be m_vn);
15281562 match m_sp_opt with
15291563 | None -> ()
15301564 | Some (m_sp , _ ) ->
@@ -1729,7 +1763,7 @@ let rec check_instructions (env : var_env)
17291763 | Some _ -> Err. event_field_is_not_a_reference f_name f_pos
17301764 | None -> Err. unknown_event_field f_name f_pos);
17311765 let m_i' = map_expr env m_i in
1732- check_variable None m_v Num env;
1766+ check_variable ~must_be: `Tgv None m_v Num env;
17331767 let m_v' = map_var env m_v in
17341768 let f' =
17351769 Com. SingleFormula (EventFieldRef (m_i', f, iFmt, m_v'))
0 commit comments