]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Template Fixes :smile:
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 26 May 2019 19:21:48 +0000 (21:21 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 26 May 2019 19:21:48 +0000 (21:21 +0200)
src/emit/emit.c
src/parse/scan1.c
src/parse/template.c

index 4b9b64e7f0e5f5cafd30f4aba8b583bebc3febc5..d64392d29c4caecfb79ac499002536690e4064af 100644 (file)
@@ -1664,6 +1664,13 @@ ANN static m_bool emit_func_def_body(const Emitter emit, const Func_Def func_def
   return GW_OK;
 }
 
+ANN static m_bool tmpl_rettype(const Emitter emit, const Func_Def func_def) {
+  CHECK_BB(template_push_types(emit->env, func_def->base->tmpl))
+  const m_bool ret = emit_parent_inner(emit, func_def->base->ret_type->e->def);
+  nspc_pop_type(emit->gwion->mp, emit->env->curr);
+  return ret;
+}
+
 ANN static m_bool emit_func_def(const Emitter emit, const Func_Def func_def) {
   const Func func = get_func(emit->env, func_def);
   const Func former = emit->env->func;
@@ -1673,6 +1680,8 @@ ANN static m_bool emit_func_def(const Emitter emit, const Func_Def func_def) {
     UNSET_FLAG(func_def, template);
     return GW_OK;
   }
+  if(GET_FLAG(func_def->base->ret_type, template) && !GET_FLAG(func_def->base->ret_type, emit))
+    CHECK_BB(tmpl_rettype(emit, func_def))
   if(SAFE_FLAG(emit->env->class_def, builtin) && GET_FLAG(emit->env->class_def, template))
     return GW_OK;
   if(!emit->env->class_def && !GET_FLAG(func_def, global) && !func_def->base->tmpl && !emit->env->scope->depth)
index 4fa0b6bec6e1663e53c76099ae22c5483166fd93..bad133388a34204e818fe4cbd520ee1bc54ef88d 100644 (file)
@@ -15,6 +15,9 @@ ANN static m_bool scan1_stmt_list(const Env env, Stmt_List list);
 ANN static m_bool scan1_stmt(const Env env, Stmt stmt);
 
 ANN static Type void_type(const Env env, const Type_Decl* td) {
+// could be more precise
+  if(SAFE_FLAG(env->class_def, template) && td->types)
+    return t_undefined;
   const Type t = known_type(env, td);
   CHECK_OO(t)
   if(t->size)
index 5be9e0a341903c27d15beab29e92ae7ca75fc4a2..b1e7d1786b758fa9599a7bcba20b62f5273b8346 100644 (file)
@@ -177,7 +177,8 @@ ANN Type scan_type(const Env env, const Type t, const Type_Decl* type) {
       SET_FLAG(a->base.type, dtor);
       ADD_REF(t->nspc->dtor)
     }
-    nspc_add_type(t->e->owner, insert_symbol(a->base.type->name), a->base.type);
+//    nspc_add_type(t->e->owner, insert_symbol(a->base.type->name), a->base.type);
+    map_set(&t->e->owner->info->type->map, insert_symbol(a->base.type->name), a->base.type);
     return a->base.type;
   } else if(type->types)
       ERR_O(type->xid->pos,