]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix find_value and introduce not_from_owner
authorfennecdjay <astor.jeremie@wanadoo.fr>
Mon, 15 Jul 2019 21:16:36 +0000 (23:16 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Mon, 15 Jul 2019 21:16:36 +0000 (23:16 +0200)
src/oo/type.c
src/parse/check.c

index f8bc74afbea71cc4ac36a31a45baff365e95c6a5..ca36381c377f9ce76ced2be377502c1b2a3b8840 100644 (file)
@@ -66,7 +66,7 @@ ANN Type find_common_anc(const restrict Type lhs, const restrict Type rhs) {
 #define describe_find(name, t)                                       \
 ANN t find_##name(const Type type, const Symbol xid) {               \
   if(type->nspc) {                                                   \
-  const t val = nspc_lookup_##name##0(type->nspc, xid);              \
+  const t val = nspc_lookup_##name##1(type->nspc, xid);              \
   if(val)                                                            \
     return val;                                                      \
   }                                                                  \
index 91ccdd9d8e2912e129e01c33d60b7163e3ace1f8..12bce2ed56ba7d6d003d61c3c12e309c736038b4 100644 (file)
@@ -157,13 +157,27 @@ ANN static Type prim_array(const Env env, const Exp_Primary* primary) {
   return (array->type = prim_array_match(env, e));
 }
 
+ANN static inline m_bool not_from_owner_class(const Env env, const Type t,
+      const Value v, const loc_t pos) {
+  if(!v->owner_class || isa(t, v->owner_class) < 0) {
+    ERR_B(pos,
+        _("'%s' from owner namespace '%s' used in '%s'."),
+            v->name, v->owner->name, t->name)
+  }
+  return GW_OK;
+}
+
 ANN static Value check_non_res_value(const Env env, const Exp_Primary* primary) {
   const Value value = nspc_lookup_value1(env->curr, primary->d.var);
   if(env->class_def) {
     const Value v = value ? value : find_value(env->class_def, primary->d.var);
-    if(v && env->func && GET_FLAG(env->func->def, static) && GET_FLAG(v, member))
-      ERR_O(exp_self(primary)->pos,
-            _("non-static member '%s' used from static function."), s_name(primary->d.var))
+    if(v) {
+      if(v->owner)
+        CHECK_BO(not_from_owner_class(env, env->class_def, v, exp_self(primary)->pos))
+      if(env->func && GET_FLAG(env->func->def, static) && GET_FLAG(v, member))
+        ERR_O(exp_self(primary)->pos,
+              _("non-static member '%s' used from static function."), s_name(primary->d.var))
+    }
     return v;
   } else if(env->func && GET_FLAG(env->func->def, global)) {
     if(!SAFE_FLAG(value, abstract) && !SAFE_FLAG(value, arg))
@@ -801,6 +815,7 @@ ANN static Type check_exp_dot(const Env env, Exp_Dot* member) {
       did_you_mean_type(member->t_base, str);
     return NULL;
   }
+  CHECK_BO(not_from_owner_class(env, the_base, value, exp_self(member)->pos))
   if(!env->class_def || isa(env->class_def, value->owner_class) < 0) {
     if(GET_FLAG(value, private))
       ERR_O(exp_self(member)->pos,
@@ -1118,6 +1133,8 @@ ANN static m_bool parent_match_actual(const Env env, const restrict Func_Def fde
 ANN static m_bool check_parent_match(const Env env, const Func_Def fdef) {
   const Func func = fdef->base->func;
   const Type parent = env->class_def->e->parent;
+  if(!env->curr->info->vtable.ptr)
+    vector_init(&env->curr->info->vtable);
   if(parent) {
     const Value v = find_value(parent, fdef->base->xid);
     if(v && isa(v->type, t_function) > 0) {
@@ -1126,8 +1143,6 @@ ANN static m_bool check_parent_match(const Env env, const Func_Def fdef) {
         return match;
     }
   }
-  if(!env->curr->info->vtable.ptr)
-    vector_init(&env->curr->info->vtable);
   func->vt_index = vector_size(&env->curr->info->vtable);
   vector_add(&env->curr->info->vtable, (vtype)func);
   return GW_OK;