summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-02-16 09:18:35 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-02-16 09:18:35 +0000
commitfbc48a469c80201f0d159a9b9f48a22ce5f36984 (patch)
tree953874db63ad16fe6a184f2ea4d8ef8425c1fb5d /src/libexpr
parent76c0e85929dc747288a8fe66a7bb77673cf2aa7e (diff)
downloadguix-fbc48a469c80201f0d159a9b9f48a22ce5f36984.tar.gz
* Inherited attributes in recursive attribute sets are in scope of the
  non-inherited attributes.

Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc13
-rw-r--r--src/libexpr/nixexpr.cc15
2 files changed, 18 insertions, 10 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index eaa4b4ea44..335f44baac 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -100,22 +100,25 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg)
 ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
 {
     ATMatcher m;
+    ATerm name;
+    Expr e2;
 
     /* Create the substitution list. */
     ATermMap subs;
     for (ATermIterator i(rbnds); i; ++i) {
-        ATerm name;
-        Expr e2;
         if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
             abort(); /* can't happen */
         subs.set(name, ATmake("Select(<term>, <term>)", e, name));
     }
+    for (ATermIterator i(nrbnds); i; ++i) {
+        if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
+            abort(); /* can't happen */
+        subs.set(name, e2);
+    }
 
     /* Create the non-recursive set. */
     ATermMap as;
     for (ATermIterator i(rbnds); i; ++i) {
-        ATerm name;
-        Expr e2;
         if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
             abort(); /* can't happen */
         as.set(name, substitute(subs, e2));
@@ -123,8 +126,6 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
 
     /* Copy the non-recursive bindings.  !!! inefficient */
     for (ATermIterator i(nrbnds); i; ++i) {
-        ATerm name;
-        Expr e2;
         if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
             abort(); /* can't happen */
         as.set(name, e2);
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index 7739e99a96..8fe5d379af 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -205,8 +205,11 @@ Expr substitute(const ATermMap & subs, Expr e)
         for (ATermIterator i(rbnds); i; ++i)
             if (atMatch(m, *i) >> "Bind" >> name)
                 subs2.remove(name);
-            else
-                abort(); /* can't happen */
+            else abort(); /* can't happen */
+        for (ATermIterator i(nrbnds); i; ++i)
+            if (atMatch(m, *i) >> "Bind" >> name)
+                subs2.remove(name);
+            else abort(); /* can't happen */
         return ATmake("Rec(<term>, <term>)",
             substitute(subs2, (ATerm) rbnds),
             substitute(subs, (ATerm) nrbnds));
@@ -264,14 +267,18 @@ void checkVarDefs(const ATermMap & defs, Expr e)
     }
         
     else if (atMatch(m, e) >> "Rec" >> rbnds >> nrbnds) {
-        checkVarDefs(defs
-            , (ATerm) nrbnds);
+        checkVarDefs(defs, (ATerm) nrbnds);
         ATermMap defs2(defs);
         for (ATermIterator i(rbnds); i; ++i) {
             if (!(atMatch(m, *i) >> "Bind" >> name))
                 abort(); /* can't happen */
             defs2.set(name, (ATerm) ATempty);
         }
+        for (ATermIterator i(nrbnds); i; ++i) {
+            if (!(atMatch(m, *i) >> "Bind" >> name))
+                abort(); /* can't happen */
+            defs2.set(name, (ATerm) ATempty);
+        }
         checkVarDefs(defs2, (ATerm) rbnds);
     }