Bump bootstrap compiler

This commit is contained in:
Mark Rousskov
2020-04-22 15:45:35 -04:00
parent 0b958790b3
commit 93eed402ad
31 changed files with 22 additions and 329 deletions

View File

@@ -13,7 +13,7 @@ use build_helper::output;
use crate::Build; use crate::Build;
// The version number // The version number
pub const CFG_RELEASE_NUM: &str = "1.44.0"; pub const CFG_RELEASE_NUM: &str = "1.45.0";
pub struct GitInfo { pub struct GitInfo {
inner: Option<Info>, inner: Option<Info>,

View File

@@ -99,7 +99,7 @@
#![feature(internal_uninit_const)] #![feature(internal_uninit_const)]
#![feature(lang_items)] #![feature(lang_items)]
#![feature(libc)] #![feature(libc)]
#![cfg_attr(not(bootstrap), feature(negative_impls))] #![feature(negative_impls)]
#![feature(new_uninit)] #![feature(new_uninit)]
#![feature(nll)] #![feature(nll)]
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]

View File

@@ -279,7 +279,6 @@ struct RcBox<T: ?Sized> {
/// type `T`. /// type `T`.
/// ///
/// [get_mut]: #method.get_mut /// [get_mut]: #method.get_mut
#[cfg_attr(all(bootstrap, not(test)), lang = "rc")]
#[cfg_attr(not(test), rustc_diagnostic_item = "Rc")] #[cfg_attr(not(test), rustc_diagnostic_item = "Rc")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Rc<T: ?Sized> { pub struct Rc<T: ?Sized> {

View File

@@ -207,7 +207,6 @@ macro_rules! acquire {
/// counting in general. /// counting in general.
/// ///
/// [rc_examples]: ../../std/rc/index.html#examples /// [rc_examples]: ../../std/rc/index.html#examples
#[cfg_attr(all(bootstrap, not(test)), lang = "arc")]
#[cfg_attr(not(test), rustc_diagnostic_item = "Arc")] #[cfg_attr(not(test), rustc_diagnostic_item = "Arc")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Arc<T: ?Sized> { pub struct Arc<T: ?Sized> {

View File

@@ -231,6 +231,5 @@ mod impls {
/// Shared references can be cloned, but mutable references *cannot*! /// Shared references can be cloned, but mutable references *cannot*!
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg(not(bootstrap))]
impl<T: ?Sized> !Clone for &mut T {} impl<T: ?Sized> !Clone for &mut T {}
} }

View File

@@ -28,16 +28,9 @@ macro_rules! impl_float_to_int {
#[doc(hidden)] #[doc(hidden)]
#[inline] #[inline]
unsafe fn to_int_unchecked(self) -> $Int { unsafe fn to_int_unchecked(self) -> $Int {
#[cfg(bootstrap)]
{
crate::intrinsics::float_to_int_approx_unchecked(self)
}
#[cfg(not(bootstrap))]
{
crate::intrinsics::float_to_int_unchecked(self) crate::intrinsics::float_to_int_unchecked(self)
} }
} }
}
)+ )+
} }
} }

View File

