Эх сурвалжийг харах

Array dimensions are now uniquely named to avoid weird context analysis errors when arrays are redefined

Taddeus Kroes 12 жил өмнө
parent
commit
6163840311
1 өөрчлөгдсөн 12 нэмэгдсэн , 4 устгасан
  1. 12 4
      phases/desug.ml

+ 12 - 4
phases/desug.ml

@@ -39,8 +39,7 @@ let rec consts_to_vars node =
 
   | node -> transform_children consts_to_vars node
 
-let make_dims basename values make_dec =
-  let make_dimname i _ = basename ^ "$" ^ string_of_int (i + 1) in
+let make_dims make_dimname values make_dec =
   let names = mapi make_dimname values in
 
   let decs = List.map2 make_dec values names in
@@ -55,13 +54,22 @@ let make_dims basename values make_dec =
 let rec array_dims node =
   match node with
   | VarDec (ArrayDims (ctype, values), name, init, ann) ->
+    (* Names for VarDec dimensions must be unique to avoid weid errors when
+     * during context analysis, when an array variable is redeclared within the
+     * same scope *)
+    let make_dimname i _ = fresh_const (name ^ "$" ^ string_of_int (i + 1)) in
+
     let make_dec value name = VarDec (Int, name, Some value, []) in
-    let (decs, dims) = make_dims (name ^ "$dim$") values make_dec in
+    let (decs, dims) = make_dims make_dimname values make_dec in
     Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
 
   | GlobalDef (export, ArrayDims (ctype, values), name, None, ann) ->
+    (* For global decs, the name must also be unique, but not constant (no $$in
+     * the name) since the variable must exist for exporting *)
+    let make_dimname i _ = fresh_var (name ^ "$" ^ string_of_int (i + 1)) in
+
     let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
-    let (decs, dims) = make_dims name values make_dec in
+    let (decs, dims) = make_dims make_dimname values make_dec in
     Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, None, ann)])
 
     (*