From a8d107be258514261a9366a8a384e370eb0a9628 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Wed, 27 Dec 2017 14:11:05 +0000 Subject: [PATCH 01/13] Correct a few stability attributes --- src/libcore/mem.rs | 14 +++++++------- src/libcore/str/mod.rs | 8 ++++++-- src/libcore/sync/atomic.rs | 13 ++++++++++++- src/libstd/ffi/c_str.rs | 8 ++++---- src/libstd/ffi/os_str.rs | 8 ++++---- src/libstd/path.rs | 8 ++++---- src/libstd/sync/mutex.rs | 2 +- src/libstd/sync/rwlock.rs | 2 +- 8 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index 5b1a9399c39bf..93f6a0214d77d 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -1024,7 +1024,7 @@ impl ::fmt::Debug for ManuallyDrop { } } -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl Clone for ManuallyDrop { fn clone(&self) -> Self { ManuallyDrop::new(self.deref().clone()) @@ -1035,14 +1035,14 @@ impl Clone for ManuallyDrop { } } -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl Default for ManuallyDrop { fn default() -> Self { ManuallyDrop::new(Default::default()) } } -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl PartialEq for ManuallyDrop { fn eq(&self, other: &Self) -> bool { self.deref().eq(other) @@ -1053,10 +1053,10 @@ impl PartialEq for ManuallyDrop { } } -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl Eq for ManuallyDrop {} -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl PartialOrd for ManuallyDrop { fn partial_cmp(&self, other: &Self) -> Option<::cmp::Ordering> { self.deref().partial_cmp(other) @@ -1079,14 +1079,14 @@ impl PartialOrd for ManuallyDrop { } } -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl Ord for ManuallyDrop { fn cmp(&self, other: &Self) -> ::cmp::Ordering { self.deref().cmp(other) } } -#[stable(feature = "manually_drop", since = "1.20.0")] +#[stable(feature = "manually_drop_impls", since = "1.22.0")] impl ::hash::Hash for ManuallyDrop { fn hash(&self, state: &mut H) { self.deref().hash(state); diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs index 1ca995cae6d97..765b369e4b25d 100644 --- a/src/libcore/str/mod.rs +++ b/src/libcore/str/mod.rs @@ -1997,7 +1997,9 @@ mod traits { } } - #[stable(feature = "str_checked_slicing", since = "1.20.0")] + #[unstable(feature = "inclusive_range", + reason = "recently added, follows RFC", + issue = "28237")] impl SliceIndex for ops::RangeInclusive { type Output = str; #[inline] @@ -2040,7 +2042,9 @@ mod traits { - #[stable(feature = "str_checked_slicing", since = "1.20.0")] + #[unstable(feature = "inclusive_range", + reason = "recently added, follows RFC", + issue = "28237")] impl SliceIndex for ops::RangeToInclusive { type Output = str; #[inline] diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs index e334d2014af7c..3da9e9c87dde3 100644 --- a/src/libcore/sync/atomic.rs +++ b/src/libcore/sync/atomic.rs @@ -944,6 +944,7 @@ macro_rules! atomic_int { $stable_cxchg:meta, $stable_debug:meta, $stable_access:meta, + $stable_from:meta, $s_int_type:expr, $int_ref:expr, $int_type:ident $atomic_type:ident $atomic_init:ident) => { /// An integer type which can be safely shared between threads. @@ -978,7 +979,7 @@ macro_rules! atomic_int { } } - #[stable(feature = "atomic_from", since = "1.23.0")] + #[$stable_from] impl From<$int_type> for $atomic_type { #[inline] fn from(v: $int_type) -> Self { Self::new(v) } @@ -1375,6 +1376,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "i8", "../../../std/primitive.i8.html", i8 AtomicI8 ATOMIC_I8_INIT } @@ -1384,6 +1386,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "u8", "../../../std/primitive.u8.html", u8 AtomicU8 ATOMIC_U8_INIT } @@ -1393,6 +1396,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "i16", "../../../std/primitive.i16.html", i16 AtomicI16 ATOMIC_I16_INIT } @@ -1402,6 +1406,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "u16", "../../../std/primitive.u16.html", u16 AtomicU16 ATOMIC_U16_INIT } @@ -1411,6 +1416,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "i32", "../../../std/primitive.i32.html", i32 AtomicI32 ATOMIC_I32_INIT } @@ -1420,6 +1426,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "u32", "../../../std/primitive.u32.html", u32 AtomicU32 ATOMIC_U32_INIT } @@ -1429,6 +1436,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "i64", "../../../std/primitive.i64.html", i64 AtomicI64 ATOMIC_I64_INIT } @@ -1438,6 +1446,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "32976"), + unstable(feature = "integer_atomics", issue = "32976"), "u64", "../../../std/primitive.u64.html", u64 AtomicU64 ATOMIC_U64_INIT } @@ -1447,6 +1456,7 @@ atomic_int!{ stable(feature = "extended_compare_and_swap", since = "1.10.0"), stable(feature = "atomic_debug", since = "1.3.0"), stable(feature = "atomic_access", since = "1.15.0"), + stable(feature = "atomic_from", since = "1.23.0"), "isize", "../../../std/primitive.isize.html", isize AtomicIsize ATOMIC_ISIZE_INIT } @@ -1456,6 +1466,7 @@ atomic_int!{ stable(feature = "extended_compare_and_swap", since = "1.10.0"), stable(feature = "atomic_debug", since = "1.3.0"), stable(feature = "atomic_access", since = "1.15.0"), + stable(feature = "atomic_from", since = "1.23.0"), "usize", "../../../std/primitive.usize.html", usize AtomicUsize ATOMIC_USIZE_INIT } diff --git a/src/libstd/ffi/c_str.rs b/src/libstd/ffi/c_str.rs index a2022a2eeb23c..a19fe825f21fa 100644 --- a/src/libstd/ffi/c_str.rs +++ b/src/libstd/ffi/c_str.rs @@ -706,7 +706,7 @@ impl From for Box { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl From for Arc { #[inline] fn from(s: CString) -> Arc { @@ -715,7 +715,7 @@ impl From for Arc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl<'a> From<&'a CStr> for Arc { #[inline] fn from(s: &CStr) -> Arc { @@ -724,7 +724,7 @@ impl<'a> From<&'a CStr> for Arc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl From for Rc { #[inline] fn from(s: CString) -> Rc { @@ -733,7 +733,7 @@ impl From for Rc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl<'a> From<&'a CStr> for Rc { #[inline] fn from(s: &CStr) -> Rc { diff --git a/src/libstd/ffi/os_str.rs b/src/libstd/ffi/os_str.rs index cb902461f39fd..109173d31c501 100644 --- a/src/libstd/ffi/os_str.rs +++ b/src/libstd/ffi/os_str.rs @@ -594,7 +594,7 @@ impl From for Box { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl From for Arc { #[inline] fn from(s: OsString) -> Arc { @@ -603,7 +603,7 @@ impl From for Arc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl<'a> From<&'a OsStr> for Arc { #[inline] fn from(s: &OsStr) -> Arc { @@ -612,7 +612,7 @@ impl<'a> From<&'a OsStr> for Arc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl From for Rc { #[inline] fn from(s: OsString) -> Rc { @@ -621,7 +621,7 @@ impl From for Rc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl<'a> From<&'a OsStr> for Rc { #[inline] fn from(s: &OsStr) -> Rc { diff --git a/src/libstd/path.rs b/src/libstd/path.rs index eb125a4737a1c..bed9efcb8469d 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -1454,7 +1454,7 @@ impl<'a> From for Cow<'a, Path> { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl From for Arc { #[inline] fn from(s: PathBuf) -> Arc { @@ -1463,7 +1463,7 @@ impl From for Arc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl<'a> From<&'a Path> for Arc { #[inline] fn from(s: &Path) -> Arc { @@ -1472,7 +1472,7 @@ impl<'a> From<&'a Path> for Arc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl From for Rc { #[inline] fn from(s: PathBuf) -> Rc { @@ -1481,7 +1481,7 @@ impl From for Rc { } } -#[stable(feature = "shared_from_slice2", since = "1.23.0")] +#[stable(feature = "shared_from_slice2", since = "1.24.0")] impl<'a> From<&'a Path> for Rc { #[inline] fn from(s: &Path) -> Rc { diff --git a/src/libstd/sync/mutex.rs b/src/libstd/sync/mutex.rs index 81f5594bc5231..3b4904c98e871 100644 --- a/src/libstd/sync/mutex.rs +++ b/src/libstd/sync/mutex.rs @@ -382,7 +382,7 @@ unsafe impl<#[may_dangle] T: ?Sized> Drop for Mutex { } } -#[stable(feature = "mutex_from", since = "1.22.0")] +#[stable(feature = "mutex_from", since = "1.24.0")] impl From for Mutex { /// Creates a new mutex in an unlocked state ready for use. /// This is equivalent to [`Mutex::new`]. diff --git a/src/libstd/sync/rwlock.rs b/src/libstd/sync/rwlock.rs index fd6cff6b69c40..0f3f4e50f7e32 100644 --- a/src/libstd/sync/rwlock.rs +++ b/src/libstd/sync/rwlock.rs @@ -457,7 +457,7 @@ impl Default for RwLock { } } -#[stable(feature = "rw_lock_from", since = "1.22.0")] +#[stable(feature = "rw_lock_from", since = "1.24.0")] impl From for RwLock { /// Creates a new instance of an `RwLock` which is unlocked. /// This is equivalent to [`RwLock::new`]. From 838fb4a6a0d11ac2c24189518415d181638af001 Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Wed, 27 Dec 2017 18:38:57 +0100 Subject: [PATCH 02/13] Disable printing of error message on file descriptor 2 on CloudABI. As CloudABI is a capability-based runtime environment, file descriptors are the mechanism that grants rights to a process. These file descriptors may be passed into processes on startup using a utility called cloudabi-run. Unlike the POSIX shell, cloudabi-run does not follow the UNIX model where file descriptors 0, 1 and 2 represent stdin, stdout and stderr. There can be arbitrary many (or few) file descriptors that can be provided. For this reason, CloudABI's C library also doesn't define STD*_FILENO. liblibc should also not declare these. Disable the code in liballoc_system that tries to print error messages over file descriptor 2. For now, let's keep this function quiet. We'll see if we can think of some other way to log this in the future. --- src/liballoc_system/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/liballoc_system/lib.rs b/src/liballoc_system/lib.rs index 27259cc31a5ed..4597175474810 100644 --- a/src/liballoc_system/lib.rs +++ b/src/liballoc_system/lib.rs @@ -213,6 +213,16 @@ mod platform { struct Stderr; impl Write for Stderr { + #[cfg(target_os = "cloudabi")] + fn write_str(&mut self, _: &str) -> fmt::Result { + // CloudABI does not have any reserved file descriptor + // numbers. We should not attempt to write to file + // descriptor #2, as it may be associated with any kind of + // resource. + Ok(()) + } + + #[cfg(not(target_os = "cloudabi"))] fn write_str(&mut self, s: &str) -> fmt::Result { unsafe { libc::write(libc::STDERR_FILENO, From c661e385fd81afef808f414867cc44a6c897195e Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Sun, 31 Dec 2017 13:21:46 +0100 Subject: [PATCH 03/13] Build the right platform module on CloudABI. After #47089 lands, CloudABI will no longer be considered UNIX. We need to pick the right allocator flavour now. --- src/liballoc_system/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/liballoc_system/lib.rs b/src/liballoc_system/lib.rs index 4597175474810..1d5e7b73be557 100644 --- a/src/liballoc_system/lib.rs +++ b/src/liballoc_system/lib.rs @@ -21,7 +21,7 @@ #![feature(core_intrinsics)] #![feature(staged_api)] #![feature(rustc_attrs)] -#![cfg_attr(any(unix, target_os = "redox"), feature(libc))] +#![cfg_attr(any(unix, target_os = "cloudabi", target_os = "redox"), feature(libc))] #![rustc_alloc_kind = "lib"] // The minimum alignment guaranteed by the architecture. This value is used to @@ -116,7 +116,7 @@ unsafe impl Alloc for System { } } -#[cfg(any(unix, target_os = "redox"))] +#[cfg(any(unix, target_os = "cloudabi", target_os = "redox"))] mod platform { extern crate libc; From 4fe167adba47478e1a443c7b82e67e020253eac8 Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Mon, 1 Jan 2018 21:46:22 +0100 Subject: [PATCH 04/13] Use the right TLS model for CloudABI. CloudABI doesn't do dynamic linking. For this reason, there is no need to handle any other TLS model than local-exec. CloudABI's C library doesn't provide a __tls_get_addr() function to do Dynamic TLS. By forcing local-exec to be used here, we ensure that we don't generate function calls to __tls_get_addr(). --- src/librustc_back/target/cloudabi_base.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/librustc_back/target/cloudabi_base.rs b/src/librustc_back/target/cloudabi_base.rs index 3353e7936f0d5..c41c6b233584b 100644 --- a/src/librustc_back/target/cloudabi_base.rs +++ b/src/librustc_back/target/cloudabi_base.rs @@ -27,6 +27,7 @@ pub fn opts() -> TargetOptions { linker_is_gnu: true, pre_link_args: args, position_independent_executables: true, + tls_model: "local-exec".to_string(), relro_level: RelroLevel::Full, exe_allocation_crate: super::maybe_jemalloc(), .. Default::default() From 2b9add2c165c4e397aeb02e1d11c57621ad11dbe Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Tue, 2 Jan 2018 23:37:36 -0800 Subject: [PATCH 05/13] Return None from Span::join if in different files --- src/libproc_macro/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs index 41ccd88b4a887..386c12ba36ddf 100644 --- a/src/libproc_macro/lib.rs +++ b/src/libproc_macro/lib.rs @@ -247,7 +247,7 @@ impl Span { #[unstable(feature = "proc_macro", issue = "38356")] pub fn join(&self, other: Span) -> Option { let self_loc = __internal::lookup_char_pos(self.0.lo()); - let other_loc = __internal::lookup_char_pos(self.0.lo()); + let other_loc = __internal::lookup_char_pos(other.0.lo()); if self_loc.file.name != other_loc.file.name { return None } From 000e907c1fc73ca249252cba3b2c9b1a20de857d Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Tue, 2 Jan 2018 23:29:11 -0800 Subject: [PATCH 06/13] Span::resolved_at and Span::located_at to combine behavior of two spans Proc macro spans serve two mostly unrelated purposes: controlling name resolution and controlling error messages. It can be useful to mix the name resolution behavior of one span with the line/column error message locations of a different span. In particular, consider the case of a trait brought into scope within the def_site of a custom derive. I want to invoke trait methods on the fields of the user's struct. If the field type does not implement the right trait, I want the error message to underline the corresponding struct field. Generating the method call with the def_site span is not ideal -- it compiles and runs but error messages sadly always point to the derive attribute like we saw with Macros 1.1. ``` | 4 | #[derive(HeapSize)] | ^^^^^^^^ ``` Generating the method call with the same span as the struct field's ident or type is not correct -- it shows the right underlines but fails to resolve to the trait in scope at the def_site. ``` | 7 | bad: std::thread::Thread, | ^^^^^^^^^^^^^^^^^^^^^^^^ ``` The correct span for the method call is one that combines the def_site's name resolution with the struct field's line/column. ``` field.span.resolved_at(Span::def_site()) // equivalently Span::def_site().located_at(field.span) ``` Adding both because which one is more natural will depend on context. --- src/libproc_macro/lib.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs index 41ccd88b4a887..f2936f2bca83d 100644 --- a/src/libproc_macro/lib.rs +++ b/src/libproc_macro/lib.rs @@ -254,6 +254,20 @@ impl Span { Some(Span(self.0.to(other.0))) } + /// Creates a new span with the same line/column information as `self` but + /// that resolves symbols as though it were at `other`. + #[unstable(feature = "proc_macro", issue = "38356")] + pub fn resolved_at(&self, other: Span) -> Span { + Span(self.0.with_ctxt(other.0.ctxt())) + } + + /// Creates a new span with the same name resolution behavior as `self` but + /// with the line/column information of `other`. + #[unstable(feature = "proc_macro", issue = "38356")] + pub fn located_at(&self, other: Span) -> Span { + other.resolved_at(*self) + } + diagnostic_method!(error, Level::Error); diagnostic_method!(warning, Level::Warning); diagnostic_method!(note, Level::Note); From 47e18e0db73246cb509d54567a8910954547a1ab Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Wed, 3 Jan 2018 11:58:42 -0500 Subject: [PATCH 07/13] This isn't in Rust 1.23 --- RELEASES.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 8fcd22b0b448f..b54d05ab4ec4c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -49,7 +49,6 @@ Misc ---- - [Releases now ship with the Cargo book documentation.][45692] - [rustdoc now prints rendering warnings on every run.][45324] -- [Release tarballs now come with rustfmt][45903] Compatibility Notes ------------------- @@ -83,7 +82,6 @@ Compatibility Notes [45852]: https://github.com/rust-lang/rust/issues/45852 [45853]: https://github.com/rust-lang/rust/pull/45853 [45887]: https://github.com/rust-lang/rust/pull/45887 -[45903]: https://github.com/rust-lang/rust/pull/45903 [45920]: https://github.com/rust-lang/rust/pull/45920 [cargo/4506]: https://github.com/rust-lang/cargo/pull/4506 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561 From 50989cd98dbef60b0b6f5baa0ce4203ce778adaa Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Wed, 3 Jan 2018 12:05:57 -0500 Subject: [PATCH 08/13] This is an unstable feature --- RELEASES.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index b54d05ab4ec4c..a4e6f22ba3db4 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -38,7 +38,6 @@ Stabilized APIs Cargo ----- -- [Cargo now supports alternative registries][cargo/4506] - [Cargo now supports uninstallation of multiple packages][cargo/4561] eg. `cargo uninstall foo bar` uninstalls `foo` and `bar`. - [Added unit test checking to `cargo check`][cargo/4592] @@ -83,7 +82,6 @@ Compatibility Notes [45853]: https://github.com/rust-lang/rust/pull/45853 [45887]: https://github.com/rust-lang/rust/pull/45887 [45920]: https://github.com/rust-lang/rust/pull/45920 -[cargo/4506]: https://github.com/rust-lang/cargo/pull/4506 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561 [cargo/4592]: https://github.com/rust-lang/cargo/pull/4592 [cargo/4637]: https://github.com/rust-lang/cargo/pull/4637 From 05949b09a87e8753601441484e17aecc8438e3ce Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Wed, 3 Jan 2018 18:32:41 +0100 Subject: [PATCH 09/13] Explain why local-exec is used by CloudABI. --- src/librustc_back/target/cloudabi_base.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/librustc_back/target/cloudabi_base.rs b/src/librustc_back/target/cloudabi_base.rs index c41c6b233584b..4cd52ebb26df5 100644 --- a/src/librustc_back/target/cloudabi_base.rs +++ b/src/librustc_back/target/cloudabi_base.rs @@ -27,6 +27,17 @@ pub fn opts() -> TargetOptions { linker_is_gnu: true, pre_link_args: args, position_independent_executables: true, + // As CloudABI only supports static linkage, there is no need + // for dynamic TLS. The C library therefore does not provide + // __tls_get_addr(), which is normally used to perform dynamic + // TLS lookups by programs that make use of dlopen(). Only the + // "local-exec" and "initial-exec" TLS models can be used. + // + // "local-exec" is more efficient than "initial-exec", as the + // latter has one more level of indirection: it accesses the GOT + // (Global Offset Table) to obtain the effective address of a + // thread-local variable. Using a GOT is useful only when doing + // dynamic linking. tls_model: "local-exec".to_string(), relro_level: RelroLevel::Full, exe_allocation_crate: super::maybe_jemalloc(), From 6076cf6f4e4e60b4fb43c665a56a0508c88fca6f Mon Sep 17 00:00:00 2001 From: Stjepan Glavina Date: Wed, 3 Jan 2018 20:00:11 +0100 Subject: [PATCH 10/13] Remove `T: Ord` bound from `BTreeSet::{is_empty, len}` --- src/liballoc/btree/set.rs | 140 ++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 72 deletions(-) diff --git a/src/liballoc/btree/set.rs b/src/liballoc/btree/set.rs index 580d2dbb623e6..2807bbaca0c89 100644 --- a/src/liballoc/btree/set.rs +++ b/src/liballoc/btree/set.rs @@ -228,43 +228,7 @@ impl BTreeSet { pub fn new() -> BTreeSet { BTreeSet { map: BTreeMap::new() } } -} - -impl BTreeSet { - /// Gets an iterator that visits the values in the `BTreeSet` in ascending order. - /// - /// # Examples - /// - /// ``` - /// use std::collections::BTreeSet; - /// - /// let set: BTreeSet = [1, 2, 3].iter().cloned().collect(); - /// let mut set_iter = set.iter(); - /// assert_eq!(set_iter.next(), Some(&1)); - /// assert_eq!(set_iter.next(), Some(&2)); - /// assert_eq!(set_iter.next(), Some(&3)); - /// assert_eq!(set_iter.next(), None); - /// ``` - /// - /// Values returned by the iterator are returned in ascending order: - /// - /// ``` - /// use std::collections::BTreeSet; - /// - /// let set: BTreeSet = [3, 1, 2].iter().cloned().collect(); - /// let mut set_iter = set.iter(); - /// assert_eq!(set_iter.next(), Some(&1)); - /// assert_eq!(set_iter.next(), Some(&2)); - /// assert_eq!(set_iter.next(), Some(&3)); - /// assert_eq!(set_iter.next(), None); - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - pub fn iter(&self) -> Iter { - Iter { iter: self.map.keys() } - } -} -impl BTreeSet { /// Constructs a double-ended iterator over a sub-range of elements in the set. /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will /// yield elements from min (inclusive) to max (exclusive). @@ -293,9 +257,7 @@ impl BTreeSet { { Range { iter: self.map.range(range) } } -} -impl BTreeSet { /// Visits the values representing the difference, /// i.e. the values that are in `self` but not in `other`, /// in ascending order. @@ -408,40 +370,6 @@ impl BTreeSet { } } - /// Returns the number of elements in the set. - /// - /// # Examples - /// - /// ``` - /// use std::collections::BTreeSet; - /// - /// let mut v = BTreeSet::new(); - /// assert_eq!(v.len(), 0); - /// v.insert(1); - /// assert_eq!(v.len(), 1); - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - pub fn len(&self) -> usize { - self.map.len() - } - - /// Returns `true` if the set contains no elements. - /// - /// # Examples - /// - /// ``` - /// use std::collections::BTreeSet; - /// - /// let mut v = BTreeSet::new(); - /// assert!(v.is_empty()); - /// v.insert(1); - /// assert!(!v.is_empty()); - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - /// Clears the set, removing all values. /// /// # Examples @@ -724,6 +652,74 @@ impl BTreeSet { } } +impl BTreeSet { + /// Gets an iterator that visits the values in the `BTreeSet` in ascending order. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let set: BTreeSet = [1, 2, 3].iter().cloned().collect(); + /// let mut set_iter = set.iter(); + /// assert_eq!(set_iter.next(), Some(&1)); + /// assert_eq!(set_iter.next(), Some(&2)); + /// assert_eq!(set_iter.next(), Some(&3)); + /// assert_eq!(set_iter.next(), None); + /// ``` + /// + /// Values returned by the iterator are returned in ascending order: + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let set: BTreeSet = [3, 1, 2].iter().cloned().collect(); + /// let mut set_iter = set.iter(); + /// assert_eq!(set_iter.next(), Some(&1)); + /// assert_eq!(set_iter.next(), Some(&2)); + /// assert_eq!(set_iter.next(), Some(&3)); + /// assert_eq!(set_iter.next(), None); + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + pub fn iter(&self) -> Iter { + Iter { iter: self.map.keys() } + } + + /// Returns the number of elements in the set. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let mut v = BTreeSet::new(); + /// assert_eq!(v.len(), 0); + /// v.insert(1); + /// assert_eq!(v.len(), 1); + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + pub fn len(&self) -> usize { + self.map.len() + } + + /// Returns `true` if the set contains no elements. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let mut v = BTreeSet::new(); + /// assert!(v.is_empty()); + /// v.insert(1); + /// assert!(!v.is_empty()); + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + pub fn is_empty(&self) -> bool { + self.len() == 0 + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl FromIterator for BTreeSet { fn from_iter>(iter: I) -> BTreeSet { From 922f0618d1b1616f1bb3b8046948b47e4fadf29d Mon Sep 17 00:00:00 2001 From: aheart Date: Thu, 4 Jan 2018 15:55:01 +0200 Subject: [PATCH 11/13] Make examples equivalent The example with the ? operator was missing file.write_all --- src/libcore/macros.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcore/macros.rs b/src/libcore/macros.rs index 948ad104cdf2f..f00128a8147de 100644 --- a/src/libcore/macros.rs +++ b/src/libcore/macros.rs @@ -330,6 +330,7 @@ macro_rules! debug_assert_ne { /// // The prefered method of quick returning Errors /// fn write_to_file_question() -> Result<(), MyError> { /// let mut file = File::create("my_best_friends.txt")?; +/// file.write_all(b"This is a list of my best friends.")?; /// Ok(()) /// } /// From 8fc4a24062a4088b3b5af24d25c12f818b84c841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Damien?= Date: Thu, 4 Jan 2018 22:01:57 +0100 Subject: [PATCH 12/13] Fix an error in std::process documentation --- src/libstd/process.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/process.rs b/src/libstd/process.rs index c3d1e82bc3fe1..33e8a87a0b62c 100644 --- a/src/libstd/process.rs +++ b/src/libstd/process.rs @@ -68,8 +68,8 @@ //! assert_eq!(b"Oh no, a typo!\n", output.stdout.as_slice()); //! ``` //! -//! Note that [`ChildStderr`] and [`ChildStdout`] implement [`Write`] and -//! [`ChildStdin`] implements [`Read`]: +//! Note that [`ChildStderr`] and [`ChildStdout`] implement [`Read`] and +//! [`ChildStdin`] implements [`Write`]: //! //! ```no_run //! use std::process::{Command, Stdio}; From 0e795a210604993e5a30c97e75104c016f107509 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 4 Jan 2018 13:14:15 -0800 Subject: [PATCH 13/13] rustbuild: Don't allow stable bootstrap from dev I forgot to update the bootstrap compiler for the 1.23.0 release so let's make sure it doesn't happen again! --- src/bootstrap/sanity.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/bootstrap/sanity.rs b/src/bootstrap/sanity.rs index bc275b7fc745c..a8b43ad3c3080 100644 --- a/src/bootstrap/sanity.rs +++ b/src/bootstrap/sanity.rs @@ -21,9 +21,10 @@ use std::collections::HashMap; use std::env; use std::ffi::{OsString, OsStr}; -use std::fs; -use std::process::Command; +use std::fs::{self, File}; +use std::io::Read; use std::path::PathBuf; +use std::process::Command; use build_helper::output; @@ -234,4 +235,14 @@ $ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake if let Some(ref s) = build.config.ccache { cmd_finder.must_have(s); } + + if build.config.channel == "stable" { + let mut stage0 = String::new(); + t!(t!(File::open(build.src.join("src/stage0.txt"))) + .read_to_string(&mut stage0)); + if stage0.contains("\ndev:") { + panic!("bootstrapping from a dev compiler in a stable release, but \ + should only be bootstrapping from a released compiler!"); + } + } }