]> git.lizzy.rs Git - rust.git/commitdiff
Don't re-export a glob-imported ID when the same ID is defined within
authorTim Chevalier <chevalier@alum.wellesley.edu>
Tue, 1 May 2012 06:26:21 +0000 (23:26 -0700)
committerTim Chevalier <chevalier@alum.wellesley.edu>
Tue, 1 May 2012 15:43:17 +0000 (08:43 -0700)
a module

See the test case I added (issue-2316-c) for a concrete example.
issue-2316 also contains the originally reported test case. resolve
was using bitwise or instead of logical or when checking exports,
resulting in excessively eager evaluation. A one-line fix that took
six hours to isolate ;-)

src/rustc/metadata/csearch.rs
src/rustc/middle/resolve.rs
src/test/auxiliary/issue_2316_a.rs [new file with mode: 0644]
src/test/auxiliary/issue_2316_b.rs [new file with mode: 0644]
src/test/run-pass/issue-2316-c.rs [new file with mode: 0644]
src/test/run-pass/issue-2316.rs [new file with mode: 0644]

index 9ba99139b902609d8ed97e98a7751d929791c5cb..68a721b634554fde8ba5514c1cf3a90c8dd4aad4 100644 (file)
@@ -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)];
index 150466a70978b96dd1d0a8d0efd6ecb91b8f7028..7ed403c237d7e2872fd84a16f51f170875e8a5b0 100644 (file)
@@ -1667,9 +1667,12 @@ fn ns_for_def(d: def) -> namespace {
 fn lookup_external(e: env, cnum: int, ids: [ident], ns: namespace) ->
    option<def> {
     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_export(e: @env, ident: str, _mod: @indexed_mod,
                 }
             }
         }
-        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 (file)
index 0000000..418ddc0
--- /dev/null
@@ -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 (file)
index 0000000..c1be44d
--- /dev/null
@@ -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 (file)
index 0000000..27f4d89
--- /dev/null
@@ -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 (file)
index 0000000..a95b984
--- /dev/null
@@ -0,0 +1,5 @@
+use rustc;
+import rustc::middle::ty;
+fn main() {
+  let _t: ty::sty = rustc::middle::ty::ty_nil;
+}