From b1e3b1a4ac8c276f503713f6002c3b42efef2ae8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 8 Oct 2013 14:45:36 +0200 Subject: [PATCH] Treat undefined variable errors consistently Previously, a undefined variable inside a "with" caused an EvalError (which can be caught), while outside, it caused a ParseError (which cannot be caught). Now both cause an UndefinedVarError (which cannot be caught). --- src/libexpr/eval.cc | 7 ++++++- src/libexpr/nixexpr.cc | 2 +- src/libexpr/nixexpr.hh | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 3d77b94e7..b54f32faf 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -258,6 +258,11 @@ LocalNoInlineNoReturn(void throwAssertionError(const char * s, const Pos & pos)) throw AssertionError(format(s) % pos); } +LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos)) +{ + throw UndefinedVarError(format(s) % s1 % pos); +} + LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2)) { e.addPrefix(format(s) % s2); @@ -315,7 +320,7 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval) return j->value; } if (!env->prevWith) - throw EvalError(format("undefined variable `%1%' at %2%") % var.name % var.pos); + throwUndefinedVarError("undefined variable `%1%' at %2%", var.name, var.pos); for (unsigned int l = env->prevWith; l; --l, env = env->up) ; } } diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 03a14695f..28049bb0d 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -198,7 +198,7 @@ void ExprVar::bindVars(const StaticEnv & env) /* Otherwise, the variable must be obtained from the nearest enclosing `with'. If there is no `with', then we can issue an "undefined variable" error now. */ - if (withLevel == -1) throw ParseError(format("undefined variable `%1%' at %2%") % name % pos); + if (withLevel == -1) throw UndefinedVarError(format("undefined variable `%1%' at %2%") % name % pos); fromWith = true; this->level = withLevel; diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index e555a5dff..f5cc69801 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -16,6 +16,7 @@ MakeError(ThrownError, AssertionError) MakeError(Abort, EvalError) MakeError(TypeError, EvalError) MakeError(ImportError, EvalError) // error building an imported derivation +MakeError(UndefinedVarError, Error) /* Position objects. */