]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve late and array semantics
authorfennecdjay <fennecdjay@gmail.com>
Sat, 16 Jul 2022 15:32:12 +0000 (17:32 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Sat, 16 Jul 2022 15:32:12 +0000 (17:32 +0200)
include/parse.h
src/lib/opfunc.c
src/parse/scan1.c
tests/array/array0.gw [new file with mode: 0644]
tests/array/array1.gw [new file with mode: 0644]
tests/array/array2.gw [new file with mode: 0644]
tests/array/array3.gw [new file with mode: 0644]
tests/error/abstract_array.gw
tests/error/invalid_array_acces.gw

index 6617a81ef5c116e745d372c2c0d0deb1a43a19f3..fd03f95ed9b23ee1763c93fda6b841729805667a 100644 (file)
@@ -120,4 +120,6 @@ ANN static inline bool not_upvalue(const Env env, const Value v) {
       (v->from->owner_class && isa(v->from->owner_class, env->class_def) > 0) ||
       nspc_lookup_value1(env->curr, insert_symbol(v->name));
 }
+
+ANN m_bool abstract_array(const Env env, const Array_Sub array);
 #endif
index 41fbf8502ee6d86c7b424c4cfdd94c769885e4f8..f9a46ce28f73378e2e6d627cd8f07fa9fca5ea52 100644 (file)
@@ -118,6 +118,10 @@ OP_CHECK(opck_new) {
   Exp_Unary *unary = (Exp_Unary *)data;
   const Array_Sub array = unary->ctor.td->array;
   DECL_ON(const Type, t, = known_type(env, unary->ctor.td));
+  if(array) {
+    const Type base = array_base(t);
+    if(GET_FLAG(base, abstract)) CHECK_BB(abstract_array(env, array));
+  }
   CHECK_BN(ensure_traverse(env, t));
   if (type_ref(t))
     ERR_N(unary->ctor.td->pos, _("can't use 'new' on ref type '%s'\n"), t->name);
index b04f18188bc2e30bf0e86889e92a154a69c4adf8..24710be2ef5f76bd6938ae28259756552eccc95a 100644 (file)
@@ -96,8 +96,14 @@ static inline bool array_ref(const Array_Sub array) {
   return array && !array->exp;
 }
 
-static inline bool array_ref2(const Array_Sub array) {
-  return array && !(array->exp && exp_is_zero(array->exp));
+ANN m_bool abstract_array(const Env env, const Array_Sub array) {
+  Exp e = array->exp;
+  while(e) {
+    if(!exp_is_zero(e))
+      ERR_B(e->pos, _("arrays of abstract type should use `0` size"));
+    e = e->next;
+  }
+  return GW_OK;
 }
 
 ANN static m_bool scan1_decl(const Env env, Exp_Decl *const decl) {
@@ -107,9 +113,13 @@ ANN static m_bool scan1_decl(const Env env, Exp_Decl *const decl) {
   Type t = decl->type;
   CHECK_BB(scan1_defined(env, vd));
   const Type base = array_base_simple(t);
-  if ((!GET_FLAG(decl->td, late) && GET_FLAG(base, abstract)) && array_ref2(decl->td->array))
-    ERR_B(vd->pos, _("arrays of abstract type '%s' must be declared empty"),
-          base->name);
+  if(decl->td->array) {
+    if (!GET_FLAG(decl->td, late) && !decl->td->array->exp)
+      ERR_B(decl->td->pos, _("arrays with no expressions should be declared `late`"));
+    if (GET_FLAG(decl->td, late) && decl->td->array->exp)
+      ERR_B(decl->td->array->exp->pos, _("late array should have no size"));
+    if (GET_FLAG(base, abstract)) CHECK_BB(abstract_array(env, decl->td->array));
+  }
   const Value v = vd->value =
       vd->value ?: new_value(env, t, s_name(vd->xid), vd->pos);
   nspc_add_value(env->curr, vd->xid, v);
diff --git a/tests/array/array0.gw b/tests/array/array0.gw
new file mode 100644 (file)
index 0000000..b091f57
--- /dev/null
@@ -0,0 +1,7 @@
+class abstract C {
+
+}
+
+class D {
+    var C[2] modules;
+}
diff --git a/tests/array/array1.gw b/tests/array/array1.gw
new file mode 100644 (file)
index 0000000..7117ca8
--- /dev/null
@@ -0,0 +1,3 @@
+class abstract C {}
+
+late C[2] c;
diff --git a/tests/array/array2.gw b/tests/array/array2.gw
new file mode 100644 (file)
index 0000000..5997826
--- /dev/null
@@ -0,0 +1 @@
+var int[] i;
diff --git a/tests/array/array3.gw b/tests/array/array3.gw
new file mode 100644 (file)
index 0000000..cbce228
--- /dev/null
@@ -0,0 +1,3 @@
+class abstract C {}
+
+new C[2];
index d89b90160095da274f832bc9ec57e3af2666ebde..841e285db5b1d517c9dbad5ecbb05c7f5543729e 100644 (file)
@@ -1,2 +1,2 @@
-#! [contains] must be declared empty
+#! [contains] arrays of abstract type
 var Shred[12] shreds;
index cee8891e021a5241633fa765ee0a9799ff897a8e..86ee14e44680c0d782ada5cec6f4fe51c9079f8d 100644 (file)
@@ -1,3 +1,3 @@
 #! [contains] invalid array access expression
-var int[] j;
+var int[2] j;
 j[1,2,3,4] => i;