@@ -2,7 +2,6 @@
//! Asynchronous values. //! Asynchronous values.
#[cfg(not(bootstrap))]
use crate::{ use crate::{
ops::{Generator, GeneratorState}, ops::{Generator, GeneratorState},
pin::Pin, pin::Pin,
@@ -24,16 +23,13 @@ pub use self::future::Future;
/// It also simplifies the HIR lowering of `.await`. /// It also simplifies the HIR lowering of `.await`.
#[doc(hidden)] #[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")] #[unstable(feature = "gen_future", issue = "50547")]
#[cfg(not(bootstrap))]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct ResumeTy(NonNull<Context<'static>>); pub struct ResumeTy(NonNull<Context<'static>>);
#[unstable(feature = "gen_future", issue = "50547")] #[unstable(feature = "gen_future", issue = "50547")]
#[cfg(not(bootstrap))]
unsafe impl Send for ResumeTy {} unsafe impl Send for ResumeTy {}
#[unstable(feature = "gen_future", issue = "50547")] #[unstable(feature = "gen_future", issue = "50547")]
#[cfg(not(bootstrap))]
unsafe impl Sync for ResumeTy {} unsafe impl Sync for ResumeTy {}
/// Wrap a generator in a future. /// Wrap a generator in a future.
@@ -43,7 +39,6 @@ unsafe impl Sync for ResumeTy {}
// This is `const` to avoid extra errors after we recover from `const async fn` // This is `const` to avoid extra errors after we recover from `const async fn`
#[doc(hidden)] #[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")] #[unstable(feature = "gen_future", issue = "50547")]
#[cfg(not(bootstrap))]
#[inline] #[inline]
pub const fn from_generator<T>(gen: T) -> impl Future<Output = T::Return> pub const fn from_generator<T>(gen: T) -> impl Future<Output = T::Return>
where where
@@ -75,7 +70,6 @@ where
#[doc(hidden)] #[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")] #[unstable(feature = "gen_future", issue = "50547")]
#[cfg(not(bootstrap))]
#[inline] #[inline]
pub unsafe fn get_context<'a, 'b>(cx: ResumeTy) -> &'a mut Context<'b> { pub unsafe fn get_context<'a, 'b>(cx: ResumeTy) -> &'a mut Context<'b> {
&mut *cx.0.as_ptr().cast() &mut *cx.0.as_ptr().cast()

View File

@@ -980,22 +980,7 @@ extern "rust-intrinsic" {
/// ///
/// The stabilized version of this intrinsic is /// The stabilized version of this intrinsic is
/// [`std::mem::size_of_val`](../../std/mem/fn.size_of_val.html). /// [`std::mem::size_of_val`](../../std/mem/fn.size_of_val.html).
#[cfg(bootstrap)]
pub fn size_of_val<T: ?Sized>(_: &T) -> usize;
/// The minimum alignment of the type of the value that `val` points to.
///
/// The stabilized version of this intrinsic is
/// [`std::mem::min_align_of_val`](../../std/mem/fn.min_align_of_val.html).
#[cfg(bootstrap)]
pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
/// The size of the referenced value in bytes.
///
/// The stabilized version of this intrinsic is
/// [`std::mem::size_of_val`](../../std/mem/fn.size_of_val.html).
#[cfg(not(bootstrap))]
pub fn size_of_val<T: ?Sized>(_: *const T) -> usize; pub fn size_of_val<T: ?Sized>(_: *const T) -> usize;
#[cfg(not(bootstrap))]
pub fn min_align_of_val<T: ?Sized>(_: *const T) -> usize; pub fn min_align_of_val<T: ?Sized>(_: *const T) -> usize;
/// Gets a static string slice containing the name of a type. /// Gets a static string slice containing the name of a type.
@@ -1016,22 +1001,14 @@ extern "rust-intrinsic" {
/// A guard for unsafe functions that cannot ever be executed if `T` is uninhabited: /// A guard for unsafe functions that cannot ever be executed if `T` is uninhabited:
/// This will statically either panic, or do nothing. /// This will statically either panic, or do nothing.
#[cfg(bootstrap)]
pub fn panic_if_uninhabited<T>();
/// A guard for unsafe functions that cannot ever be executed if `T` is uninhabited:
/// This will statically either panic, or do nothing.
#[cfg(not(bootstrap))]
pub fn assert_inhabited<T>(); pub fn assert_inhabited<T>();
/// A guard for unsafe functions that cannot ever be executed if `T` does not permit /// A guard for unsafe functions that cannot ever be executed if `T` does not permit
/// zero-initialization: This will statically either panic, or do nothing. /// zero-initialization: This will statically either panic, or do nothing.
#[cfg(not(bootstrap))]
pub fn assert_zero_valid<T>(); pub fn assert_zero_valid<T>();
/// A guard for unsafe functions that cannot ever be executed if `T` has invalid /// A guard for unsafe functions that cannot ever be executed if `T` has invalid
/// bit patterns: This will statically either panic, or do nothing. /// bit patterns: This will statically either panic, or do nothing.
#[cfg(not(bootstrap))]
pub fn assert_uninit_valid<T>(); pub fn assert_uninit_valid<T>();
/// Gets a reference to a static `Location` indicating where it was called. /// Gets a reference to a static `Location` indicating where it was called.
@@ -1597,17 +1574,10 @@ extern "rust-intrinsic" {
/// May assume inputs are finite. /// May assume inputs are finite.
pub fn frem_fast<T: Copy>(a: T, b: T) -> T; pub fn frem_fast<T: Copy>(a: T, b: T) -> T;
/// Convert with LLVMs fptoui/fptosi, which may return undef for values out of range
/// (<https://github.com/rust-lang/rust/issues/10184>)
/// This is under stabilization at <https://github.com/rust-lang/rust/issues/67058>
#[cfg(bootstrap)]
pub fn float_to_int_approx_unchecked<Float: Copy, Int: Copy>(value: Float) -> Int;
/// Convert with LLVMs fptoui/fptosi, which may return undef for values out of range /// Convert with LLVMs fptoui/fptosi, which may return undef for values out of range
/// (<https://github.com/rust-lang/rust/issues/10184>) /// (<https://github.com/rust-lang/rust/issues/10184>)
/// ///
/// Stabilized as `f32::to_int_unchecked` and `f64::to_int_unchecked`. /// Stabilized as `f32::to_int_unchecked` and `f64::to_int_unchecked`.
#[cfg(not(bootstrap))]
pub fn float_to_int_unchecked<Float: Copy, Int: Copy>(value: Float) -> Int; pub fn float_to_int_unchecked<Float: Copy, Int: Copy>(value: Float) -> Int;
/// Returns the number of bits set in an integer type `T` /// Returns the number of bits set in an integer type `T`
@@ -1877,10 +1847,7 @@ extern "rust-intrinsic" {
/// takes the data pointer and a pointer to the target-specific exception /// takes the data pointer and a pointer to the target-specific exception
/// object that was caught. For more information see the compiler's /// object that was caught. For more information see the compiler's
/// source as well as std's catch implementation. /// source as well as std's catch implementation.
#[cfg(not(bootstrap))]
pub fn r#try(try_fn: fn(*mut u8), data: *mut u8, catch_fn: fn(*mut u8, *mut u8)) -> i32; pub fn r#try(try_fn: fn(*mut u8), data: *mut u8, catch_fn: fn(*mut u8, *mut u8)) -> i32;
#[cfg(bootstrap)]
pub fn r#try(f: fn(*mut u8), data: *mut u8, local_ptr: *mut u8) -> i32;
/// Emits a `!nontemporal` store according to LLVM (see their docs). /// Emits a `!nontemporal` store according to LLVM (see their docs).
/// Probably will never become stable. /// Probably will never become stable.

View File

@@ -99,7 +99,7 @@
#![feature(lang_items)] #![feature(lang_items)]
#![feature(link_llvm_intrinsics)] #![feature(link_llvm_intrinsics)]
#![feature(llvm_asm)] #![feature(llvm_asm)]
#![cfg_attr(not(bootstrap), feature(negative_impls))] #![feature(negative_impls)]
#![feature(never_type)] #![feature(never_type)]
#![feature(nll)] #![feature(nll)]
#![feature(exhaustive_patterns)] #![feature(exhaustive_patterns)]

View File

@@ -1,27 +1,3 @@
#[cfg(bootstrap)]
#[doc(include = "panic.md")]
#[macro_export]
#[allow_internal_unstable(core_panic, track_caller)]
#[stable(feature = "core", since = "1.6.0")]
macro_rules! panic {
() => (
$crate::panic!("explicit panic")
);
($msg:expr) => (
$crate::panicking::panic($msg)
);
($msg:expr,) => (
$crate::panic!($msg)
);
($fmt:expr, $($arg:tt)+) => (
$crate::panicking::panic_fmt(
$crate::format_args!($fmt, $($arg)+),
$crate::panic::Location::caller(),
)
);
}
#[cfg(not(bootstrap))]
#[doc(include = "panic.md")] #[doc(include = "panic.md")]
#[macro_export] #[macro_export]
#[allow_internal_unstable(core_panic, track_caller)] #[allow_internal_unstable(core_panic, track_caller)]
@@ -360,7 +336,7 @@ macro_rules! r#try {
} }
}; };
($expr:expr,) => { ($expr:expr,) => {
$crate::r#try!($expr) $crate::try!($expr)
}; };
} }
@@ -1341,25 +1317,6 @@ pub(crate) mod builtin {
/// Read the [unstable book] for the usage. /// Read the [unstable book] for the usage.
/// ///
/// [unstable book]: ../unstable-book/library-features/asm.html /// [unstable book]: ../unstable-book/library-features/asm.html
#[cfg(bootstrap)]
#[unstable(
feature = "llvm_asm",
issue = "70173",
reason = "inline assembly is not stable enough for use and is subject to change"
)]
#[macro_export]
#[allow_internal_unstable(asm)]
macro_rules! llvm_asm {
// Redirect to asm! for stage0
($($arg:tt)*) => { $crate::asm!($($arg)*) }
}
/// Inline assembly.
///
/// Read the [unstable book] for the usage.
///
/// [unstable book]: ../unstable-book/library-features/asm.html
#[cfg(not(bootstrap))]
#[unstable( #[unstable(
feature = "llvm_asm", feature = "llvm_asm",
issue = "70173", issue = "70173",
@@ -1460,7 +1417,6 @@ pub(crate) mod builtin {
} }
/// Keeps the item it's applied to if the passed path is accessible, and removes it otherwise. /// Keeps the item it's applied to if the passed path is accessible, and removes it otherwise.
#[cfg(not(bootstrap))]
#[unstable( #[unstable(
feature = "cfg_accessible", feature = "cfg_accessible",
issue = "64797", issue = "64797",

