]> Nishi Git Mirror - gwion.git/commitdiff
:art: Allow shadow in final
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 6 Dec 2020 18:55:27 +0000 (19:55 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 6 Dec 2020 18:55:27 +0000 (19:55 +0100)
src/parse/scan1.c
tests/error/function_used.gw

index a06235479be8d6c717b9cd30d84bb9086b1908f6..dfc8b35513147a5bca66abf6dc97a8b46b48ef12 100644 (file)
@@ -64,7 +64,7 @@ ANN static Type scan1_exp_decl_type(const Env env, Exp_Decl* decl) {
 static inline m_bool scan1_defined(const Env env, const Var_Decl var) {
   if(var->value) // from a `typeof` declaration
     return GW_OK;
-  if(((!env->class_def || env->scope->depth) ? nspc_lookup_value1 : nspc_lookup_value2)(env->curr, var->xid))
+  if(((!env->class_def || !GET_FLAG(env->class_def, final) || env->scope->depth) ? nspc_lookup_value1 : nspc_lookup_value2)(env->curr, var->xid))
     ERR_B(var->pos, _("variable %s has already been defined in the same scope..."),
               s_name(var->xid))
   return GW_OK;
@@ -553,8 +553,10 @@ ANN static inline m_bool scan1_fdef_defined(const Env env, const Func_Def fdef)
     return GW_OK;
   if(isa(actual_type(env->gwion, v->type), env->gwion->type[et_function]) > 0)
     return GW_OK;
-  ERR_B(fdef->pos, _("function '%s' has already been defined in the same scope..."),
-       s_name(fdef->base->xid))
+  if((!env->class_def || !GET_FLAG(env->class_def, final)) && !nspc_lookup_value0(env->curr, fdef->base->xid))
+    ERR_B(fdef->pos, _("function '%s' has already been defined in the same scope..."),
+         s_name(fdef->base->xid))
+  return GW_OK;
 }
 
 ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
index 89887f1d085c089fa7e4a76827a2e23477cb9adb..4a922ffb4e1aa2b05637a455af8bd700b3e68433 100644 (file)
@@ -1,3 +1,3 @@
-#! [contains] has already been defined in the same scope
+#! [contains] already used by another value
 var int i;
 fun void i(){}