]> Nishi Git Mirror - gwion.git/commitdiff
:art: Better define primitive
authorJérémie Astor <fennecdjay@gmail.com>
Mon, 18 Apr 2022 16:35:52 +0000 (18:35 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Mon, 18 Apr 2022 16:35:52 +0000 (18:35 +0200)
src/parse/scan0.c
src/parse/scan1.c

index 99feeb4724d0ae47b5b9a6ecb6bf3cdf2201c4e5..7260935637add5552d9690a77f9dd71c13611a98 100644 (file)
@@ -150,10 +150,13 @@ ANN static m_bool typedef_complex(const Env env, const Type_Def tdef,
   const Class_Def cdef = new_class_def(env->gwion->mp, flag, tdef->xid,
                                        cpy_type_decl(env->gwion->mp, tdef->ext),
                                        NULL, tdef->ext->pos);
+  const bool final = GET_FLAG(base, final);
+  if(final) UNSET_FLAG(base, final);
   CHECK_BB(scan0_class_def(env, cdef));
   tdef->type      = cdef->base.type;
   cdef->base.tmpl = tdef->tmpl; // check cpy
   set_tflag(tdef->type, tflag_cdef);
+  if(final) SET_FLAG(base, final);
   mk_class(env, tdef->type, tdef->pos);
   return GW_OK;
 }
index 2a31cf947b370467e3d238cf5c15becffa128e5c..c9e6783a80874018fc1df016917aac158179e4ba 100644 (file)
@@ -725,7 +725,8 @@ ANN static m_bool scan1_parent(const Env env, const Class_Def cdef) {
   if (cdef->base.ext->array && cdef->base.ext->array->exp)
     CHECK_BB(scan1_exp(env, cdef->base.ext->array->exp));
   DECL_OB(const Type, parent, = scan1_get_parent(env, &cdef->base));
-  if (isa(parent, env->gwion->type[et_object]) < 0)
+  if (isa(parent, env->gwion->type[et_object]) < 0 &&
+      !(tflag(cdef->base.type, tflag_cdef) || tflag(cdef->base.type, tflag_udef)))
     ERR_B(pos, _("cannot extend primitive type '%s'"), parent->name)
   CHECK_BB(ensure_scan1(env, parent));
   if (type_ref(parent)) ERR_B(pos, _("can't use ref type in class extend"))