View File

@@ -90,7 +90,7 @@ impl<T: ?Sized> !Send for *mut T {}
ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>" ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>"
)] )]
#[fundamental] // for Default, for example, which requires that `[T]: !Default` be evaluatable #[fundamental] // for Default, for example, which requires that `[T]: !Default` be evaluatable
#[cfg_attr(not(bootstrap), rustc_specialization_trait)] #[rustc_specialization_trait]
pub trait Sized { pub trait Sized {
// Empty. // Empty.
} }

View File

@@ -495,9 +495,6 @@ impl<T> MaybeUninit<T> {
#[inline(always)] #[inline(always)]
#[rustc_diagnostic_item = "assume_init"] #[rustc_diagnostic_item = "assume_init"]
pub unsafe fn assume_init(self) -> T { pub unsafe fn assume_init(self) -> T {
#[cfg(bootstrap)]
intrinsics::panic_if_uninhabited::<T>();
#[cfg(not(bootstrap))]
intrinsics::assert_inhabited::<T>(); intrinsics::assert_inhabited::<T>();
ManuallyDrop::into_inner(self.value) ManuallyDrop::into_inner(self.value)
} }
@@ -562,9 +559,6 @@ impl<T> MaybeUninit<T> {
#[unstable(feature = "maybe_uninit_extra", issue = "63567")] #[unstable(feature = "maybe_uninit_extra", issue = "63567")]
#[inline(always)] #[inline(always)]
pub unsafe fn read(&self) -> T { pub unsafe fn read(&self) -> T {
#[cfg(bootstrap)]
intrinsics::panic_if_uninhabited::<T>();
#[cfg(not(bootstrap))]
intrinsics::assert_inhabited::<T>(); intrinsics::assert_inhabited::<T>();
self.as_ptr().read() self.as_ptr().read()
} }
@@ -627,9 +621,6 @@ impl<T> MaybeUninit<T> {
#[unstable(feature = "maybe_uninit_ref", issue = "63568")] #[unstable(feature = "maybe_uninit_ref", issue = "63568")]
#[inline(always)] #[inline(always)]
pub unsafe fn get_ref(&self) -> &T { pub unsafe fn get_ref(&self) -> &T {
#[cfg(bootstrap)]
intrinsics::panic_if_uninhabited::<T>();
#[cfg(not(bootstrap))]
intrinsics::assert_inhabited::<T>(); intrinsics::assert_inhabited::<T>();
&*self.value &*self.value
} }
@@ -748,9 +739,6 @@ impl<T> MaybeUninit<T> {
#[unstable(feature = "maybe_uninit_ref", issue = "63568")] #[unstable(feature = "maybe_uninit_ref", issue = "63568")]
#[inline(always)] #[inline(always)]
pub unsafe fn get_mut(&mut self) -> &mut T { pub unsafe fn get_mut(&mut self) -> &mut T {
#[cfg(bootstrap)]
intrinsics::panic_if_uninhabited::<T>();
#[cfg(not(bootstrap))]
intrinsics::assert_inhabited::<T>(); intrinsics::assert_inhabited::<T>();
&mut *self.value &mut *self.value
} }

View File

@@ -378,7 +378,6 @@ pub fn size_of_val<T: ?Sized>(val: &T) -> usize {
/// assert_eq!(13, unsafe { mem::size_of_val_raw(y) }); /// assert_eq!(13, unsafe { mem::size_of_val_raw(y) });
/// ``` /// ```
#[inline] #[inline]
#[cfg(not(bootstrap))]
#[unstable(feature = "layout_for_ptr", issue = "69835")] #[unstable(feature = "layout_for_ptr", issue = "69835")]
pub unsafe fn size_of_val_raw<T: ?Sized>(val: *const T) -> usize { pub unsafe fn size_of_val_raw<T: ?Sized>(val: *const T) -> usize {
intrinsics::size_of_val(val) intrinsics::size_of_val(val)
@@ -509,7 +508,6 @@ pub fn align_of_val<T: ?Sized>(val: &T) -> usize {
/// assert_eq!(4, unsafe { mem::align_of_val_raw(&5i32) }); /// assert_eq!(4, unsafe { mem::align_of_val_raw(&5i32) });
/// ``` /// ```
#[inline] #[inline]
#[cfg(not(bootstrap))]
#[unstable(feature = "layout_for_ptr", issue = "69835")] #[unstable(feature = "layout_for_ptr", issue = "69835")]
pub unsafe fn align_of_val_raw<T: ?Sized>(val: *const T) -> usize { pub unsafe fn align_of_val_raw<T: ?Sized>(val: *const T) -> usize {
intrinsics::min_align_of_val(val) intrinsics::min_align_of_val(val)
@@ -621,10 +619,7 @@ pub const fn needs_drop<T>() -> bool {
#[allow(deprecated)] #[allow(deprecated)]
#[rustc_diagnostic_item = "mem_zeroed"] #[rustc_diagnostic_item = "mem_zeroed"]
pub unsafe fn zeroed<T>() -> T { pub unsafe fn zeroed<T>() -> T {
#[cfg(not(bootstrap))]
intrinsics::assert_zero_valid::<T>(); intrinsics::assert_zero_valid::<T>();
#[cfg(bootstrap)]
intrinsics::panic_if_uninhabited::<T>();
MaybeUninit::zeroed().assume_init() MaybeUninit::zeroed().assume_init()
} }
@@ -657,10 +652,7 @@ pub unsafe fn zeroed<T>() -> T {
#[allow(deprecated)] #[allow(deprecated)]
#[rustc_diagnostic_item = "mem_uninitialized"] #[rustc_diagnostic_item = "mem_uninitialized"]
pub unsafe fn uninitialized<T>() -> T { pub unsafe fn uninitialized<T>() -> T {
#[cfg(not(bootstrap))]
intrinsics::assert_uninit_valid::<T>(); intrinsics::assert_uninit_valid::<T>();
#[cfg(bootstrap)]
intrinsics::panic_if_uninhabited::<T>();
MaybeUninit::uninit().assume_init() MaybeUninit::uninit().assume_init()
} }

View File

@@ -81,7 +81,6 @@ impl<T: ?Sized> Deref for &T {
} }
} }
#[cfg(not(bootstrap))]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !DerefMut for &T {} impl<T: ?Sized> !DerefMut for &T {}

View File

@@ -65,7 +65,7 @@ pub trait Index<Idx: ?Sized> {
/// Performs the indexing (`container[index]`) operation. /// Performs the indexing (`container[index]`) operation.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(bootstrap), track_caller)] #[track_caller]
fn index(&self, index: Idx) -> &Self::Output; fn index(&self, index: Idx) -> &Self::Output;
} }
@@ -167,6 +167,6 @@ see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#ind
pub trait IndexMut<Idx: ?Sized>: Index<Idx> { pub trait IndexMut<Idx: ?Sized>: Index<Idx> {
/// Performs the mutable indexing (`container[index]`) operation. /// Performs the mutable indexing (`container[index]`) operation.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(bootstrap), track_caller)] #[track_caller]
fn index_mut(&mut self, index: Idx) -> &mut Self::Output; fn index_mut(&mut self, index: Idx) -> &mut Self::Output;
} }

View File

@@ -49,13 +49,9 @@ pub fn panic(expr: &str) -> ! {
// truncation and padding (even though none is used here). Using // truncation and padding (even though none is used here). Using
// Arguments::new_v1 may allow the compiler to omit Formatter::pad from the // Arguments::new_v1 may allow the compiler to omit Formatter::pad from the
// output binary, saving up to a few kilobytes. // output binary, saving up to a few kilobytes.
#[cfg(not(bootstrap))]
panic_fmt(fmt::Arguments::new_v1(&[expr], &[])); panic_fmt(fmt::Arguments::new_v1(&[expr], &[]));
#[cfg(bootstrap)]
panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), Location::caller());
} }
#[cfg(not(bootstrap))]
#[cold] #[cold]
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))]
#[track_caller] #[track_caller]
@@ -69,30 +65,12 @@ fn panic_bounds_check(index: usize, len: usize) -> ! {
panic!("index out of bounds: the len is {} but the index is {}", len, index) panic!("index out of bounds: the len is {} but the index is {}", len, index)
} }
// For bootstrap, we need a variant with the old argument order, and a corresponding
// `panic_fmt`.
#[cfg(bootstrap)]
#[cold]
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))]
#[lang = "panic_bounds_check"] // needed by codegen for panic on OOB array/slice access
fn panic_bounds_check(location: &Location<'_>, index: usize, len: usize) -> ! {
if cfg!(feature = "panic_immediate_abort") {
// SAFETY: the `abort` intrinsic has no requirements to be called.
unsafe { super::intrinsics::abort() }
}
panic_fmt(
format_args!("index out of bounds: the len is {} but the index is {}", len, index),
location,
)
}
/// The underlying implementation of libcore's `panic!` macro when formatting is used. /// The underlying implementation of libcore's `panic!` macro when formatting is used.
#[cold] #[cold]
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))]
#[cfg_attr(feature = "panic_immediate_abort", inline)] #[cfg_attr(feature = "panic_immediate_abort", inline)]
#[cfg_attr(not(bootstrap), track_caller)] #[track_caller]
pub fn panic_fmt(fmt: fmt::Arguments<'_>, #[cfg(bootstrap)] location: &Location<'_>) -> ! { pub fn panic_fmt(fmt: fmt::Arguments<'_>) -> ! {
if cfg!(feature = "panic_immediate_abort") { if cfg!(feature = "panic_immediate_abort") {
// SAFETY: the `abort` intrinsic has no requirements to be called. // SAFETY: the `abort` intrinsic has no requirements to be called.
unsafe { super::intrinsics::abort() } unsafe { super::intrinsics::abort() }
@@ -105,9 +83,6 @@ pub fn panic_fmt(fmt: fmt::Arguments<'_>, #[cfg(bootstrap)] location: &Location<
fn panic_impl(pi: &PanicInfo<'_>) -> !; fn panic_impl(pi: &PanicInfo<'_>) -> !;
} }
#[cfg(bootstrap)]
let pi = PanicInfo::internal_constructor(Some(&fmt), location);
#[cfg(not(bootstrap))]
let pi = PanicInfo::internal_constructor(Some(&fmt), Location::caller()); let pi = PanicInfo::internal_constructor(Some(&fmt), Location::caller());
// SAFETY: `panic_impl` is defined in safe Rust code and thus is safe to call. // SAFETY: `panic_impl` is defined in safe Rust code and thus is safe to call.

View File

@@ -69,7 +69,6 @@ pub use crate::macros::builtin::{
bench, global_allocator, test, test_case, RustcDecodable, RustcEncodable, bench, global_allocator, test, test_case, RustcDecodable, RustcEncodable,
}; };
#[cfg(not(bootstrap))]
#[unstable( #[unstable(
feature = "cfg_accessible", feature = "cfg_accessible",
issue = "64797", issue = "64797",

View File

@@ -706,7 +706,6 @@ impl<T: ?Sized> *const T {
} }
} }
#[cfg(not(bootstrap))]
#[lang = "const_slice_ptr"] #[lang = "const_slice_ptr"]
impl<T> *const [T] { impl<T> *const [T] {
/// Returns the length of a raw slice. /// Returns the length of a raw slice.

View File

@@ -894,7 +894,6 @@ impl<T: ?Sized> *mut T {
} }
} }
#[cfg(not(bootstrap))]
#[lang = "mut_slice_ptr"] #[lang = "mut_slice_ptr"]
impl<T> *mut [T] { impl<T> *mut [T] {
/// Returns the length of a raw slice. /// Returns the length of a raw slice.

View File

@@ -2831,13 +2831,13 @@ pub trait SliceIndex<T: ?Sized>: private_slice_index::Sealed {
/// Returns a shared reference to the output at this location, panicking /// Returns a shared reference to the output at this location, panicking
/// if out of bounds. /// if out of bounds.
#[unstable(feature = "slice_index_methods", issue = "none")] #[unstable(feature = "slice_index_methods", issue = "none")]
#[cfg_attr(not(bootstrap), track_caller)] #[track_caller]
fn index(self, slice: &T) -> &Self::Output; fn index(self, slice: &T) -> &Self::Output;
/// Returns a mutable reference to the output at this location, panicking /// Returns a mutable reference to the output at this location, panicking
/// if out of bounds. /// if out of bounds.
#[unstable(feature = "slice_index_methods", issue = "none")] #[unstable(feature = "slice_index_methods", issue = "none")]
#[cfg_attr(not(bootstrap), track_caller)] #[track_caller]
fn index_mut(self, slice: &mut T) -> &mut Self::Output; fn index_mut(self, slice: &mut T) -> &mut Self::Output;
} }

View File

@@ -106,15 +106,6 @@ pub mod personalities {
1 // `ExceptionContinueSearch` 1 // `ExceptionContinueSearch`
} }
// Similar to above, this corresponds to the `eh_unwind_resume` lang item
// that's only used on Windows currently.
//
// Note that we don't execute landing pads, so this is never called, so it's
// body is empty.
#[rustc_std_internal_symbol]
#[cfg(all(bootstrap, target_os = "windows", target_env = "gnu"))]
pub extern "C" fn rust_eh_unwind_resume() {}
// These two are called by our startup objects on i686-pc-windows-gnu, but // These two are called by our startup objects on i686-pc-windows-gnu, but
// they don't need to do anything so the bodies are nops. // they don't need to do anything so the bodies are nops.
#[rustc_std_internal_symbol] #[rustc_std_internal_symbol]

