]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve Function shadowing
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Sun, 12 Jul 2020 17:16:19 +0000 (19:16 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Sun, 12 Jul 2020 17:16:19 +0000 (19:16 +0200)
src/parse/scan1.c

index 730e98113499dfe4b7000e0e71b34e84f8b40dcc..c4e6e919b3ab1d54313fe002a978971530375413 100644 (file)
@@ -502,9 +502,20 @@ ANN m_bool scan1_fdef(const Env env, const Func_Def fdef) {
   return GW_OK;
 }
 
+ANN static inline m_bool scan1_fdef_defined(const Env env, const Func_Def fdef) {
+  const Value v = nspc_lookup_value1(env->curr, fdef->base->xid);
+  if(!v)
+    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))
+}
+
 ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
   if(fdef->base->td)
     CHECK_BB(env_storage(env, fdef->flag, td_pos(fdef->base->td)))
+  CHECK_BB(scan1_fdef_defined(env, fdef))
   if(tmpl_base(fdef->base->tmpl))
     return scan1_fdef_base_tmpl(env, fdef->base);
   struct Func_ fake = { .name=s_name(fdef->base->xid) }, *const former = env->func;