From aa030dd3deb438c688c85c32eb75d009378c5f12 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 19 Dec 2017 15:04:02 +0100 Subject: [PATCH] Followup for #46112. Sorting by crate-num should ensure that we favor `std::foo::bar` over `any_other_crate::foo::bar`. Interestingly, *this* change had a much larger impact on our internal test suite than PR #46708 (which was my original fix to #46112). --- src/librustc_metadata/cstore_impl.rs | 13 ++++++++++++- src/test/compile-fail/auxiliary/issue_1920.rs | 14 ++++++++++++++ src/test/compile-fail/issue-17959.rs | 2 +- src/test/compile-fail/issue-1920-1.rs | 8 +++++--- src/test/compile-fail/issue-1920-2.rs | 8 +++++--- src/test/compile-fail/issue-1920-3.rs | 10 ++++++---- src/test/compile-fail/kindck-send-unsafe.rs | 2 +- src/test/ui/print_type_sizes/niche-filling.stdout | 4 ++-- 8 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 src/test/compile-fail/auxiliary/issue_1920.rs diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 90580de07be..955648208cd 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -305,7 +305,18 @@ pub fn provide<'tcx>(providers: &mut Providers<'tcx>) { // whatever crate we happened to encounter first in this // traversal, but not globally minimal across all crates. let bfs_queue = &mut VecDeque::new(); - 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 00000000000..55065174ca7 --- /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-17959.rs b/src/test/compile-fail/issue-17959.rs index 23be4d35361..37c8173c4f6 100644 --- a/src/test/compile-fail/issue-17959.rs +++ b/src/test/compile-fail/issue-17959.rs @@ -19,7 +19,7 @@ struct G { } impl Drop for G { -//~^ ERROR: The requirement `T: core::marker::Sized` is added only by the Drop impl. [E0367] +//~^ ERROR: The requirement `T: std::marker::Sized` is added only by the Drop impl. [E0367] fn drop(&mut self) { if !self._ptr.is_null() { } diff --git a/src/test/compile-fail/issue-1920-1.rs b/src/test/compile-fail/issue-1920-1.rs index f829d4645a0..97dd290a45b 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 02c925f336e..2af6e2cc991 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 2f5da907b95..fa6efea845f 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/compile-fail/kindck-send-unsafe.rs b/src/test/compile-fail/kindck-send-unsafe.rs index ecee2e0a4c6..c717d1a72e0 100644 --- a/src/test/compile-fail/kindck-send-unsafe.rs +++ b/src/test/compile-fail/kindck-send-unsafe.rs @@ -14,7 +14,7 @@ fn assert_send() { } fn test71<'a>() { assert_send::<*mut &'a isize>(); - //~^ ERROR `*mut &'a isize: core::marker::Send` is not satisfied + //~^ ERROR `*mut &'a isize: std::marker::Send` is not satisfied } fn main() { diff --git a/src/test/ui/print_type_sizes/niche-filling.stdout b/src/test/ui/print_type_sizes/niche-filling.stdout index af3e89a936e..0f53e7722dd 100644 --- a/src/test/ui/print_type_sizes/niche-filling.stdout +++ b/src/test/ui/print_type_sizes/niche-filling.stdout @@ -69,11 +69,11 @@ print-type-size type: `MyOption`: 1 bytes, alignment: 1 bytes print-type-size variant `None`: 0 bytes print-type-size variant `Some`: 1 bytes print-type-size field `.0`: 1 bytes -print-type-size type: `MyOption`: 1 bytes, alignment: 1 bytes +print-type-size type: `MyOption`: 1 bytes, alignment: 1 bytes print-type-size variant `None`: 0 bytes print-type-size variant `Some`: 1 bytes print-type-size field `.0`: 1 bytes -print-type-size type: `core::cmp::Ordering`: 1 bytes, alignment: 1 bytes +print-type-size type: `std::cmp::Ordering`: 1 bytes, alignment: 1 bytes print-type-size discriminant: 1 bytes print-type-size variant `Less`: 0 bytes print-type-size variant `Equal`: 0 bytes