]> Nishi Git Mirror - gwion.git/commitdiff
:art: Few fixes
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 18 May 2019 19:01:08 +0000 (21:01 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 18 May 2019 19:01:12 +0000 (21:01 +0200)
src/parse/scan0.c
src/parse/scanx.c
src/parse/template.c

index 95728044a03a28c033f62935a76a95793f4ab3d9..57d75ac7807f48265975c8eb43f0913facffecff 100644 (file)
@@ -226,8 +226,13 @@ ANN static m_bool scan0_section(const Env env, const Section* section) {
 ANN m_bool scan0_class_def(const Env env, const Class_Def cdef) {
   CHECK_BB(scan0_class_def_pre(env, cdef))
   CHECK_OB((cdef->base.type = scan0_class_def_init(env, cdef)))
-  if(cdef->body)
+  if(cdef->body) {
+int call = cdef->tmpl && !cdef->tmpl->base;
+if(call)cdef->tmpl->base = 1;
+//  assert(cdef->tmpl->base);
     CHECK_BB(env_body(env, cdef, scan0_section))
+if(call)cdef->tmpl->base = NULL;
+}
   (void)mk_class(env, cdef->base.type);
   if(GET_FLAG(cdef, global))
     env->curr = (Nspc)vector_pop(&env->scope->nspc_stack);
index 6d127b1005e4682e5811515fff997340937c0122..ab0e1eef6a7f5e558cb747d31da4f8e7d5266231 100644 (file)
@@ -21,14 +21,19 @@ ANN static inline m_int _push(const Env env, const Class_Def c) {
     if(!c->tmpl->base)
       ERR_B(c->pos,
         "you must provide template types for type '%s'", s_name(c->base.xid))
-    CHECK_BB(template_push_types(env, c->tmpl->list.list, c->tmpl->base))
+    if(c->tmpl->base != 1)
+      CHECK_BB(template_push_types(env, c->tmpl->list.list, c->tmpl->base))
   }
   return scope;
 }
 
 ANN static inline void _pop(const Env e, const Class_Def c, const m_uint s) {
-  if(c->tmpl)
-    nspc_pop_type(e->gwion->mp, e->curr);
+  if(c->tmpl) {
+    if(c->tmpl->base != 1)
+      nspc_pop_type(e->gwion->mp, e->curr);
+    else
+      c->tmpl->base = NULL;
+  }
   env_pop(e, s);
 }
 
index c9e75c26569046d4d9830b84759d00e130135c8d..1193968ce33a5971b93aa969a14d4019f376beb6 100644 (file)
@@ -146,6 +146,9 @@ ANN Type scan_type(const Env env, const Type t, const Type_Decl* type) {
   if(GET_FLAG(t, template)) {
     if(GET_FLAG(t, ref))
       return t;
+    if(!type->types)
+      ERR_O(t->e->def->pos,
+        "you must provide template types for type '%s'", t->name)
     if(template_match(t->e->def->tmpl->list.list, type->types) < 0)
       ERR_O(type->xid->pos, "invalid template types number")
     const Class_Def a = template_class(env, t->e->def, type->types);