about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc14
-rw-r--r--src/libexpr/primops.cc2
2 files changed, 13 insertions, 3 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 6b53f60a854f..90edbecb50cd 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -321,7 +321,6 @@ Expr evalExpr2(EvalState & state, Expr e)
     /* Normal forms. */
     if (sym == symStr ||
         sym == symPath ||
-        sym == symSubPath || /* !!! evaluate */
         sym == symUri ||
         sym == symNull ||
         sym == symInt ||
@@ -503,7 +502,7 @@ Expr evalExpr2(EvalState & state, Expr e)
     }
 
     /* String or path concatenation. */
-    ATermList es;
+    ATermList es = ATempty;
     if (matchOpPlus(e, e1, e2) || matchConcatStrings(e, es)) {
         ATermVector args;
         if (matchOpPlus(e, e1, e2)) {
@@ -520,6 +519,17 @@ Expr evalExpr2(EvalState & state, Expr e)
         }
     }
 
+    /* Backwards compatability: subpath operator (~). */
+    if (matchSubPath(e, e1, e2)) {
+        static bool haveWarned;
+        warnOnce(haveWarned, "the subpath operator (~) is deprecated, use string concatenation (+) instead");
+        ATermList context = ATempty;
+        bool dummy;
+        string s1 = coerceToStringWithContext(state, context, e1, dummy);
+        string s2 = coerceToStringWithContext(state, context, e2, dummy);
+        return wrapInContext(context, makePath(toATerm(canonPath(s1 + "/" + s2))));
+    }
+
     /* List concatenation. */
     if (matchOpConcat(e, e1, e2)) {
         try {
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 5496e945e31b..65e993708a34 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -163,7 +163,7 @@ void toString(EvalState & state, Expr e,
         }
     }
 
-    else throw TypeError(format("%1% is not allowed as a derivation argument") % showType(e));
+    else throw TypeError(format("cannot convert %1% to a string") % showType(e));
     
 }