Don't crash when reporting an unresolved import in the nil scope
Closes #1027
This commit is contained in:
parent
3808a498cd
commit
06257d66e7
1 changed files with 22 additions and 18 deletions
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue