diff options
-rw-r--r-- | eval.c | 6 | ||||
-rw-r--r-- | unwind.c | 5 | ||||
-rw-r--r-- | unwind.h | 1 |
3 files changed, 11 insertions, 1 deletions
@@ -2929,8 +2929,12 @@ static val me_def_variable(val form, val menv) if (!bindable(sym)) not_bindable_error(form, sym); - if (op == defparm_s || op == defvar_s) + if (op == defparm_s || op == defvar_s) { mark_special(sym); + if (uw_warning_exists(cons(var_s, sym))) + eval_warn(form, lit("~s: global ~s marked special after lexical uses"), + op, sym, nao); + } return apply_frob_args(list(prog1_s, cons(defvarl_s, @@ -707,6 +707,11 @@ val uw_defer_warning(val args) return nil; } +val uw_warning_exists(val tag) +{ + return member(tag, deferred_warnings, equal_f, cdr_f); +} + val uw_register_tentative_def(val tag) { uw_purge_deferred_warning(tag); @@ -137,6 +137,7 @@ noreturn val uw_throwfv(val sym, val fmt, struct args *); noreturn val uw_errorf(val fmt, ...); noreturn val uw_errorfv(val fmt, struct args *args); val uw_defer_warning(val args); +val uw_warning_exists(val tag); val uw_dump_deferred_warnings(val stream); val uw_release_deferred_warnings(void); val uw_purge_deferred_warning(val tag); |