about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/nixexpr.cc4
-rw-r--r--src/libexpr/primops.cc13
2 files changed, 12 insertions, 5 deletions
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index cb006d147e52..a6cde127c3b2 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -54,7 +54,7 @@ void queryAllAttrs(Expr e, ATermMap & attrs, bool withPos)
 {
     ATermList bnds;
     if (!matchAttrs(e, bnds))
-        throw TypeError("attribute set expected");
+        throw TypeError(format("value is %1% while an attribute set was expected") % showType(e));
 
     for (ATermIterator i(bnds); i; ++i) {
         ATerm name;
@@ -77,7 +77,7 @@ Expr queryAttr(Expr e, const string & name, ATerm & pos)
 {
     ATermList bnds;
     if (!matchAttrs(e, bnds))
-        throw TypeError("attribute set expected");
+        throw TypeError(format("value is %1% while an attribute set was expected") % showType(e));
 
     for (ATermIterator i(bnds); i; ++i) {
         ATerm name2, pos2;
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 8118f840106f..0f62653b0e9c 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -130,12 +130,19 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
     queryAllAttrs(evalExpr(state, args[0]), attrs, true);
 
     /* Figure out the name already (for stack backtraces). */
+    ATerm posDrvName;
     Expr eDrvName = attrs.get(toATerm("name"));
     if (!eDrvName)
         throw EvalError("required attribute `name' missing");
-    ATerm posDrvName;
     if (!matchAttrRHS(eDrvName, eDrvName, posDrvName)) abort();
-    string drvName = evalStringNoCtx(state, eDrvName);
+    string drvName;
+    try {        
+        drvName = evalStringNoCtx(state, eDrvName);
+    } catch (Error & e) {
+        e.addPrefix(format("while evaluating the derivation attribute `name' at %1%:\n")
+            % showPos(posDrvName));
+        throw;
+    }
 
     /* Build the derivation expression by processing the attributes. */
     Derivation drv;
@@ -190,7 +197,7 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
             }
 
         } catch (Error & e) {
-            e.addPrefix(format("while processing the derivation attribute `%1%' at %2%:\n")
+            e.addPrefix(format("while evaluating the derivation attribute `%1%' at %2%:\n")
                 % key % showPos(pos));
             e.addPrefix(format("while instantiating the derivation named `%1%' at %2%:\n")
                 % drvName % showPos(posDrvName));