diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index b26ebfd6121b4..ccd8ed7c2a536 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -297,7 +297,17 @@ pub fn provide<'tcx>(providers: &mut Providers<'tcx>) { assert_eq!(cnum, LOCAL_CRATE); let mut visible_parent_map: DefIdMap = DefIdMap(); - for &cnum in tcx.crates().iter() { + // Preferring shortest paths alone does not guarantee a + // deterministic result; so sort by crate num to avoid + // hashtable iteration non-determinism. This only makes + // things as deterministic as crate-nums assignment is, + // which is to say, its not deterministic in general. But + // we believe that libstd is consistently assigned crate + // num 1, so it should be enough to resolve #46112. + let mut crates: Vec = (*tcx.crates()).clone(); + crates.sort(); + + for &cnum in crates.iter() { // Ignore crates without a corresponding local `extern crate` item. if tcx.missing_extern_crate_item(cnum) { continue diff --git a/src/test/compile-fail/auxiliary/issue_1920.rs b/src/test/compile-fail/auxiliary/issue_1920.rs new file mode 100644 index 0000000000000..55065174ca759 --- /dev/null +++ b/src/test/compile-fail/auxiliary/issue_1920.rs @@ -0,0 +1,14 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Just exporting some type to test for correct diagnostics when this +// crate is pulled in at a non-root location in client crate. + +pub struct S; diff --git a/src/test/compile-fail/issue-1920-1.rs b/src/test/compile-fail/issue-1920-1.rs index f829d4645a089..97dd290a45bc8 100644 --- a/src/test/compile-fail/issue-1920-1.rs +++ b/src/test/compile-fail/issue-1920-1.rs @@ -10,13 +10,15 @@ //! Test that absolute path names are correct when a crate is not linked into the root namespace +// aux-build:issue_1920.rs + mod foo { - pub extern crate core; + pub extern crate issue_1920; } fn assert_clone() where T : Clone { } fn main() { - assert_clone::(); - //~^ ERROR `foo::core::sync::atomic::AtomicBool: foo::core::clone::Clone` is not satisfied + assert_clone::(); + //~^ ERROR `foo::issue_1920::S: std::clone::Clone` is not satisfied } diff --git a/src/test/compile-fail/issue-1920-2.rs b/src/test/compile-fail/issue-1920-2.rs index 02c925f336eae..2af6e2cc991fa 100644 --- a/src/test/compile-fail/issue-1920-2.rs +++ b/src/test/compile-fail/issue-1920-2.rs @@ -10,11 +10,13 @@ //! Test that when a crate is linked under another name that name is used in global paths -extern crate core as bar; +// aux-build:issue_1920.rs + +extern crate issue_1920 as bar; fn assert_clone() where T : Clone { } fn main() { - assert_clone::(); - //~^ ERROR `bar::sync::atomic::AtomicBool: bar::clone::Clone` is not satisfied + assert_clone::(); + //~^ ERROR `bar::S: std::clone::Clone` is not satisfied } diff --git a/src/test/compile-fail/issue-1920-3.rs b/src/test/compile-fail/issue-1920-3.rs index 2f5da907b95f6..fa6efea845fce 100644 --- a/src/test/compile-fail/issue-1920-3.rs +++ b/src/test/compile-fail/issue-1920-3.rs @@ -10,15 +10,17 @@ //! Test that when a crate is linked multiple times that the shortest absolute path name is used +// aux-build:issue_1920.rs + mod foo { - pub extern crate core; + pub extern crate issue_1920; } -extern crate core; +extern crate issue_1920; fn assert_clone() where T : Clone { } fn main() { - assert_clone::(); - //~^ ERROR `core::sync::atomic::AtomicBool: core::clone::Clone` is not satisfied + assert_clone::(); + //~^ ERROR `issue_1920::S: std::clone::Clone` is not satisfied } diff --git a/src/test/ui/auxiliary/xcrate_issue_46112_rexport_core.rs b/src/test/ui/auxiliary/xcrate_issue_46112_rexport_core.rs new file mode 100644 index 0000000000000..80f877f834d8b --- /dev/null +++ b/src/test/ui/auxiliary/xcrate_issue_46112_rexport_core.rs @@ -0,0 +1,13 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![crate_type="lib"] + +pub extern crate core; diff --git a/src/test/ui/issue-46112.rs b/src/test/ui/issue-46112.rs new file mode 100644 index 0000000000000..c292f73bf0b23 --- /dev/null +++ b/src/test/ui/issue-46112.rs @@ -0,0 +1,20 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Issue 46112: An extern crate pub reexporting libcore was causing +// paths rooted from `std` to be misrendered in the diagnostic output. + +// ignore-windows +// aux-build:xcrate_issue_46112_rexport_core.rs + +extern crate xcrate_issue_46112_rexport_core; +fn test(r: Result, &'static str>) { } +fn main() { test(Ok(())); } +//~^ mismatched types diff --git a/src/test/ui/issue-46112.stderr b/src/test/ui/issue-46112.stderr new file mode 100644 index 0000000000000..b9b87a941fd27 --- /dev/null +++ b/src/test/ui/issue-46112.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/issue-46112.rs:19:21 + | +19 | fn main() { test(Ok(())); } + | ^^ + | | + | expected enum `std::option::Option`, found () + | help: try using a variant of the expected type: `Some(())` + | + = note: expected type `std::option::Option<()>` + found type `()` + +error: aborting due to previous error +