summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.c6
-rw-r--r--unwind.c5
-rw-r--r--unwind.h1
3 files changed, 11 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index 50c6fbc7..e28e1164 100644
--- a/eval.c
+++ b/eval.c
@@ -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,
diff --git a/unwind.c b/unwind.c
index b89bf991..36c1a1e0 100644
--- a/unwind.c
+++ b/unwind.c
@@ -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);
diff --git a/unwind.h b/unwind.h
index b08f8dc9..33106a0a 100644
--- a/unwind.h
+++ b/unwind.h
@@ -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);