]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve type checking
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 1 Jun 2020 22:51:25 +0000 (00:51 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 1 Jun 2020 22:51:25 +0000 (00:51 +0200)
src/env/envset.c
src/parse/check.c
src/parse/scan1.c

index 5a7a239bf607cb9b0f4cee5740065a0d91a9a67f..1b0aa7c58bc70af3ab281a64cb2bb2020b3431e3 100644 (file)
@@ -22,7 +22,7 @@ ANN static m_bool push(struct EnvSet *es, const Type t) {
     CHECK_BB(push(es, t->e->owner_class))
   else
     env_push(es->env, NULL, es->env->context->nspc);
-  if(!(t->flag & es->flag))
+  if(es->func && !(t->flag & es->flag))
     CHECK_BB(es->func((void*)es->data, t->e->def))
   if(GET_FLAG(t, template))
     CHECK_BB(template_push_types(es->env, t->e->def->base.tmpl))
index f118fa86039917f54a04edbe02f5b44b77559b86..83910ce835933038ef54d2130ecd2308c6e05e8b 100644 (file)
@@ -1013,11 +1013,9 @@ ANN static m_bool do_stmt_auto(const Env env, const Stmt_Auto stmt) {
     ptr = known_type(env, &td);
     td0->array = NULL;
     free_type_decl(env->gwion->mp, td0);
-    if(!GET_FLAG(ptr, check) && ptr->e->def) {
-      struct EnvSet es = { .env=env, .data=env, .func=(_exp_func)traverse_cdef,
-        .scope=env->scope->depth, .flag=ae_flag_check };
-      CHECK_BB(envset_run(&es, get_type(ptr)))
-    }
+    const Type base = get_type(ptr);
+    if(!GET_FLAG(base, check))
+      CHECK_BB(ensure_traverse(env, base))
   }
   t = (!stmt->is_ptr && depth) ? array_type(env, ptr, depth) : ptr;
   stmt->v = new_value(env->gwion->mp, t, s_name(stmt->sym));
index d09cbd71ec82002f21b3050c754113ed2b5166d8..1c700c4793183b2ff2495697b4ea7eff798c9f71 100644 (file)
@@ -29,8 +29,9 @@ ANN static inline m_bool ensure_scan1(const Env env, const Type t) {
 }
 
 ANN static m_bool type_recursive(const Env env, const Type_Decl *td, const Type t) {
+  const Type base = get_type(t);
   if(!GET_FLAG(td, ref) && env->class_def && !env->scope->depth &&
-          t == env->class_def) {
+          base == env->class_def) {
     ERR_B(td_pos(td), _("%s declared inside %s\n. (make it a ref ?)"),
        t->name, t == env->class_def ? "itself" : env->class_def->name);
   }