]> Nishi Git Mirror - gwion.git/commitdiff
:art: Array types have unique xid
authorJérémie Astor <fennecdjay@gmail.com>
Sat, 5 Dec 2020 11:34:18 +0000 (12:34 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Sat, 5 Dec 2020 11:34:18 +0000 (12:34 +0100)
src/env/type.c
src/lib/array.c
src/parse/check.c
tests/error/negative_array2.gw

index d45e8fbb95105f53a868ebfdd1a18da2fdac43f9..24ae4ce484d4da8df73bc90fb55eaad772b61ea5 100644 (file)
@@ -100,7 +100,7 @@ ANN Type array_type(const Env env, const Type src, const m_uint depth) {
   const Type type = nspc_lookup_type1(src->info->owner, sym);
   if(type)
     return type;
-  const Type t = new_type(env->gwion->mp, env->gwion->type[et_array]->xid,
+  const Type t = new_type(env->gwion->mp, ++env->scope->type_xid,
       s_name(sym), env->gwion->type[et_array]);
   t->array_depth = depth + src->array_depth;
   t->info->base_type = array_base(src) ?: src;
index a14cb6f453e8f9c207de59c44c4940b3bb767b9c..1d8c30d6901dc73085168a35c56a6192cb187fa0 100644 (file)
@@ -317,16 +317,6 @@ static FREEARG(freearg_array) {
   mp_free(((Gwion)gwion)->mp, ArrayInfo, info);
 }
 
-static OP_CHECK(opck_not_array) {
-  const Array_Sub array = (Array_Sub)data;
-  if(get_depth(array->type)) {
-    struct Array_Sub_ next = { array->exp, array->type->info->parent, array->depth };
-    return check_array_access(env, &next);
-  }
-  ERR_O(array->exp->pos, _("array subscripts (%"UINT_F") exceeds defined dimension (%"UINT_F")"),
-        array->depth, get_depth(array->type))
-}
-
 ANN Type check_array_access(const Env env, const Array_Sub array);
 
 static OP_CHECK(opck_array) {
@@ -445,9 +435,6 @@ GWION_IMPORT(array) {
   GWI_BB(gwi_oper_add(gwi, opck_array_slice))
   GWI_BB(gwi_oper_emi(gwi, opem_array_slice))
   GWI_BB(gwi_oper_end(gwi, "@slice", NULL))
-  GWI_BB(gwi_oper_ini(gwi, "int", (m_str)OP_ANY_TYPE, NULL))
-  GWI_BB(gwi_oper_add(gwi, opck_not_array))
-  GWI_BB(gwi_oper_end(gwi, "@array", NULL))
   GWI_BB(gwi_oper_ini(gwi, "int", "@Array", NULL))
   GWI_BB(gwi_oper_add(gwi, opck_array))
   GWI_BB(gwi_oper_emi(gwi, opem_array_access))
index 9caac831d04abcc3dd5e225740b1c0f7cc2b26de..d6e0a5d20a65b7d896ddd5a2b105c0731db46506 100644 (file)
@@ -385,6 +385,9 @@ ANN static Type check_prim(const Env env, Exp_Primary *prim) {
 }
 
 ANN Type check_array_access(const Env env, const Array_Sub array) {
+  if(!get_depth(array->type))
+    ERR_O(array->exp->pos, _("array subscripts (%"UINT_F") exceeds defined dimension (%"UINT_F")"),
+        array->depth, get_depth(array->type))
   const Symbol sym = insert_symbol("@array");
   struct Op_Import opi = { .op=sym, .lhs=array->exp->info->type, .rhs=array->type,
     .pos=array->exp->pos, .data=(uintptr_t)array, .op_type=op_array };
index bc7fdf53c0375757b3b8597b90ecbbb9576b5eff..bda30f0c53de4ff333cc8942dca564840ec30b74 100644 (file)
@@ -1,4 +1,3 @@
 #! [contains] ArrayOutofBounds
 var int i[2][2];
 <<< i[1][-1] >>>;
-<<< -1 >>>;