]> Nishi Git Mirror - gwion.git/commitdiff
:art: Add @class_check
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 25 Feb 2021 22:50:41 +0000 (23:50 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 25 Feb 2021 22:50:41 +0000 (23:50 +0100)
src/parse/check.c
src/parse/operator.c

index 6bd33170bab2a74e5e3efbf778dfa50dca0579c0..2c8b1f203e14b7e316820c0941f22f7367f3851e 100644 (file)
@@ -1296,6 +1296,9 @@ ANN m_bool check_class_def(const Env env, const Class_Def cdef) {
   if(tmpl_base(cdef->base.tmpl))
     return GW_OK;
   const Type t = cdef->base.type;
+  struct Op_Import opi = { .op=insert_symbol("@class_check"), .lhs=t,
+        .data=(uintptr_t)cdef, .pos=cdef->pos };
+  CHECK_OB(op_check(env, &opi))
   if(t->info->owner_class)
     CHECK_BB(ensure_check(env, t->info->owner_class))
   if(tflag(t, tflag_check))
index e394882f8d6c2efcb6d26e5d5f1fa206bee25314..3bf27e7dca71263bf91582714e426eec0b4e4369 100644 (file)
@@ -175,10 +175,13 @@ for(int i = 0; i < 2; ++i) {
     } while(l && (l = op_parent(env, l)));
   } while((nspc = nspc->parent));
 }
+  // this should be an any case
   if(opi->op == insert_symbol(env->gwion->st, "$") && opi->rhs == opi->lhs)
     return opi->rhs;
   if(opi->op == insert_symbol(env->gwion->st, "@func_check"))
     return NULL;
+  if(opi->op == insert_symbol(env->gwion->st, "@class_check"))
+    return env->gwion->type[et_error];
   if(opi->op != insert_symbol(env->gwion->st, "@implicit"))
     env_err(env, opi->pos, _("%s %s %s: no match found for operator"),
     type_name(opi->lhs), s_name(opi->op), type_name(opi->rhs));