Skip to content

Commit 58490d7

Browse files
cixtorgraydon
authored andcommitted
Fix the last known (to me) bug in import resolution. We were not properly
dropping the inner part of the environment when an intermediate item resolved in an outer scope.
1 parent d1fdf0a commit 58490d7

File tree

3 files changed

+47
-12
lines changed

3 files changed

+47
-12
lines changed

src/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
448448
import4.rs \
449449
import5.rs \
450450
import6.rs \
451+
import7.rs \
451452
item-name-overload.rs \
452453
large-records.rs \
453454
lazy-init.rs \

src/comp/middle/resolve.rs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ fn lookup_name(&env e, import_map index,
4040
ast.ident i) -> option.t[def] {
4141
auto d_ = lookup_name_wrapped(e, i);
4242
alt (d_) {
43-
case (none[def_wrap]) {
43+
case (none[tup(@env, def_wrap)]) {
4444
ret none[def];
4545
}
46-
case (some[def_wrap](?d)) {
47-
alt (d) {
46+
case (some[tup(@env, def_wrap)](?d)) {
47+
alt (d._1) {
4848
case (def_wrap_use(?it)) {
4949
alt (it.node) {
5050
case (ast.view_item_use(_, _, ?id)) {
@@ -115,14 +115,14 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
115115
auto next_i = rest_idents.(0);
116116
auto next_ = lookup_name_wrapped(tmp_e, next_i);
117117
alt (next_) {
118-
case (none[def_wrap]) {
118+
case (none[tup(@env, def_wrap)]) {
119119
e.sess.span_err(sp, "unresolved name: " + next_i);
120120
fail;
121121
}
122-
case (some[def_wrap](?next)) {
122+
case (some[tup(@env, def_wrap)](?next)) {
123123
auto combined_e = update_env_for_item(e, i);
124124
ret found_something(combined_e, pending, sp,
125-
rest_idents, next);
125+
rest_idents, next._1);
126126
}
127127
}
128128
}
@@ -141,20 +141,20 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
141141
auto first = idents.(0);
142142
auto d_ = lookup_name_wrapped(e, first);
143143
alt (d_) {
144-
case (none[def_wrap]) {
144+
case (none[tup(@env, def_wrap)]) {
145145
e.sess.span_err(sp, "unresolved name: " + first);
146146
fail;
147147
}
148-
case (some[def_wrap](?d)) {
149-
ret found_something(e, pending, sp, idents, d);
148+
case (some[tup(@env, def_wrap)](?d)) {
149+
ret found_something(*d._0, pending, sp, idents, d._1);
150150
}
151151
}
152152
}
153153
auto pending = new_def_hash[bool]();
154154
ret inner(e, pending, sp, idents);
155155
}
156156

157-
fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[def_wrap] {
157+
fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
158158

159159
// log "resolving name " + i;
160160

@@ -308,8 +308,23 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[def_wrap] {
308308
ret none[def_wrap];
309309
}
310310

311-
ret std.list.find[scope,def_wrap](e.scopes,
312-
bind in_scope(i, _));
311+
alt (e.scopes) {
312+
case (nil[scope]) {
313+
ret none[tup(@env, def_wrap)];
314+
}
315+
case (cons[scope](?hd, ?tl)) {
316+
auto x = in_scope(i, hd);
317+
alt (x) {
318+
case (some[def_wrap](?x)) {
319+
ret some(tup(@e, x));
320+
}
321+
case (none[def_wrap]) {
322+
auto outer_env = rec(scopes = *tl with e);
323+
ret lookup_name_wrapped(outer_env, i);
324+
}
325+
}
326+
}
327+
}
313328
}
314329

315330
fn fold_pat_tag(&env e, &span sp, import_map index, ident i,

src/test/run-pass/import7.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import bar.baz;
2+
import foo.zed;
3+
mod foo {
4+
mod zed {
5+
fn baz() {
6+
log "baz";
7+
}
8+
}
9+
}
10+
mod bar {
11+
import zed.baz;
12+
mod foo {
13+
mod zed {
14+
}
15+
}
16+
}
17+
fn main(vec[str] args) {
18+
baz();
19+
}

0 commit comments

Comments
 (0)