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

index fdbfeda10911c254532b5827fe19b1b59269b29c..730e98113499dfe4b7000e0e71b34e84f8b40dcc 100644 (file)
@@ -469,9 +469,23 @@ ANN static m_bool scan_internal(const Env env, const Func_Base *base) {
   return GW_OK;
 }
 
+ANN static m_bool scan1_fdef_args(const Env env, Arg_List list) {
+  do {
+    Nspc nspc = env->curr;
+    do if(nspc_lookup_value0(nspc, list->var_decl->xid))
+       ERR_B(list->var_decl->pos, _("argument '%s' shadows a previuosly defined variable"),
+            s_name(list->var_decl->xid))
+    while((nspc = nspc->parent));
+  } while((list = list->next));
+  return GW_OK;
+}
+
 ANN m_bool scan1_fbody(const Env env, const Func_Def fdef) {
-  if(fdef->base->args)
+  if(fdef->base->args) {
+    if(!GET_FLAG(fdef, builtin))
+      CHECK_BB(scan1_fdef_args(env, fdef->base->args))
     CHECK_BB(scan1_args(env, fdef->base->args))
+  }
   if(!GET_FLAG(fdef, builtin) && fdef->d.code && fdef->d.code->d.stmt_code.stmt_list)
     CHECK_BB(scan1_stmt_list(env, fdef->d.code->d.stmt_code.stmt_list))
   return GW_OK;