فهرست منبع

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

Taddeus Kroes 12 سال پیش
والد
کامیت
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)])
 
     (*