diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-02-16T09·18+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-02-16T09·18+0000 |
commit | fbc48a469c80201f0d159a9b9f48a22ce5f36984 (patch) | |
tree | 953874db63ad16fe6a184f2ea4d8ef8425c1fb5d /src/libexpr/nixexpr.cc | |
parent | 76c0e85929dc747288a8fe66a7bb77673cf2aa7e (diff) |
* Inherited attributes in recursive attribute sets are in scope of the
non-inherited attributes.
Diffstat (limited to 'src/libexpr/nixexpr.cc')
-rw-r--r-- | src/libexpr/nixexpr.cc | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 7739e99a96be..8fe5d379af71 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); } |