diff --git a/src/rustc/metadata/csearch.rs b/src/rustc/metadata/csearch.rs index 9ba99139b90..68a721b6345 100644 --- a/src/rustc/metadata/csearch.rs +++ b/src/rustc/metadata/csearch.rs @@ -70,7 +70,7 @@ fn resolve_path(cstore: cstore::cstore, cnum: ast::crate_num, result += [(cnum, cm.data, def)]; } else { if cm.cnum_map.contains_key(def.crate) { - // This reexport is itself a reexport from anther crate + // This reexport is itself a reexport from another crate let next_cnum = cm.cnum_map.get(def.crate); let next_cm_data = cstore::get_crate_data(cstore, next_cnum); result += [(next_cnum, next_cm_data.data, def)]; diff --git a/src/rustc/middle/resolve.rs b/src/rustc/middle/resolve.rs index 150466a7097..7ed403c237d 100644 --- a/src/rustc/middle/resolve.rs +++ b/src/rustc/middle/resolve.rs @@ -1667,9 +1667,12 @@ fn ns_for_def(d: def) -> namespace { fn lookup_external(e: env, cnum: int, ids: [ident], ns: namespace) -> option { let mut result = none; + let mut done = false; for csearch::lookup_defs(e.sess.cstore, cnum, ids).each {|d| e.ext_map.insert(def_id_of_def(d), ids); - if ns == ns_for_def(d) { result = some(d); } + if ns == ns_for_def(d) && !done { + result = some(d); + } } ret result; } @@ -1998,8 +2001,14 @@ fn check_exports(e: @env) { } } } - found_something |= lookup_glob_any(e, _mod, vi.span, ident, - export_id); + /* + This code previously used bitwise or (|=) but that was wrong, + because we need or to be lazy here. If something was already + found, we don't want to call lookup_glob_any (see #2316 for + what happens if we do) + */ + found_something = found_something || + lookup_glob_any(e, _mod, vi.span, ident, export_id); if !found_something { e.sess.span_warn(vi.span, #fmt("exported item %s is not defined", ident)); diff --git a/src/test/auxiliary/issue_2316_a.rs b/src/test/auxiliary/issue_2316_a.rs new file mode 100644 index 00000000000..418ddc0b069 --- /dev/null +++ b/src/test/auxiliary/issue_2316_a.rs @@ -0,0 +1,3 @@ +enum cat { + tabby, calico, tortoiseshell +} diff --git a/src/test/auxiliary/issue_2316_b.rs b/src/test/auxiliary/issue_2316_b.rs new file mode 100644 index 00000000000..c1be44d19f9 --- /dev/null +++ b/src/test/auxiliary/issue_2316_b.rs @@ -0,0 +1,16 @@ +use issue_2316_a; + +mod cloth { + +import issue_2316_a::*; + +export calico, gingham, flannel; +export fabric; + +enum fabric { + gingham, flannel, calico +} + +} + + diff --git a/src/test/run-pass/issue-2316-c.rs b/src/test/run-pass/issue-2316-c.rs new file mode 100644 index 00000000000..27f4d89a93b --- /dev/null +++ b/src/test/run-pass/issue-2316-c.rs @@ -0,0 +1,10 @@ +// xfail-fast - check-fast doesn't understand aux-build +// aux-build:issue_2316_a.rs +// aux-build:issue_2316_b.rs + +use issue_2316_b; +import issue_2316_b::cloth; + +fn main() { + let _c: cloth::fabric = cloth::calico; +} \ No newline at end of file diff --git a/src/test/run-pass/issue-2316.rs b/src/test/run-pass/issue-2316.rs new file mode 100644 index 00000000000..a95b9841c24 --- /dev/null +++ b/src/test/run-pass/issue-2316.rs @@ -0,0 +1,5 @@ +use rustc; +import rustc::middle::ty; +fn main() { + let _t: ty::sty = rustc::middle::ty::ty_nil; +}