summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2009-05-15 13:46:13 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2009-05-15 13:46:13 +0000
commita64bbe049e19618c33a878154f2e69029d45ecd7 (patch)
tree678788b5dc60db823e065d7ac1a33aba232b79d2
parentd407d572fdc72f4eb14cc0f37d7d61446425b663 (diff)
downloadguix-a64bbe049e19618c33a878154f2e69029d45ecd7.tar.gz
* Change the scoping of "inherit (e) ..." in recs so that the
  attributes of the rec are in scope of `e'.  This is useful in
  expressions such as

    rec {
      lib = import ./lib;
      inherit (lib) concatStrings;
    }

  It does change the semantics of expressions such as

    let x = {y = 1;}; in rec { x = {y = 2;}; inherit (x) y; }.y

  This now returns 2 instead of 1.  However, no code in Nixpkgs or
  NixOS seems to rely on the old behaviour.

-rw-r--r--src/libexpr/parser.y5
-rw-r--r--tests/lang/eval-okay-scope-7.exp1
-rw-r--r--tests/lang/eval-okay-scope-7.nix6
3 files changed, 10 insertions, 2 deletions
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 2ee3833fe6..c4afb72eac 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -91,12 +91,13 @@ static Expr fixAttrs(bool recursive, ATermList as)
         if (matchInherit(*i, src, names, pos)) {
             bool fromScope = matchScope(src);
             for (ATermIterator j(names); j; ++j) {
-                Expr rhs = fromScope ? makeVar(*j) : makeSelect(src, *j);
                 if (attrs.children.find(*j) != attrs.children.end()) 
                     throw ParseError(format("duplicate definition of attribute `%1%' at %2%")
                         % showAttrPath(ATmakeList1(*j)) % showPos(pos));
                 Tree & t(attrs.children[*j]);
-                t.leaf = rhs; t.pos = pos; if (recursive) t.recursive = false;
+                t.leaf = fromScope ? makeVar(*j) : makeSelect(src, *j);
+                t.pos = pos;
+                if (recursive && fromScope) t.recursive = false;
             }
         }
 
diff --git a/tests/lang/eval-okay-scope-7.exp b/tests/lang/eval-okay-scope-7.exp
new file mode 100644
index 0000000000..067d2b7461
--- /dev/null
+++ b/tests/lang/eval-okay-scope-7.exp
@@ -0,0 +1 @@
+Int(1)
diff --git a/tests/lang/eval-okay-scope-7.nix b/tests/lang/eval-okay-scope-7.nix
new file mode 100644
index 0000000000..4da02968f6
--- /dev/null
+++ b/tests/lang/eval-okay-scope-7.nix
@@ -0,0 +1,6 @@
+rec {
+  inherit (x) y;
+  x = {
+    y = 1;
+  };
+}.y