1
Fork 0

Don't crash when reporting an unresolved import in the nil scope

Closes #1027
This commit is contained in:
Marijn Haverbeke 2011-10-14 11:25:14 +02:00
parent 3808a498cd
commit 06257d66e7

View file

@ -454,14 +454,14 @@ fn resolve_import(e: env, defid: ast::def_id, name: ast::ident,
lookup_in_scope(e, sc, sp, end_id, ns_type), lookup_in_scope(e, sc, sp, end_id, ns_type),
lookup_in_scope(e, sc, sp, end_id, ns_module)); lookup_in_scope(e, sc, sp, end_id, ns_module));
remove_if_unresolved(e.imports, defid.node); remove_if_unresolved(e.imports, defid.node);
} else { // FIXME (issue #521) } else {
let dcur = let dcur =
alt lookup_in_scope(e, sc, sp, ids[0], ns_module) { alt lookup_in_scope(e, sc, sp, ids[0], ns_module) {
some(dcur) { dcur } some(dcur) { dcur }
none. { none. {
unresolved_err(e, sc, sp, ids[0], ns_name(ns_module)); unresolved_err(e, sc, sp, ids[0], ns_name(ns_module));
remove_if_unresolved(e.imports, defid.node); remove_if_unresolved(e.imports, defid.node);
ret () ret;
} }
}; };
let i = 1u; let i = 1u;
@ -476,14 +476,13 @@ fn resolve_import(e: env, defid: ast::def_id, name: ast::ident,
remove_if_unresolved(e.imports, defid.node); remove_if_unresolved(e.imports, defid.node);
break; break;
} else { } else {
dcur = dcur = alt lookup_in_mod(e, dcur, sp, ids[i], ns_module,
alt lookup_in_mod(e, dcur, sp, ids[i], ns_module, outside) outside) {
{
some(dcur) { dcur } some(dcur) { dcur }
none. { none. {
unresolved_err(e, sc, sp, ids[i], ns_name(ns_module)); unresolved_err(e, sc, sp, ids[i], ns_name(ns_module));
remove_if_unresolved(e.imports, defid.node); remove_if_unresolved(e.imports, defid.node);
ret () // FIXME (issue #521) ret;
} }
}; };
i += 1u; i += 1u;
@ -523,27 +522,32 @@ fn ns_name(ns: namespace) -> str {
} }
fn unresolved_err(e: env, sc: scopes, sp: span, name: ident, kind: str) { fn unresolved_err(e: env, sc: scopes, sp: span, name: ident, kind: str) {
fn find_fn_or_mod_scope(sc: scopes) -> scope { fn find_fn_or_mod_scope(sc: scopes) -> option::t<scope> {
while true { while true {
alt sc { alt sc {
cons(cur, rest) { cons(cur, rest) {
alt cur { alt cur {
scope_crate. | scope_fn(_, _, _) | scope_crate. | scope_fn(_, _, _) |
scope_item(@{node: ast::item_mod(_), _}) { scope_item(@{node: ast::item_mod(_), _}) {
ret cur; ret some(cur);
} }
_ { sc = *rest; } _ { sc = *rest; }
} }
} }
_ { ret none; }
} }
} }
fail; fail;
} }
let err_scope = find_fn_or_mod_scope(sc); alt find_fn_or_mod_scope(sc) {
some(err_scope) {
for rs: {ident: str, sc: scope} in e.reported { for rs: {ident: str, sc: scope} in e.reported {
if str::eq(rs.ident, name) && err_scope == rs.sc { ret; } if str::eq(rs.ident, name) && err_scope == rs.sc { ret; }
} }
e.reported += [{ident: name, sc: err_scope}]; e.reported += [{ident: name, sc: err_scope}];
}
_ {}
}
e.sess.span_err(sp, mk_unresolved_msg(name, kind)); e.sess.span_err(sp, mk_unresolved_msg(name, kind));
} }