diff --git a/src/Makefile b/src/Makefile index bf7570675f69d..45d6ce80b3498 100644 --- a/src/Makefile +++ b/src/Makefile @@ -448,6 +448,7 @@ TEST_XFAILS_RUSTC := $(filter-out \ import4.rs \ import5.rs \ import6.rs \ + import7.rs \ item-name-overload.rs \ large-records.rs \ lazy-init.rs \ diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 3ca11fede74f6..760f86d1d8403 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -40,11 +40,11 @@ fn lookup_name(&env e, import_map index, ast.ident i) -> option.t[def] { auto d_ = lookup_name_wrapped(e, i); alt (d_) { - case (none[def_wrap]) { + case (none[tup(@env, def_wrap)]) { ret none[def]; } - case (some[def_wrap](?d)) { - alt (d) { + case (some[tup(@env, def_wrap)](?d)) { + alt (d._1) { case (def_wrap_use(?it)) { alt (it.node) { case (ast.view_item_use(_, _, ?id)) { @@ -115,14 +115,14 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap { auto next_i = rest_idents.(0); auto next_ = lookup_name_wrapped(tmp_e, next_i); alt (next_) { - case (none[def_wrap]) { + case (none[tup(@env, def_wrap)]) { e.sess.span_err(sp, "unresolved name: " + next_i); fail; } - case (some[def_wrap](?next)) { + case (some[tup(@env, def_wrap)](?next)) { auto combined_e = update_env_for_item(e, i); ret found_something(combined_e, pending, sp, - rest_idents, next); + rest_idents, next._1); } } } @@ -141,12 +141,12 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap { auto first = idents.(0); auto d_ = lookup_name_wrapped(e, first); alt (d_) { - case (none[def_wrap]) { + case (none[tup(@env, def_wrap)]) { e.sess.span_err(sp, "unresolved name: " + first); fail; } - case (some[def_wrap](?d)) { - ret found_something(e, pending, sp, idents, d); + case (some[tup(@env, def_wrap)](?d)) { + ret found_something(*d._0, pending, sp, idents, d._1); } } } @@ -154,7 +154,7 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap { ret inner(e, pending, sp, idents); } -fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[def_wrap] { +fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] { // log "resolving name " + i; @@ -308,8 +308,23 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[def_wrap] { ret none[def_wrap]; } - ret std.list.find[scope,def_wrap](e.scopes, - bind in_scope(i, _)); + alt (e.scopes) { + case (nil[scope]) { + ret none[tup(@env, def_wrap)]; + } + case (cons[scope](?hd, ?tl)) { + auto x = in_scope(i, hd); + alt (x) { + case (some[def_wrap](?x)) { + ret some(tup(@e, x)); + } + case (none[def_wrap]) { + auto outer_env = rec(scopes = *tl with e); + ret lookup_name_wrapped(outer_env, i); + } + } + } + } } fn fold_pat_tag(&env e, &span sp, import_map index, ident i, diff --git a/src/test/run-pass/import7.rs b/src/test/run-pass/import7.rs new file mode 100644 index 0000000000000..29915fb1f2fc7 --- /dev/null +++ b/src/test/run-pass/import7.rs @@ -0,0 +1,19 @@ +import bar.baz; +import foo.zed; +mod foo { + mod zed { + fn baz() { + log "baz"; + } + } +} +mod bar { + import zed.baz; + mod foo { + mod zed { + } + } +} +fn main(vec[str] args) { + baz(); +}