View File

@@ -311,18 +311,6 @@ unsafe fn find_eh_action(
eh::find_eh_action(lsda, &eh_context, foreign_exception) eh::find_eh_action(lsda, &eh_context, foreign_exception)
} }
#[cfg(all(
bootstrap,
target_os = "windows",
any(target_arch = "x86", target_arch = "x86_64"),
target_env = "gnu"
))]
#[lang = "eh_unwind_resume"]
#[unwind(allowed)]
unsafe extern "C" fn rust_eh_unwind_resume(panic_ctx: *mut u8) -> ! {
uw::_Unwind_Resume(panic_ctx as *mut uw::_Unwind_Exception);
}
// Frame unwind info registration // Frame unwind info registration
// //
// Each module's image contains a frame unwind info section (usually // Each module's image contains a frame unwind info section (usually

View File

@@ -213,7 +213,6 @@ extern "C" {
// //
// This is fine since the MSVC runtime uses string comparison on the type name // This is fine since the MSVC runtime uses string comparison on the type name
// to match TypeDescriptors rather than pointer equality. // to match TypeDescriptors rather than pointer equality.
#[cfg_attr(bootstrap, lang = "eh_catch_typeinfo")]
static mut TYPE_DESCRIPTOR: _TypeDescriptor = _TypeDescriptor { static mut TYPE_DESCRIPTOR: _TypeDescriptor = _TypeDescriptor {
pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _, pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
spare: core::ptr::null_mut(), spare: core::ptr::null_mut(),

View File

@@ -24,11 +24,10 @@
#![feature(decl_macro)] #![feature(decl_macro)]
#![feature(extern_types)] #![feature(extern_types)]
#![feature(in_band_lifetimes)] #![feature(in_band_lifetimes)]
#![cfg_attr(not(bootstrap), feature(negative_impls))] #![feature(negative_impls)]
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![cfg_attr(bootstrap, feature(specialization))] #![feature(min_specialization)]
#![cfg_attr(not(bootstrap), feature(min_specialization))]
#![recursion_limit = "256"] #![recursion_limit = "256"]
#[unstable(feature = "proc_macro_internals", issue = "27812")] #[unstable(feature = "proc_macro_internals", issue = "27812")]

View File

@@ -9,7 +9,7 @@
#![feature(const_if_match)] #![feature(const_if_match)]
#![feature(const_fn)] #![feature(const_fn)]
#![feature(const_panic)] #![feature(const_panic)]
#![cfg_attr(not(bootstrap), feature(negative_impls))] #![feature(negative_impls)]
#![feature(nll)] #![feature(nll)]
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]
#![feature(specialization)] #![feature(specialization)]

View File

@@ -1,111 +1,5 @@
//! Asynchronous values. //! Asynchronous values.
#[cfg(bootstrap)]
use core::{
cell::Cell,
marker::Unpin,
ops::{Drop, Generator, GeneratorState},
pin::Pin,
ptr::NonNull,
task::{Context, Poll},
};
#[doc(inline)] #[doc(inline)]
#[stable(feature = "futures_api", since = "1.36.0")] #[stable(feature = "futures_api", since = "1.36.0")]
pub use core::future::*; pub use core::future::*;
/// Wrap a generator in a future.
///
/// This function returns a `GenFuture` underneath, but hides it in `impl Trait` to give
/// better error messages (`impl Future` rather than `GenFuture<[closure.....]>`).
// This is `const` to avoid extra errors after we recover from `const async fn`
#[cfg(bootstrap)]
#[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")]
pub const fn from_generator<T: Generator<Yield = ()>>(x: T) -> impl Future<Output = T::Return> {
GenFuture(x)
}
/// A wrapper around generators used to implement `Future` for `async`/`await` code.
#[cfg(bootstrap)]
#[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
struct GenFuture<T: Generator<Yield = ()>>(T);
// We rely on the fact that async/await futures are immovable in order to create
// self-referential borrows in the underlying generator.
#[cfg(bootstrap)]
impl<T: Generator<Yield = ()>> !Unpin for GenFuture<T> {}
#[cfg(bootstrap)]
#[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")]
impl<T: Generator<Yield = ()>> Future for GenFuture<T> {
type Output = T::Return;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
// Safe because we're !Unpin + !Drop mapping to a ?Unpin value
let gen = unsafe { Pin::map_unchecked_mut(self, |s| &mut s.0) };
let _guard = unsafe { set_task_context(cx) };
match gen.resume(()) {
GeneratorState::Yielded(()) => Poll::Pending,
GeneratorState::Complete(x) => Poll::Ready(x),
}
}
}
#[cfg(bootstrap)]
thread_local! {
static TLS_CX: Cell<Option<NonNull<Context<'static>>>> = Cell::new(None);
}
#[cfg(bootstrap)]
struct SetOnDrop(Option<NonNull<Context<'static>>>);
#[cfg(bootstrap)]
impl Drop for SetOnDrop {
fn drop(&mut self) {
TLS_CX.with(|tls_cx| {
tls_cx.set(self.0.take());
});
}
}
// Safety: the returned guard must drop before `cx` is dropped and before
// any previous guard is dropped.
#[cfg(bootstrap)]
unsafe fn set_task_context(cx: &mut Context<'_>) -> SetOnDrop {
// transmute the context's lifetime to 'static so we can store it.
let cx = core::mem::transmute::<&mut Context<'_>, &mut Context<'static>>(cx);
let old_cx = TLS_CX.with(|tls_cx| tls_cx.replace(Some(NonNull::from(cx))));
SetOnDrop(old_cx)
}
#[cfg(bootstrap)]
#[doc(hidden)]
#[unstable(feature = "gen_future", issue = "50547")]
/// Polls a future in the current thread-local task waker.
pub fn poll_with_tls_context<F>(f: Pin<&mut F>) -> Poll<F::Output>
where
F: Future,
{
let cx_ptr = TLS_CX.with(|tls_cx| {
// Clear the entry so that nested `get_task_waker` calls
// will fail or set their own value.
tls_cx.replace(None)
});
let _reset = SetOnDrop(cx_ptr);
let mut cx_ptr = cx_ptr.expect(
"TLS Context not set. This is a rustc bug. \
Please file an issue on https://github.com/rust-lang/rust.",
);
// Safety: we've ensured exclusive access to the context by
// removing the pointer from TLS, only to be replaced once
// we're done with it.
//
// The pointer that was inserted came from an `&mut Context<'_>`,
// so it is safe to treat as mutable.
unsafe { F::poll(f, cx_ptr.as_mut()) }
}

View File

@@ -242,7 +242,7 @@
#![feature(atomic_mut_ptr)] #![feature(atomic_mut_ptr)]
#![feature(box_syntax)] #![feature(box_syntax)]
#![feature(c_variadic)] #![feature(c_variadic)]
#![cfg_attr(not(bootstrap), feature(cfg_accessible))] #![feature(cfg_accessible)]
#![feature(cfg_target_has_atomic)] #![feature(cfg_target_has_atomic)]
#![feature(cfg_target_thread_local)] #![feature(cfg_target_thread_local)]
#![feature(char_error_internals)] #![feature(char_error_internals)]
@@ -281,7 +281,7 @@
#![feature(maybe_uninit_ref)] #![feature(maybe_uninit_ref)]
#![feature(maybe_uninit_slice)] #![feature(maybe_uninit_slice)]
#![feature(needs_panic_runtime)] #![feature(needs_panic_runtime)]
#![cfg_attr(not(bootstrap), feature(negative_impls))] #![feature(negative_impls)]
#![feature(never_type)] #![feature(never_type)]
#![feature(nll)] #![feature(nll)]
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]
@@ -298,8 +298,7 @@
#![feature(shrink_to)] #![feature(shrink_to)]
#![feature(slice_concat_ext)] #![feature(slice_concat_ext)]
#![feature(slice_internals)] #![feature(slice_internals)]
#![cfg_attr(bootstrap, feature(specialization))] #![feature(min_specialization)]
#![cfg_attr(not(bootstrap), feature(min_specialization))]
#![feature(staged_api)] #![feature(staged_api)]
#![feature(std_internals)] #![feature(std_internals)]
#![feature(stdsimd)] #![feature(stdsimd)]

View File

@@ -271,44 +271,12 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
let mut data = Data { f: ManuallyDrop::new(f) }; let mut data = Data { f: ManuallyDrop::new(f) };
let data_ptr = &mut data as *mut _ as *mut u8; let data_ptr = &mut data as *mut _ as *mut u8;
return if do_try(do_call::<F, R>, data_ptr, do_catch::<F, R>) == 0 { return if intrinsics::r#try(do_call::<F, R>, data_ptr, do_catch::<F, R>) == 0 {
Ok(ManuallyDrop::into_inner(data.r)) Ok(ManuallyDrop::into_inner(data.r))
} else { } else {
Err(ManuallyDrop::into_inner(data.p)) Err(ManuallyDrop::into_inner(data.p))
}; };
// Compatibility wrapper around the try intrinsic for bootstrap.
//
// We also need to mark it #[inline(never)] to work around a bug on MinGW
// targets: the unwinding implementation was relying on UB, but this only
// becomes a problem in practice if inlining is involved.
#[cfg(not(bootstrap))]
use intrinsics::r#try as do_try;
#[cfg(bootstrap)]
#[inline(never)]
unsafe fn do_try(try_fn: fn(*mut u8), data: *mut u8, catch_fn: fn(*mut u8, *mut u8)) -> i32 {
use crate::mem::MaybeUninit;
#[cfg(target_env = "msvc")]
type TryPayload = [u64; 2];
#[cfg(not(target_env = "msvc"))]
type TryPayload = *mut u8;
let mut payload: MaybeUninit<TryPayload> = MaybeUninit::uninit();
let payload_ptr = payload.as_mut_ptr() as *mut u8;
let r = intrinsics::r#try(try_fn, data, payload_ptr);
if r != 0 {
#[cfg(target_env = "msvc")]
{
catch_fn(data, payload_ptr)
}
#[cfg(not(target_env = "msvc"))]
{
catch_fn(data, payload.assume_init())
}
}
r
}
// We consider unwinding to be rare, so mark this function as cold. However, // We consider unwinding to be rare, so mark this function as cold. However,
// do not mark it no-inline -- that decision is best to leave to the // do not mark it no-inline -- that decision is best to leave to the
// optimizer (in most cases this function is not inlined even as a normal, // optimizer (in most cases this function is not inlined even as a normal,
@@ -320,9 +288,7 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
obj obj
} }
// See comment on do_try above for why #[inline(never)] is needed on bootstrap. #[inline]
#[cfg_attr(bootstrap, inline(never))]
#[cfg_attr(not(bootstrap), inline)]
fn do_call<F: FnOnce() -> R, R>(data: *mut u8) { fn do_call<F: FnOnce() -> R, R>(data: *mut u8) {
unsafe { unsafe {
let data = data as *mut Data<F, R>; let data = data as *mut Data<F, R>;

View File

@@ -54,7 +54,6 @@ pub use core::prelude::v1::{
PartialEq, PartialOrd, RustcDecodable, RustcEncodable, PartialEq, PartialOrd, RustcDecodable, RustcEncodable,
}; };
#[cfg(not(bootstrap))]
#[unstable( #[unstable(
feature = "cfg_accessible", feature = "cfg_accessible",
issue = "64797", issue = "64797",

View File

@@ -12,7 +12,7 @@
# source tarball for a stable release you'll likely see `1.x.0` for rustc and # source tarball for a stable release you'll likely see `1.x.0` for rustc and
# `0.(x+1).0` for Cargo where they were released on `date`. # `0.(x+1).0` for Cargo where they were released on `date`.
date: 2020-03-12 date: 2020-04-22
rustc: beta rustc: beta
cargo: beta cargo: beta

View File

@@ -45,7 +45,7 @@ fn disable_error_reporting<F: FnOnce() -> R, R>(f: F) -> R {
use winapi::um::winbase::SEM_NOGPFAULTERRORBOX; use winapi::um::winbase::SEM_NOGPFAULTERRORBOX;
lazy_static! { lazy_static! {
static ref LOCK: Mutex<()> = { Mutex::new(()) }; static ref LOCK: Mutex<()> = Mutex::new(());
} }
// Error mode is a global variable, so lock it so only one thread will change it // Error mode is a global variable, so lock it so only one thread will change it
let _lock = LOCK.lock().unwrap(); let _lock = LOCK.lock().unwrap();