Skip to content
This repository was archived by the owner on Jan 30, 2026. It is now read-only.

Commit 56eef57

Browse files
committed
Verification de l'utilisation des variables temporaires et arguments en tant que référence
1 parent fcecac6 commit 56eef57

3 files changed

Lines changed: 44 additions & 3 deletions

File tree

src/mlang/m_frontend/validator.ml

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
465475
end
466476

467477
type 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'))

src/mlang/m_ir/com.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,3 +1572,8 @@ let rec format_instruction form_var form_err =
15721572

15731573
and format_instructions form_var form_err fmt instrs =
15741574
Pp.list "" (Pp.unmark (format_instruction form_var form_err)) fmt instrs
1575+
1576+
let format_simple_scope ppf = function
1577+
| Var.Tgv _ -> Pp.string ppf "TGV"
1578+
| Var.Temp _ -> Pp.string ppf "temp"
1579+
| Ref -> Pp.string ppf "Ref"

src/mlang/m_ir/com.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,3 +685,5 @@ val format_instructions :
685685
Pp.t ->
686686
('v, 'e) m_instruction list ->
687687
unit
688+
689+
val format_simple_scope : Pp.t -> Var.scope -> unit

0 commit comments

Comments
 (0)