Skip to content

Commit 06257d6

Browse files
committed
Don't crash when reporting an unresolved import in the nil scope
Closes #1027
1 parent 3808a49 commit 06257d6

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

src/comp/middle/resolve.rs

+22-18
Original file line numberDiff line numberDiff line change
@@ -454,14 +454,14 @@ fn resolve_import(e: env, defid: ast::def_id, name: ast::ident,
454454
lookup_in_scope(e, sc, sp, end_id, ns_type),
455455
lookup_in_scope(e, sc, sp, end_id, ns_module));
456456
remove_if_unresolved(e.imports, defid.node);
457-
} else { // FIXME (issue #521)
457+
} else {
458458
let dcur =
459459
alt lookup_in_scope(e, sc, sp, ids[0], ns_module) {
460460
some(dcur) { dcur }
461461
none. {
462462
unresolved_err(e, sc, sp, ids[0], ns_name(ns_module));
463463
remove_if_unresolved(e.imports, defid.node);
464-
ret ()
464+
ret;
465465
}
466466
};
467467
let i = 1u;
@@ -476,16 +476,15 @@ fn resolve_import(e: env, defid: ast::def_id, name: ast::ident,
476476
remove_if_unresolved(e.imports, defid.node);
477477
break;
478478
} else {
479-
dcur =
480-
alt lookup_in_mod(e, dcur, sp, ids[i], ns_module, outside)
481-
{
482-
some(dcur) { dcur }
483-
none. {
484-
unresolved_err(e, sc, sp, ids[i], ns_name(ns_module));
485-
remove_if_unresolved(e.imports, defid.node);
486-
ret () // FIXME (issue #521)
487-
}
488-
};
479+
dcur = alt lookup_in_mod(e, dcur, sp, ids[i], ns_module,
480+
outside) {
481+
some(dcur) { dcur }
482+
none. {
483+
unresolved_err(e, sc, sp, ids[i], ns_name(ns_module));
484+
remove_if_unresolved(e.imports, defid.node);
485+
ret;
486+
}
487+
};
489488
i += 1u;
490489
}
491490
}
@@ -523,27 +522,32 @@ fn ns_name(ns: namespace) -> str {
523522
}
524523

525524
fn unresolved_err(e: env, sc: scopes, sp: span, name: ident, kind: str) {
526-
fn find_fn_or_mod_scope(sc: scopes) -> scope {
525+
fn find_fn_or_mod_scope(sc: scopes) -> option::t<scope> {
527526
while true {
528527
alt sc {
529528
cons(cur, rest) {
530529
alt cur {
531530
scope_crate. | scope_fn(_, _, _) |
532531
scope_item(@{node: ast::item_mod(_), _}) {
533-
ret cur;
532+
ret some(cur);
534533
}
535534
_ { sc = *rest; }
536535
}
537536
}
537+
_ { ret none; }
538538
}
539539
}
540540
fail;
541541
}
542-
let err_scope = find_fn_or_mod_scope(sc);
543-
for rs: {ident: str, sc: scope} in e.reported {
544-
if str::eq(rs.ident, name) && err_scope == rs.sc { ret; }
542+
alt find_fn_or_mod_scope(sc) {
543+
some(err_scope) {
544+
for rs: {ident: str, sc: scope} in e.reported {
545+
if str::eq(rs.ident, name) && err_scope == rs.sc { ret; }
546+
}
547+
e.reported += [{ident: name, sc: err_scope}];
548+
}
549+
_ {}
545550
}
546-
e.reported += [{ident: name, sc: err_scope}];
547551
e.sess.span_err(sp, mk_unresolved_msg(name, kind));
548552
}
549553

0 commit comments

Comments
 (0)