diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index baf9aabed00af..831053bc0f7e2 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -563,7 +563,7 @@ pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: Interne // not for MSVC or macOS if builder.config.llvm_static_stdcpp && !target.contains("freebsd") && - !target.contains("windows") && + !target.contains("msvc") && !target.contains("apple") { let file = compiler_file(builder, builder.cxx(target).unwrap(), diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs index 1c39a3721f465..3e4005acaf35c 100644 --- a/src/liballoc/boxed.rs +++ b/src/liballoc/boxed.rs @@ -476,7 +476,7 @@ impl Box { Box::into_unique(b).into() } - #[unstable(feature = "ptr_internals", issue = "0", reason = "use into_raw_non_null instead")] + #[unstable(feature = "ptr_internals", issue = "none", reason = "use into_raw_non_null instead")] #[inline] #[doc(hidden)] pub fn into_unique(b: Box) -> Unique { @@ -830,7 +830,7 @@ impl From> for Box<[u8]> { } } -#[unstable(feature = "boxed_slice_try_from", issue = "0")] +#[unstable(feature = "boxed_slice_try_from", issue = "none")] impl TryFrom> for Box<[T; N]> where [T; N]: LengthAtMost32, @@ -946,7 +946,7 @@ impl DerefMut for Box { } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Box {} #[stable(feature = "rust1", since = "1.0.0")] @@ -1040,7 +1040,7 @@ impl + ?Sized> Fn for Box { #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Box {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Box {} #[stable(feature = "boxed_slice_from_iter", since = "1.32.0")] diff --git a/src/liballoc/collections/mod.rs b/src/liballoc/collections/mod.rs index f1f22fe48c58a..390a48180c0a6 100644 --- a/src/liballoc/collections/mod.rs +++ b/src/liballoc/collections/mod.rs @@ -57,7 +57,7 @@ pub enum TryReserveError { layout: Layout, #[doc(hidden)] - #[unstable(feature = "container_error_extra", issue = "0", reason = "\ + #[unstable(feature = "container_error_extra", issue = "none", reason = "\ Enable exposing the allocator’s custom error value \ if an associated type is added in the future: \ https://github.com/rust-lang/wg-allocators/issues/23")] diff --git a/src/liballoc/fmt.rs b/src/liballoc/fmt.rs index 18ebae333098f..01d4913665c07 100644 --- a/src/liballoc/fmt.rs +++ b/src/liballoc/fmt.rs @@ -514,7 +514,7 @@ #![stable(feature = "rust1", since = "1.0.0")] -#[unstable(feature = "fmt_internals", issue = "0")] +#[unstable(feature = "fmt_internals", issue = "none")] pub use core::fmt::rt; #[stable(feature = "fmt_flags_align", since = "1.28.0")] pub use core::fmt::Alignment; diff --git a/src/liballoc/lib.rs b/src/liballoc/lib.rs index be46e632be45f..b549fa1ef4fc9 100644 --- a/src/liballoc/lib.rs +++ b/src/liballoc/lib.rs @@ -171,7 +171,7 @@ mod std { } #[doc(hidden)] -#[unstable(feature = "liballoc_internals", issue = "0", reason = "implementation detail")] +#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")] pub mod __export { pub use core::format_args; } diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs index 3201c702abb29..444450f6628ef 100644 --- a/src/liballoc/raw_vec.rs +++ b/src/liballoc/raw_vec.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "raw_vec_internals", reason = "implementation detail", issue = "0")] +#![unstable(feature = "raw_vec_internals", reason = "implementation detail", issue = "none")] #![doc(hidden)] use core::cmp; diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index 42a278de98bef..fd26621051981 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -291,7 +291,7 @@ impl !marker::Sync for Rc {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Rc {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Rc {} impl Rc { @@ -1090,7 +1090,7 @@ impl Deref for Rc { } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Rc {} #[stable(feature = "rust1", since = "1.0.0")] @@ -1471,7 +1471,7 @@ impl From> for Rc<[T]> { } } -#[unstable(feature = "boxed_slice_try_from", issue = "0")] +#[unstable(feature = "boxed_slice_try_from", issue = "none")] impl TryFrom> for Rc<[T; N]> where [T; N]: LengthAtMost32, @@ -1621,7 +1621,7 @@ impl !marker::Sync for Weak {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Weak {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Weak {} impl Weak { @@ -2106,6 +2106,8 @@ impl Unpin for Rc { } unsafe fn data_offset(ptr: *const T) -> isize { // Align the unsized value to the end of the `RcBox`. // Because it is ?Sized, it will always be the last field in memory. + // Note: This is a detail of the current implementation of the compiler, + // and is not a guaranteed language detail. Do not rely on it outside of std. data_offset_align(align_of_val(&*ptr)) } diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs index a99564c0dac8a..3343384754f51 100644 --- a/src/liballoc/sync.rs +++ b/src/liballoc/sync.rs @@ -206,7 +206,7 @@ unsafe impl Sync for Arc {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Arc {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Arc {} impl Arc { @@ -263,7 +263,7 @@ unsafe impl Sync for Weak {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Weak {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Weak {} #[stable(feature = "arc_weak", since = "1.4.0")] @@ -993,7 +993,7 @@ impl Deref for Arc { } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Arc {} impl Arc { @@ -2032,7 +2032,7 @@ impl From> for Arc<[T]> { } } -#[unstable(feature = "boxed_slice_try_from", issue = "0")] +#[unstable(feature = "boxed_slice_try_from", issue = "none")] impl TryFrom> for Arc<[T; N]> where [T; N]: LengthAtMost32, @@ -2161,6 +2161,8 @@ impl Unpin for Arc { } unsafe fn data_offset(ptr: *const T) -> isize { // Align the unsized value to the end of the `ArcInner`. // Because it is `?Sized`, it will always be the last field in memory. + // Note: This is a detail of the current implementation of the compiler, + // and is not a guaranteed language detail. Do not rely on it outside of std. data_offset_align(align_of_val(&*ptr)) } diff --git a/src/libcore/array/mod.rs b/src/libcore/array/mod.rs index 38d248d701d4a..fd80000b6fb8c 100644 --- a/src/libcore/array/mod.rs +++ b/src/libcore/array/mod.rs @@ -74,7 +74,7 @@ impl TryFromSliceError { #[unstable(feature = "array_error_internals", reason = "available through Error trait and this method should not \ be exposed publicly", - issue = "0")] + issue = "none")] #[inline] #[doc(hidden)] pub fn __description(&self) -> &str { @@ -388,14 +388,14 @@ where #[rustc_on_unimplemented( message="arrays only have std trait implementations for lengths 0..=32", )] -#[unstable(feature = "const_generic_impls_guard", issue = "0", +#[unstable(feature = "const_generic_impls_guard", issue = "none", reason = "will never be stable, just a temporary step until const generics are stable")] pub trait LengthAtMost32 {} macro_rules! array_impls { ($($N:literal)+) => { $( - #[unstable(feature = "const_generic_impls_guard", issue = "0")] + #[unstable(feature = "const_generic_impls_guard", issue = "none")] impl LengthAtMost32 for [T; $N] {} )+ } diff --git a/src/libcore/char/convert.rs b/src/libcore/char/convert.rs index dd21c72e745dd..315020bac5850 100644 --- a/src/libcore/char/convert.rs +++ b/src/libcore/char/convert.rs @@ -169,7 +169,7 @@ impl ParseCharError { #[unstable( feature = "char_error_internals", reason = "this method should not be available publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs index 18f808638deac..9a412e5729427 100644 --- a/src/libcore/clone.rs +++ b/src/libcore/clone.rs @@ -150,7 +150,7 @@ pub macro Clone($item:item) { #[unstable( feature = "derive_clone_copy", reason = "deriving hack, should not be public", - issue = "0" + issue = "none" )] pub struct AssertParamIsClone { _field: crate::marker::PhantomData, @@ -160,7 +160,7 @@ pub struct AssertParamIsClone { #[unstable( feature = "derive_clone_copy", reason = "deriving hack, should not be public", - issue = "0" + issue = "none" )] pub struct AssertParamIsCopy { _field: crate::marker::PhantomData, diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index 4aa52a7a390e3..a0e72fb66b0a1 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -288,7 +288,7 @@ pub macro Eq($item:item) { /* compiler built-in */ } #[allow(missing_debug_implementations)] #[unstable(feature = "derive_eq", reason = "deriving hack, should not be public", - issue = "0")] + issue = "none")] pub struct AssertParamIsEq { _field: crate::marker::PhantomData } /// An `Ordering` is the result of a comparison between two values. diff --git a/src/libcore/ffi.rs b/src/libcore/ffi.rs index 74ec24939a310..6277da4f123f2 100644 --- a/src/libcore/ffi.rs +++ b/src/libcore/ffi.rs @@ -38,14 +38,14 @@ pub enum c_void { #[unstable( feature = "c_void_variant", reason = "temporary implementation detail", - issue = "0" + issue = "none" )] #[doc(hidden)] __variant1, #[unstable( feature = "c_void_variant", reason = "temporary implementation detail", - issue = "0" + issue = "none" )] #[doc(hidden)] __variant2, diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index 793c1f124ed65..6c8d1626b09b6 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -35,7 +35,7 @@ pub enum Alignment { #[stable(feature = "debug_builders", since = "1.2.0")] pub use self::builders::{DebugList, DebugMap, DebugSet, DebugStruct, DebugTuple}; -#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] +#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] #[doc(hidden)] pub mod rt { pub mod v1; @@ -259,7 +259,7 @@ struct Void { /// types, and then this struct is used to canonicalize arguments to one type. #[derive(Copy, Clone)] #[allow(missing_debug_implementations)] -#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] +#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] #[doc(hidden)] pub struct ArgumentV1<'a> { value: &'a Void, @@ -273,13 +273,13 @@ impl<'a> ArgumentV1<'a> { } #[doc(hidden)] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn new<'b, T>(x: &'b T, f: fn(&T, &mut Formatter<'_>) -> Result) -> ArgumentV1<'b> { unsafe { ArgumentV1 { formatter: mem::transmute(f), value: mem::transmute(x) } } } #[doc(hidden)] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn from_usize(x: &usize) -> ArgumentV1<'_> { ArgumentV1::new(x, ArgumentV1::show_usize) } @@ -309,7 +309,7 @@ impl<'a> Arguments<'a> { /// Arguments structure. #[doc(hidden)] #[inline] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn new_v1(pieces: &'a [&'a str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> { Arguments { pieces, fmt: None, args } } @@ -322,7 +322,7 @@ impl<'a> Arguments<'a> { /// unsafety, but will ignore invalid . #[doc(hidden)] #[inline] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn new_v1_formatted( pieces: &'a [&'a str], args: &'a [ArgumentV1<'a>], @@ -337,7 +337,7 @@ impl<'a> Arguments<'a> { /// when using `format!`. Note: this is neither the lower nor upper bound. #[doc(hidden)] #[inline] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn estimated_capacity(&self) -> usize { let pieces_length: usize = self.pieces.iter().map(|x| x.len()).sum(); diff --git a/src/libcore/hash/mod.rs b/src/libcore/hash/mod.rs index 0db8d86ebbf52..2a7fa58dd30ec 100644 --- a/src/libcore/hash/mod.rs +++ b/src/libcore/hash/mod.rs @@ -90,7 +90,7 @@ use crate::marker; #[allow(deprecated)] pub use self::sip::SipHasher; -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] #[allow(deprecated)] #[doc(hidden)] pub use self::sip::SipHasher13; diff --git a/src/libcore/hash/sip.rs b/src/libcore/hash/sip.rs index 0aa3b97ebcf15..7ebe01e26dca1 100644 --- a/src/libcore/hash/sip.rs +++ b/src/libcore/hash/sip.rs @@ -15,7 +15,7 @@ use crate::ptr; /// (e.g., `collections::HashMap` uses it by default). /// /// See: -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -29,7 +29,7 @@ pub struct SipHasher13 { /// An implementation of SipHash 2-4. /// /// See: -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -172,7 +172,7 @@ impl SipHasher { impl SipHasher13 { /// Creates a new `SipHasher13` with the two initial keys set to 0. #[inline] - #[unstable(feature = "hashmap_internals", issue = "0")] + #[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -183,7 +183,7 @@ impl SipHasher13 { /// Creates a `SipHasher13` that is keyed off the provided keys. #[inline] - #[unstable(feature = "hashmap_internals", issue = "0")] + #[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -264,7 +264,7 @@ impl super::Hasher for SipHasher { } } -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] impl super::Hasher for SipHasher13 { #[inline] fn write(&mut self, msg: &[u8]) { diff --git a/src/libcore/internal_macros.rs b/src/libcore/internal_macros.rs index 3acf2ec837d88..4ea7dfc073554 100644 --- a/src/libcore/internal_macros.rs +++ b/src/libcore/internal_macros.rs @@ -77,7 +77,7 @@ macro_rules! forward_ref_op_assign { } /// Create a zero-size type similar to a closure type, but named. -#[unstable(feature = "std_internals", issue = "0")] +#[unstable(feature = "std_internals", issue = "none")] macro_rules! impl_fn_for_zst { ($( $( #[$attr: meta] )* diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs index b02acce2d00bb..e73d125c13f89 100644 --- a/src/libcore/intrinsics.rs +++ b/src/libcore/intrinsics.rs @@ -33,7 +33,7 @@ reason = "intrinsics are unlikely to ever be stabilized, instead \ they should be used through stabilized interfaces \ in the rest of the standard library", - issue = "0")] + issue = "none")] #![allow(missing_docs)] use crate::mem; @@ -709,7 +709,7 @@ extern "rust-intrinsic" { reason = "intrinsics are unlikely to ever be stabilized, instead \ they should be used through stabilized interfaces \ in the rest of the standard library", - issue = "0")] + issue = "none")] #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned", since = "1.38.0")] pub fn init() -> T; @@ -725,7 +725,7 @@ extern "rust-intrinsic" { reason = "intrinsics are unlikely to ever be stabilized, instead \ they should be used through stabilized interfaces \ in the rest of the standard library", - issue = "0")] + issue = "none")] #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned", since = "1.38.0")] pub fn uninit() -> T; diff --git a/src/libcore/macros/mod.rs b/src/libcore/macros/mod.rs index dd06da7a6d23e..6c7ec2cbfe321 100644 --- a/src/libcore/macros/mod.rs +++ b/src/libcore/macros/mod.rs @@ -799,7 +799,7 @@ pub(crate) mod builtin { /// Same as `format_args`, but adds a newline in the end. #[unstable( feature = "format_args_nl", - issue = "0", + issue = "none", reason = "`format_args_nl` is only for internal \ language use and is subject to change" )] diff --git a/src/libcore/mem/maybe_uninit.rs b/src/libcore/mem/maybe_uninit.rs index 7f80f61aaf96d..de3b837fb686b 100644 --- a/src/libcore/mem/maybe_uninit.rs +++ b/src/libcore/mem/maybe_uninit.rs @@ -301,7 +301,7 @@ impl MaybeUninit { /// let mut buf: [MaybeUninit; 32] = MaybeUninit::uninit_array(); /// let data = read(&mut buf); /// ``` - #[unstable(feature = "maybe_uninit_uninit_array", issue = "0")] + #[unstable(feature = "maybe_uninit_uninit_array", issue = "none")] #[inline(always)] pub fn uninit_array() -> [Self; LEN] { unsafe { @@ -310,7 +310,7 @@ impl MaybeUninit { } /// A promotable constant, equivalent to `uninit()`. - #[unstable(feature = "internal_uninit_const", issue = "0", + #[unstable(feature = "internal_uninit_const", issue = "none", reason = "hack to work around promotability")] pub const UNINIT: Self = Self::uninit(); @@ -749,7 +749,7 @@ impl MaybeUninit { /// It is up to the caller to guarantee that the `MaybeUninit` elements /// really are in an initialized state. /// Calling this when the content is not yet fully initialized causes undefined behavior. - #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "0")] + #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "none")] #[inline(always)] pub unsafe fn slice_get_ref(slice: &[Self]) -> &[T] { &*(slice as *const [Self] as *const [T]) @@ -762,7 +762,7 @@ impl MaybeUninit { /// It is up to the caller to guarantee that the `MaybeUninit` elements /// really are in an initialized state. /// Calling this when the content is not yet fully initialized causes undefined behavior. - #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "0")] + #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "none")] #[inline(always)] pub unsafe fn slice_get_mut(slice: &mut [Self]) -> &mut [T] { &mut *(slice as *mut [Self] as *mut [T]) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 4e8ba8131f7a6..db5d2650331f4 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -121,7 +121,7 @@ pub fn forget(t: T) { /// /// [`forget`]: fn.forget.html #[inline] -#[unstable(feature = "forget_unsized", issue = "0")] +#[unstable(feature = "forget_unsized", issue = "none")] pub fn forget_unsized(t: T) { // SAFETY: the forget intrinsic could be safe, but there's no point in making it safe since // we'll be implementing this function soon via `ManuallyDrop` diff --git a/src/libcore/num/bignum.rs b/src/libcore/num/bignum.rs index b8ddd5322a1da..39cc381b64c74 100644 --- a/src/libcore/num/bignum.rs +++ b/src/libcore/num/bignum.rs @@ -15,7 +15,7 @@ #![unstable( feature = "core_private_bignum", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] #![macro_use] diff --git a/src/libcore/num/dec2flt/mod.rs b/src/libcore/num/dec2flt/mod.rs index 6fe9af8cbd8ee..c83c6b0eccbc7 100644 --- a/src/libcore/num/dec2flt/mod.rs +++ b/src/libcore/num/dec2flt/mod.rs @@ -81,7 +81,7 @@ #![unstable( feature = "dec2flt", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] use crate::fmt; @@ -187,7 +187,7 @@ impl ParseFloatError { feature = "int_error_internals", reason = "available through Error trait and this method should \ not be exposed publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { diff --git a/src/libcore/num/diy_float.rs b/src/libcore/num/diy_float.rs index 0e601d45a2124..0a609417dcf4c 100644 --- a/src/libcore/num/diy_float.rs +++ b/src/libcore/num/diy_float.rs @@ -6,7 +6,7 @@ #![unstable( feature = "core_private_diy_float", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] /// A custom 64-bit floating point type, representing `f * 2^e`. diff --git a/src/libcore/num/flt2dec/mod.rs b/src/libcore/num/flt2dec/mod.rs index 63df561345323..9e760c13c0cf0 100644 --- a/src/libcore/num/flt2dec/mod.rs +++ b/src/libcore/num/flt2dec/mod.rs @@ -119,7 +119,7 @@ functions. #![unstable( feature = "flt2dec", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] pub use self::decoder::{decode, DecodableFloat, Decoded, FullDecoded}; diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 6c864f74b1f14..8a32479b2ff7d 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -4769,7 +4769,7 @@ impl TryFromIntError { feature = "int_error_internals", reason = "available through Error trait and this method should \ not be exposed publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { @@ -4968,7 +4968,7 @@ impl ParseIntError { feature = "int_error_internals", reason = "available through Error trait and this method should \ not be exposed publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { diff --git a/src/libcore/ops/deref.rs b/src/libcore/ops/deref.rs index f521355a90722..68244fdb38114 100644 --- a/src/libcore/ops/deref.rs +++ b/src/libcore/ops/deref.rs @@ -178,14 +178,14 @@ impl DerefMut for &mut T { /// `arbitrary_self_types` feature. This is implemented by stdlib pointer types like `Box`, /// `Rc`, `&T`, and `Pin

`. #[lang = "receiver"] -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] #[doc(hidden)] pub trait Receiver { // Empty. } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for &T {} -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for &mut T {} diff --git a/src/libcore/ops/mod.rs b/src/libcore/ops/mod.rs index 80ab906961ee7..77b92b6ccbdaa 100644 --- a/src/libcore/ops/mod.rs +++ b/src/libcore/ops/mod.rs @@ -168,7 +168,7 @@ pub use self::bit::{BitAndAssign, BitOrAssign, BitXorAssign, ShlAssign, ShrAssig #[stable(feature = "rust1", since = "1.0.0")] pub use self::deref::{Deref, DerefMut}; -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] pub use self::deref::Receiver; #[stable(feature = "rust1", since = "1.0.0")] @@ -195,5 +195,5 @@ pub use self::generator::{Generator, GeneratorState}; #[unstable(feature = "coerce_unsized", issue = "27732")] pub use self::unsize::CoerceUnsized; -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] pub use self::unsize::DispatchFromDyn; diff --git a/src/libcore/ops/unsize.rs b/src/libcore/ops/unsize.rs index 80fb5642a6a76..95a4393592be9 100644 --- a/src/libcore/ops/unsize.rs +++ b/src/libcore/ops/unsize.rs @@ -81,21 +81,21 @@ impl, U: ?Sized> CoerceUnsized<*const U> for *const T {} /// T: Unsize, /// {} /// ``` -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] #[lang = "dispatch_from_dyn"] pub trait DispatchFromDyn { // Empty. } // &T -> &U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl<'a, T: ?Sized + Unsize, U: ?Sized> DispatchFromDyn<&'a U> for &'a T {} // &mut T -> &mut U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl<'a, T: ?Sized + Unsize, U: ?Sized> DispatchFromDyn<&'a mut U> for &'a mut T {} // *const T -> *const U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn<*const U> for *const T {} // *mut T -> *mut U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn<*mut U> for *mut T {} diff --git a/src/libcore/panic.rs b/src/libcore/panic.rs index c9a1c4b004949..a90b025c09351 100644 --- a/src/libcore/panic.rs +++ b/src/libcore/panic.rs @@ -40,7 +40,7 @@ impl<'a> PanicInfo<'a> { #[unstable(feature = "panic_internals", reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0")] + issue = "none")] #[doc(hidden)] #[inline] pub fn internal_constructor( @@ -58,7 +58,7 @@ impl<'a> PanicInfo<'a> { #[unstable(feature = "panic_internals", reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0")] + issue = "none")] #[doc(hidden)] #[inline] pub fn set_payload(&mut self, info: &'a (dyn Any + Send)) { @@ -235,7 +235,7 @@ impl<'a> Location<'a> { #![unstable(feature = "panic_internals", reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0")] + issue = "none")] #[doc(hidden)] pub const fn internal_constructor(file: &'a str, line: u32, col: u32) -> Self { Location { file, line, col } @@ -318,7 +318,7 @@ impl fmt::Display for Location<'_> { /// An internal trait used by libstd to pass data from libstd to `panic_unwind` /// and other panic runtimes. Not intended to be stabilized any time soon, do /// not use. -#[unstable(feature = "std_internals", issue = "0")] +#[unstable(feature = "std_internals", issue = "none")] #[doc(hidden)] pub unsafe trait BoxMeUp { /// Take full ownership of the contents. diff --git a/src/libcore/panicking.rs b/src/libcore/panicking.rs index 4857b1145952d..7ebb72e3ce7ba 100644 --- a/src/libcore/panicking.rs +++ b/src/libcore/panicking.rs @@ -26,7 +26,7 @@ feature = "core_panic", reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0" + issue = "none" )] use crate::fmt; diff --git a/src/libcore/pin.rs b/src/libcore/pin.rs index 6a0c5bbebc1c6..aca6fb2013881 100644 --- a/src/libcore/pin.rs +++ b/src/libcore/pin.rs @@ -786,7 +786,7 @@ impl> DerefMut for Pin

{ } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Pin

{} #[stable(feature = "pin", since = "1.33.0")] diff --git a/src/libcore/ptr/mod.rs b/src/libcore/ptr/mod.rs index 924563fc44f6e..d42b673ff6596 100644 --- a/src/libcore/ptr/mod.rs +++ b/src/libcore/ptr/mod.rs @@ -89,7 +89,7 @@ mod non_null; pub use non_null::NonNull; mod unique; -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] pub use unique::Unique; mod const_ptr; diff --git a/src/libcore/ptr/non_null.rs b/src/libcore/ptr/non_null.rs index 6946fd2413eb3..626e58d49306e 100644 --- a/src/libcore/ptr/non_null.rs +++ b/src/libcore/ptr/non_null.rs @@ -149,7 +149,7 @@ impl Copy for NonNull {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl CoerceUnsized> for NonNull where T: Unsize {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl DispatchFromDyn> for NonNull where T: Unsize {} #[stable(feature = "nonnull", since = "1.25.0")] @@ -201,7 +201,7 @@ impl hash::Hash for NonNull { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From> for NonNull { #[inline] fn from(unique: Unique) -> Self { diff --git a/src/libcore/ptr/unique.rs b/src/libcore/ptr/unique.rs index 546b7c9d777f5..87b56d951c6ce 100644 --- a/src/libcore/ptr/unique.rs +++ b/src/libcore/ptr/unique.rs @@ -29,7 +29,7 @@ use crate::ptr::NonNull; /// for any type which upholds Unique's aliasing requirements. #[unstable( feature = "ptr_internals", - issue = "0", + issue = "none", reason = "use `NonNull` instead and consider `PhantomData` \ (if you also use `#[may_dangle]`), `Send`, and/or `Sync`" )] @@ -50,17 +50,17 @@ pub struct Unique { /// reference is unaliased. Note that this aliasing invariant is /// unenforced by the type system; the abstraction using the /// `Unique` must enforce it. -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] unsafe impl Send for Unique {} /// `Unique` pointers are `Sync` if `T` is `Sync` because the data they /// reference is unaliased. Note that this aliasing invariant is /// unenforced by the type system; the abstraction using the /// `Unique` must enforce it. -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] unsafe impl Sync for Unique {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Unique { /// Creates a new `Unique` that is dangling, but well-aligned. /// @@ -78,7 +78,7 @@ impl Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Unique { /// Creates a new `Unique`. /// @@ -133,7 +133,7 @@ impl Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Clone for Unique { #[inline] fn clone(&self) -> Self { @@ -141,30 +141,30 @@ impl Clone for Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Copy for Unique {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl CoerceUnsized> for Unique where T: Unsize {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl DispatchFromDyn> for Unique where T: Unsize {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl fmt::Debug for Unique { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Pointer::fmt(&self.as_ptr(), f) } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl fmt::Pointer for Unique { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Pointer::fmt(&self.as_ptr(), f) } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From<&mut T> for Unique { #[inline] fn from(reference: &mut T) -> Self { @@ -172,7 +172,7 @@ impl From<&mut T> for Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From<&T> for Unique { #[inline] fn from(reference: &T) -> Self { @@ -180,7 +180,7 @@ impl From<&T> for Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From> for Unique { #[inline] fn from(p: NonNull) -> Self { diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index 05baa1899b3e0..68e12e877893d 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -38,7 +38,7 @@ use crate::ptr; use crate::mem; use crate::marker::{Copy, Send, Sync, Sized, self}; -#[unstable(feature = "slice_internals", issue = "0", +#[unstable(feature = "slice_internals", issue = "none", reason = "exposed from core to be reused in std; use the memchr crate")] /// Pure rust memchr implementation, taken from rust-memchr pub mod memchr; @@ -2723,12 +2723,12 @@ pub trait SliceIndex: private_slice_index::Sealed { /// Returns a shared reference to the output at this location, if in /// bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn get(self, slice: &T) -> Option<&Self::Output>; /// Returns a mutable reference to the output at this location, if in /// bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn get_mut(self, slice: &mut T) -> Option<&mut Self::Output>; /// Returns a shared reference to the output at this location, without @@ -2736,7 +2736,7 @@ pub trait SliceIndex: private_slice_index::Sealed { /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. /// [undefined behavior]: ../../reference/behavior-considered-undefined.html - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] unsafe fn get_unchecked(self, slice: &T) -> &Self::Output; /// Returns a mutable reference to the output at this location, without @@ -2744,17 +2744,17 @@ pub trait SliceIndex: private_slice_index::Sealed { /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. /// [undefined behavior]: ../../reference/behavior-considered-undefined.html - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] unsafe fn get_unchecked_mut(self, slice: &mut T) -> &mut Self::Output; /// Returns a shared reference to the output at this location, panicking /// if out of bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn index(self, slice: &T) -> &Self::Output; /// Returns a mutable reference to the output at this location, panicking /// if out of bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn index_mut(self, slice: &mut T) -> &mut Self::Output; } @@ -5382,7 +5382,7 @@ pub fn from_mut(s: &mut T) -> &mut [T] { } // This function is public only because there is no other way to unit test heapsort. -#[unstable(feature = "sort_internals", reason = "internal to sort module", issue = "0")] +#[unstable(feature = "sort_internals", reason = "internal to sort module", issue = "none")] #[doc(hidden)] pub fn heapsort(v: &mut [T], mut is_less: F) where F: FnMut(&T, &T) -> bool diff --git a/src/libcore/str/lossy.rs b/src/libcore/str/lossy.rs index 762de0489a975..cf6ee6ed5935d 100644 --- a/src/libcore/str/lossy.rs +++ b/src/libcore/str/lossy.rs @@ -6,7 +6,7 @@ use crate::mem; // ignore-tidy-undocumented-unsafe /// Lossy UTF-8 string. -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] pub struct Utf8Lossy { bytes: [u8] } @@ -27,13 +27,13 @@ impl Utf8Lossy { /// Iterator over lossy UTF-8 string -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[allow(missing_debug_implementations)] pub struct Utf8LossyChunksIter<'a> { source: &'a [u8], } -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[derive(PartialEq, Eq, Debug)] pub struct Utf8LossyChunk<'a> { /// Sequence of valid chars. diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs index e2cc99813aca5..15b65ed76555a 100644 --- a/src/libcore/str/mod.rs +++ b/src/libcore/str/mod.rs @@ -21,7 +21,7 @@ use crate::option; pub mod pattern; -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[allow(missing_docs)] pub mod lossy; @@ -496,7 +496,7 @@ fn unwrap_or_0(opt: Option<&u8>) -> u8 { /// Reads the next code point out of a byte iterator (assuming a /// UTF-8-like encoding). -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[inline] pub fn next_code_point<'a, I: Iterator>(bytes: &mut I) -> Option { // Decode UTF-8 @@ -1583,7 +1583,7 @@ static UTF8_CHAR_WIDTH: [u8; 256] = [ ]; /// Given a first byte, determines how many bytes are in this UTF-8 character. -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[inline] pub fn utf8_char_width(b: u8) -> usize { UTF8_CHAR_WIDTH[b as usize] as usize diff --git a/src/libcore/unicode/mod.rs b/src/libcore/unicode/mod.rs index a3ec9fd51f064..e424174f55469 100644 --- a/src/libcore/unicode/mod.rs +++ b/src/libcore/unicode/mod.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "unicode_internals", issue = "0")] +#![unstable(feature = "unicode_internals", issue = "none")] #![allow(missing_docs)] mod bool_trie; diff --git a/src/libprofiler_builtins/lib.rs b/src/libprofiler_builtins/lib.rs index 0d12ba01c87a2..e503795c519d4 100644 --- a/src/libprofiler_builtins/lib.rs +++ b/src/libprofiler_builtins/lib.rs @@ -3,7 +3,7 @@ #![profiler_runtime] #![unstable(feature = "profiler_runtime_lib", reason = "internal implementation detail of rustc right now", - issue = "0")] + issue = "none")] #![allow(unused_features)] #![feature(nll)] #![feature(staged_api)] diff --git a/src/librustc_asan/lib.rs b/src/librustc_asan/lib.rs index d6c8e54c18db7..4c8c9d15d5629 100644 --- a/src/librustc_asan/lib.rs +++ b/src/librustc_asan/lib.rs @@ -5,4 +5,4 @@ #![no_std] #![unstable(feature = "sanitizer_runtime_lib", reason = "internal implementation detail of sanitizers", - issue = "0")] + issue = "none")] diff --git a/src/librustc_error_codes/error_codes/E0734.md b/src/librustc_error_codes/error_codes/E0734.md index 913801d2236b5..7506c8e693ed8 100644 --- a/src/librustc_error_codes/error_codes/E0734.md +++ b/src/librustc_error_codes/error_codes/E0734.md @@ -5,7 +5,7 @@ Erroneous code examples: ```compile_fail,E0734 #[rustc_deprecated(since = "b", reason = "text")] // invalid #[stable(feature = "a", since = "b")] // invalid -#[unstable(feature = "b", issue = "0")] // invalid +#[unstable(feature = "b", issue = "none")] // invalid fn foo(){} ``` diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 4cf694631d0d3..6461263bf5123 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -174,18 +174,27 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns { // (Issue #49588) continue; } - if let PatKind::Binding(_, _, ident, None) = fieldpat.pat.kind { + if let PatKind::Binding(binding_annot, _, ident, None) = fieldpat.pat.kind { if cx.tcx.find_field_index(ident, &variant) == Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables)) { let mut err = cx.struct_span_lint(NON_SHORTHAND_FIELD_PATTERNS, fieldpat.span, &format!("the `{}:` in this pattern is redundant", ident)); - let subspan = cx.tcx.sess.source_map().span_through_char(fieldpat.span, - ':'); - err.span_suggestion_short( - subspan, - "remove this", - ident.to_string(), + let binding = match binding_annot { + hir::BindingAnnotation::Unannotated => None, + hir::BindingAnnotation::Mutable => Some("mut"), + hir::BindingAnnotation::Ref => Some("ref"), + hir::BindingAnnotation::RefMut => Some("ref mut"), + }; + let ident = if let Some(binding) = binding { + format!("{} {}", binding, ident) + } else { + ident.to_string() + }; + err.span_suggestion( + fieldpat.span, + "use shorthand field pattern", + ident, Applicability::MachineApplicable ); err.emit(); diff --git a/src/librustc_lsan/lib.rs b/src/librustc_lsan/lib.rs index d6c8e54c18db7..4c8c9d15d5629 100644 --- a/src/librustc_lsan/lib.rs +++ b/src/librustc_lsan/lib.rs @@ -5,4 +5,4 @@ #![no_std] #![unstable(feature = "sanitizer_runtime_lib", reason = "internal implementation detail of sanitizers", - issue = "0")] + issue = "none")] diff --git a/src/librustc_mir/hair/pattern/_match.rs b/src/librustc_mir/hair/pattern/_match.rs index c372032850695..f267be812c3d2 100644 --- a/src/librustc_mir/hair/pattern/_match.rs +++ b/src/librustc_mir/hair/pattern/_match.rs @@ -620,10 +620,11 @@ impl<'a, 'tcx> MatchCheckCtxt<'a, 'tcx> { enum SliceKind { /// Patterns of length `n` (`[x, y]`). FixedLen(u64), - /// Patterns using the `..` notation (`[x, .., y]`). Captures any array constructor of `length - /// >= i + j`. In the case where `array_len` is `Some(_)`, this indicates that we only care - /// about the first `i` and the last `j` values of the array, and everything in between is a - /// wildcard `_`. + /// Patterns using the `..` notation (`[x, .., y]`). + /// Captures any array constructor of `length >= i + j`. + /// In the case where `array_len` is `Some(_)`, + /// this indicates that we only care about the first `i` and the last `j` values of the array, + /// and everything in between is a wildcard `_`. VarLen(u64, u64), } diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir/hair/pattern/mod.rs index 7f15b3de5efc0..9d0a67151fb60 100644 --- a/src/librustc_mir/hair/pattern/mod.rs +++ b/src/librustc_mir/hair/pattern/mod.rs @@ -445,6 +445,11 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { fn lower_pattern_unadjusted(&mut self, pat: &'tcx hir::Pat) -> Pat<'tcx> { let mut ty = self.tables.node_type(pat.hir_id); + if let ty::Error = ty.kind { + // Avoid ICEs (e.g., #50577 and #50585). + return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; + } + let kind = match pat.kind { hir::PatKind::Wild => PatKind::Wild, @@ -544,57 +549,19 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { } hir::PatKind::Slice(ref prefix, ref slice, ref suffix) => { - match ty.kind { - ty::Ref(_, ty, _) => - PatKind::Deref { - subpattern: Pat { - ty, - span: pat.span, - kind: Box::new(self.slice_or_array_pattern( - pat.span, ty, prefix, slice, suffix)) - }, - }, - ty::Slice(..) | - ty::Array(..) => - self.slice_or_array_pattern(pat.span, ty, prefix, slice, suffix), - ty::Error => { // Avoid ICE - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - } - _ => - span_bug!( - pat.span, - "unexpanded type for vector pattern: {:?}", - ty), - } + self.slice_or_array_pattern(pat.span, ty, prefix, slice, suffix) } - hir::PatKind::Tuple(ref subpatterns, ddpos) => { - match ty.kind { - ty::Tuple(ref tys) => { - let subpatterns = - subpatterns.iter() - .enumerate_and_adjust(tys.len(), ddpos) - .map(|(i, subpattern)| FieldPat { - field: Field::new(i), - pattern: self.lower_pattern(subpattern) - }) - .collect(); - - PatKind::Leaf { subpatterns } - } - ty::Error => { // Avoid ICE (#50577) - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - } + hir::PatKind::Tuple(ref pats, ddpos) => { + let tys = match ty.kind { + ty::Tuple(ref tys) => tys, _ => span_bug!(pat.span, "unexpected type for tuple pattern: {:?}", ty), - } + }; + let subpatterns = self.lower_tuple_subpats(pats, tys.len(), ddpos); + PatKind::Leaf { subpatterns } } hir::PatKind::Binding(_, id, ident, ref sub) => { - let var_ty = self.tables.node_type(pat.hir_id); - if let ty::Error = var_ty.kind { - // Avoid ICE - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - }; let bm = *self.tables.pat_binding_modes().get(pat.hir_id) .expect("missing binding mode"); let (mutability, mode) = match bm { @@ -609,13 +576,14 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { // A ref x pattern is the same node used for x, and as such it has // x's type, which is &T, where we want T (the type being matched). + let var_ty = ty; if let ty::BindByReference(_) = bm { if let ty::Ref(_, rty, _) = ty.kind { ty = rty; } else { bug!("`ref {}` has wrong type {}", ident, ty); } - } + }; PatKind::Binding { mutability, @@ -627,28 +595,14 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { } } - hir::PatKind::TupleStruct(ref qpath, ref subpatterns, ddpos) => { + hir::PatKind::TupleStruct(ref qpath, ref pats, ddpos) => { let res = self.tables.qpath_res(qpath, pat.hir_id); let adt_def = match ty.kind { ty::Adt(adt_def, _) => adt_def, - ty::Error => { // Avoid ICE (#50585) - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - } - _ => span_bug!(pat.span, - "tuple struct pattern not applied to an ADT {:?}", - ty), + _ => span_bug!(pat.span, "tuple struct pattern not applied to an ADT {:?}", ty), }; let variant_def = adt_def.variant_of_res(res); - - let subpatterns = - subpatterns.iter() - .enumerate_and_adjust(variant_def.fields.len(), ddpos) - .map(|(i, field)| FieldPat { - field: Field::new(i), - pattern: self.lower_pattern(field), - }) - .collect(); - + let subpatterns = self.lower_tuple_subpats(pats, variant_def.fields.len(), ddpos); self.lower_variant_or_leaf(res, pat.hir_id, pat.span, ty, subpatterns) } @@ -668,11 +622,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { self.lower_variant_or_leaf(res, pat.hir_id, pat.span, ty, subpatterns) } - hir::PatKind::Or(ref pats) => { - PatKind::Or { - pats: pats.iter().map(|p| self.lower_pattern(p)).collect(), - } - } + hir::PatKind::Or(ref pats) => PatKind::Or { pats: self.lower_patterns(pats) }, }; Pat { @@ -682,80 +632,50 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { } } + fn lower_tuple_subpats( + &mut self, + pats: &'tcx [P], + expected_len: usize, + gap_pos: Option, + ) -> Vec> { + pats.iter() + .enumerate_and_adjust(expected_len, gap_pos) + .map(|(i, subpattern)| FieldPat { + field: Field::new(i), + pattern: self.lower_pattern(subpattern) + }) + .collect() + } + fn lower_patterns(&mut self, pats: &'tcx [P]) -> Vec> { pats.iter().map(|p| self.lower_pattern(p)).collect() } - fn lower_opt_pattern(&mut self, pat: &'tcx Option>) -> Option> - { + fn lower_opt_pattern(&mut self, pat: &'tcx Option>) -> Option> { pat.as_ref().map(|p| self.lower_pattern(p)) } - fn flatten_nested_slice_patterns( - &mut self, - prefix: Vec>, - slice: Option>, - suffix: Vec>) - -> (Vec>, Option>, Vec>) - { - let orig_slice = match slice { - Some(orig_slice) => orig_slice, - None => return (prefix, slice, suffix) - }; - let orig_prefix = prefix; - let orig_suffix = suffix; - - // dance because of intentional borrow-checker stupidity. - let kind = *orig_slice.kind; - match kind { - PatKind::Slice { prefix, slice, mut suffix } | - PatKind::Array { prefix, slice, mut suffix } => { - let mut orig_prefix = orig_prefix; - - orig_prefix.extend(prefix); - suffix.extend(orig_suffix); - - (orig_prefix, slice, suffix) - } - _ => { - (orig_prefix, Some(Pat { - kind: box kind, ..orig_slice - }), orig_suffix) - } - } - } - fn slice_or_array_pattern( &mut self, span: Span, ty: Ty<'tcx>, prefix: &'tcx [P], slice: &'tcx Option>, - suffix: &'tcx [P]) - -> PatKind<'tcx> - { + suffix: &'tcx [P], + ) -> PatKind<'tcx> { let prefix = self.lower_patterns(prefix); let slice = self.lower_opt_pattern(slice); let suffix = self.lower_patterns(suffix); - let (prefix, slice, suffix) = - self.flatten_nested_slice_patterns(prefix, slice, suffix); - match ty.kind { - ty::Slice(..) => { - // matching a slice or fixed-length array - PatKind::Slice { prefix: prefix, slice: slice, suffix: suffix } - } - + // Matching a slice, `[T]`. + ty::Slice(..) => PatKind::Slice { prefix, slice, suffix }, + // Fixed-length array, `[T; len]`. ty::Array(_, len) => { - // fixed-length array let len = len.eval_usize(self.tcx, self.param_env); assert!(len >= prefix.len() as u64 + suffix.len() as u64); - PatKind::Array { prefix: prefix, slice: slice, suffix: suffix } - } - - _ => { - span_bug!(span, "bad slice pattern type {:?}", ty); + PatKind::Array { prefix, slice, suffix } } + _ => span_bug!(span, "bad slice pattern type {:?}", ty), } } diff --git a/src/librustc_msan/lib.rs b/src/librustc_msan/lib.rs index d6c8e54c18db7..4c8c9d15d5629 100644 --- a/src/librustc_msan/lib.rs +++ b/src/librustc_msan/lib.rs @@ -5,4 +5,4 @@ #![no_std] #![unstable(feature = "sanitizer_runtime_lib", reason = "internal implementation detail of sanitizers", - issue = "0")] + issue = "none")] diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index 159c2121d36c8..71c9e58f58fd7 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -90,6 +90,10 @@ impl<'a> Parser<'a> { self.parse_expr_res(Restrictions::empty(), None) } + pub(super) fn parse_anon_const_expr(&mut self) -> PResult<'a, AnonConst> { + self.parse_expr().map(|value| AnonConst { id: DUMMY_NODE_ID, value }) + } + fn parse_expr_catch_underscore(&mut self) -> PResult<'a, P> { match self.parse_expr() { Ok(expr) => Ok(expr), @@ -109,7 +113,7 @@ impl<'a> Parser<'a> { } } - /// Parses a sequence of expressions bounded by parentheses. + /// Parses a sequence of expressions delimited by parentheses. fn parse_paren_expr_seq(&mut self) -> PResult<'a, Vec>> { self.parse_paren_comma_seq(|p| { p.parse_expr_catch_underscore() @@ -955,10 +959,7 @@ impl<'a> Parser<'a> { let first_expr = self.parse_expr()?; if self.eat(&token::Semi) { // Repeating array syntax: `[ 0; 512 ]` - let count = AnonConst { - id: DUMMY_NODE_ID, - value: self.parse_expr()?, - }; + let count = self.parse_anon_const_expr()?; self.expect(close)?; ExprKind::Repeat(first_expr, count) } else if self.eat(&token::Comma) { diff --git a/src/librustc_parse/parser/item.rs b/src/librustc_parse/parser/item.rs index 271e5092018d9..ea9047d2d77ab 100644 --- a/src/librustc_parse/parser/item.rs +++ b/src/librustc_parse/parser/item.rs @@ -5,7 +5,7 @@ use crate::maybe_whole; use rustc_errors::{PResult, Applicability, DiagnosticBuilder, StashKey}; use rustc_error_codes::*; -use syntax::ast::{self, DUMMY_NODE_ID, Ident, AttrVec, Attribute, AttrKind, AttrStyle, AnonConst}; +use syntax::ast::{self, DUMMY_NODE_ID, Ident, AttrVec, Attribute, AttrKind, AttrStyle}; use syntax::ast::{AssocItem, AssocItemKind, Item, ItemKind, UseTree, UseTreeKind}; use syntax::ast::{PathSegment, IsAuto, Constness, IsAsync, Unsafety, Defaultness, Extern, StrLit}; use syntax::ast::{Visibility, VisibilityKind, Mutability, FnHeader, ForeignItem, ForeignItemKind}; @@ -1317,10 +1317,7 @@ impl<'a> Parser<'a> { }; let disr_expr = if self.eat(&token::Eq) { - Some(AnonConst { - id: DUMMY_NODE_ID, - value: self.parse_expr()?, - }) + Some(self.parse_anon_const_expr()?) } else { None }; diff --git a/src/librustc_parse/parser/ty.rs b/src/librustc_parse/parser/ty.rs index 86692610324d4..58f3a5b3d6003 100644 --- a/src/librustc_parse/parser/ty.rs +++ b/src/librustc_parse/parser/ty.rs @@ -8,7 +8,7 @@ use rustc_error_codes::*; use syntax::ptr::P; use syntax::ast::{self, Ty, TyKind, MutTy, BareFnTy, FunctionRetTy, GenericParam, Lifetime, Ident}; use syntax::ast::{TraitBoundModifier, TraitObjectSyntax, GenericBound, GenericBounds, PolyTraitRef}; -use syntax::ast::{Mutability, AnonConst, Mac}; +use syntax::ast::{Mutability, Mac}; use syntax::token::{self, Token}; use syntax::struct_span_err; use syntax_pos::source_map::Span; @@ -73,78 +73,21 @@ impl<'a> Parser<'a> { let lo = self.token.span; let mut impl_dyn_multi = false; - let kind = if self.eat(&token::OpenDelim(token::Paren)) { - // `(TYPE)` is a parenthesized type. - // `(TYPE,)` is a tuple with a single field of type TYPE. - let mut ts = vec![]; - let mut last_comma = false; - while self.token != token::CloseDelim(token::Paren) { - ts.push(self.parse_ty()?); - if self.eat(&token::Comma) { - last_comma = true; - } else { - last_comma = false; - break; - } - } - let trailing_plus = self.prev_token_kind == PrevTokenKind::Plus; - self.expect(&token::CloseDelim(token::Paren))?; - - if ts.len() == 1 && !last_comma { - let ty = ts.into_iter().nth(0).unwrap().into_inner(); - let maybe_bounds = allow_plus && self.token.is_like_plus(); - match ty.kind { - // `(TY_BOUND_NOPAREN) + BOUND + ...`. - TyKind::Path(None, ref path) if maybe_bounds => { - self.parse_remaining_bounds(Vec::new(), path.clone(), lo, true)? - } - TyKind::TraitObject(ref bounds, TraitObjectSyntax::None) - if maybe_bounds && bounds.len() == 1 && !trailing_plus => { - let path = match bounds[0] { - GenericBound::Trait(ref pt, ..) => pt.trait_ref.path.clone(), - GenericBound::Outlives(..) => self.bug("unexpected lifetime bound"), - }; - self.parse_remaining_bounds(Vec::new(), path, lo, true)? - } - // `(TYPE)` - _ => TyKind::Paren(P(ty)) - } - } else { - TyKind::Tup(ts) - } + let kind = if self.check(&token::OpenDelim(token::Paren)) { + self.parse_ty_tuple_or_parens(lo, allow_plus)? } else if self.eat(&token::Not) { // Never type `!` TyKind::Never } else if self.eat(&token::BinOp(token::Star)) { - // Raw pointer - TyKind::Ptr(self.parse_ptr()?) + self.parse_ty_ptr()? } else if self.eat(&token::OpenDelim(token::Bracket)) { - // Array or slice - let t = self.parse_ty()?; - // Parse optional `; EXPR` in `[TYPE; EXPR]` - let t = match self.maybe_parse_fixed_length_of_vec()? { - None => TyKind::Slice(t), - Some(length) => TyKind::Array(t, AnonConst { - id: ast::DUMMY_NODE_ID, - value: length, - }), - }; - self.expect(&token::CloseDelim(token::Bracket))?; - t + self.parse_array_or_slice_ty()? } else if self.check(&token::BinOp(token::And)) || self.check(&token::AndAnd) { // Reference self.expect_and()?; self.parse_borrowed_pointee()? } else if self.eat_keyword_noexpect(kw::Typeof) { - // `typeof(EXPR)` - // In order to not be ambiguous, the type must be surrounded by parens. - self.expect(&token::OpenDelim(token::Paren))?; - let e = AnonConst { - id: ast::DUMMY_NODE_ID, - value: self.parse_expr()?, - }; - self.expect(&token::CloseDelim(token::Paren))?; - TyKind::Typeof(e) + self.parse_typeof_ty()? } else if self.eat_keyword(kw::Underscore) { // A type to be inferred `_` TyKind::Infer @@ -155,7 +98,6 @@ impl<'a> Parser<'a> { // Function pointer type or bound list (trait object type) starting with a poly-trait. // `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T` // `for<'lt> Trait1<'lt> + Trait2 + 'a` - let lo = self.token.span; let lifetime_defs = self.parse_late_bound_lifetime_defs()?; if self.token_is_bare_fn_keyword() { self.parse_ty_bare_fn(lifetime_defs)? @@ -165,69 +107,33 @@ impl<'a> Parser<'a> { self.parse_remaining_bounds(lifetime_defs, path, lo, parse_plus)? } } else if self.eat_keyword(kw::Impl) { - // Always parse bounds greedily for better error recovery. - let bounds = self.parse_generic_bounds(None)?; - impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus; - TyKind::ImplTrait(ast::DUMMY_NODE_ID, bounds) - } else if self.check_keyword(kw::Dyn) && - (self.token.span.rust_2018() || - self.look_ahead(1, |t| t.can_begin_bound() && - !can_continue_type_after_non_fn_ident(t))) { - self.bump(); // `dyn` - // Always parse bounds greedily for better error recovery. - let bounds = self.parse_generic_bounds(None)?; - impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus; - TyKind::TraitObject(bounds, TraitObjectSyntax::Dyn) - } else if self.check(&token::Question) || - self.check_lifetime() && self.look_ahead(1, |t| t.is_like_plus()) { + self.parse_impl_ty(&mut impl_dyn_multi)? + } else if self.is_explicit_dyn_type() { + self.parse_dyn_ty(&mut impl_dyn_multi)? + } else if self.check(&token::Question) + || self.check_lifetime() && self.look_ahead(1, |t| t.is_like_plus()) + { // Bound list (trait object type) - TyKind::TraitObject(self.parse_generic_bounds_common(allow_plus, None)?, - TraitObjectSyntax::None) + let bounds = self.parse_generic_bounds_common(allow_plus, None)?; + TyKind::TraitObject(bounds, TraitObjectSyntax::None) } else if self.eat_lt() { // Qualified path let (qself, path) = self.parse_qpath(PathStyle::Type)?; TyKind::Path(Some(qself), path) } else if self.token.is_path_start() { - // Simple path - let path = self.parse_path(PathStyle::Type)?; - if self.eat(&token::Not) { - // Macro invocation in type position - let args = self.parse_mac_args()?; - let mac = Mac { - path, - args, - prior_type_ascription: self.last_type_ascription, - }; - TyKind::Mac(mac) - } else { - // Just a type path or bound list (trait object type) starting with a trait. - // `Type` - // `Trait1 + Trait2 + 'a` - if allow_plus && self.check_plus() { - self.parse_remaining_bounds(Vec::new(), path, lo, true)? - } else { - TyKind::Path(None, path) - } - } + self.parse_path_start_ty(lo, allow_plus)? } else if self.eat(&token::DotDotDot) { if allow_c_variadic { TyKind::CVarArgs } else { // FIXME(Centril): Should we just allow `...` syntactically // anywhere in a type and use semantic restrictions instead? - struct_span_err!( - self.sess.span_diagnostic, - lo.to(self.prev_span), - E0743, - "C-variadic type `...` may not be nested inside another type", - ) - .emit(); - + self.error_illegal_c_varadic_ty(lo); TyKind::Err } } else { let msg = format!("expected type, found {}", self.this_token_descr()); - let mut err = self.fatal(&msg); + let mut err = self.struct_span_err(self.token.span, &msg); err.span_label(self.token.span, "expected type"); self.maybe_annotate_with_ascription(&mut err, true); return Err(err); @@ -242,8 +148,48 @@ impl<'a> Parser<'a> { self.maybe_recover_from_bad_qpath(ty, allow_qpath_recovery) } - fn parse_remaining_bounds(&mut self, generic_params: Vec, path: ast::Path, - lo: Span, parse_plus: bool) -> PResult<'a, TyKind> { + /// Parses either: + /// - `(TYPE)`, a parenthesized type. + /// - `(TYPE,)`, a tuple with a single field of type TYPE. + fn parse_ty_tuple_or_parens(&mut self, lo: Span, allow_plus: bool) -> PResult<'a, TyKind> { + let mut trailing_plus = false; + let (ts, trailing) = self.parse_paren_comma_seq(|p| { + let ty = p.parse_ty()?; + trailing_plus = p.prev_token_kind == PrevTokenKind::Plus; + Ok(ty) + })?; + + if ts.len() == 1 && !trailing { + let ty = ts.into_iter().nth(0).unwrap().into_inner(); + let maybe_bounds = allow_plus && self.token.is_like_plus(); + match ty.kind { + // `(TY_BOUND_NOPAREN) + BOUND + ...`. + TyKind::Path(None, path) if maybe_bounds => { + self.parse_remaining_bounds(Vec::new(), path, lo, true) + } + TyKind::TraitObject(mut bounds, TraitObjectSyntax::None) + if maybe_bounds && bounds.len() == 1 && !trailing_plus => { + let path = match bounds.remove(0) { + GenericBound::Trait(pt, ..) => pt.trait_ref.path, + GenericBound::Outlives(..) => self.bug("unexpected lifetime bound"), + }; + self.parse_remaining_bounds(Vec::new(), path, lo, true) + } + // `(TYPE)` + _ => Ok(TyKind::Paren(P(ty))) + } + } else { + Ok(TyKind::Tup(ts)) + } + } + + fn parse_remaining_bounds( + &mut self, + generic_params: Vec, + path: ast::Path, + lo: Span, + parse_plus: bool, + ) -> PResult<'a, TyKind> { let poly_trait_ref = PolyTraitRef::new(generic_params, path, lo.to(self.prev_span)); let mut bounds = vec![GenericBound::Trait(poly_trait_ref, TraitBoundModifier::None)]; if parse_plus { @@ -253,7 +199,8 @@ impl<'a> Parser<'a> { Ok(TyKind::TraitObject(bounds, TraitObjectSyntax::None)) } - fn parse_ptr(&mut self) -> PResult<'a, MutTy> { + /// Parses a raw pointer type: `*[const | mut] $type`. + fn parse_ty_ptr(&mut self) -> PResult<'a, TyKind> { let mutbl = self.parse_const_or_mut().unwrap_or_else(|| { let span = self.prev_span; let msg = "expected mut or const in raw pointer type"; @@ -263,23 +210,37 @@ impl<'a> Parser<'a> { .emit(); Mutability::Not }); - let t = self.parse_ty_no_plus()?; - Ok(MutTy { ty: t, mutbl }) + let ty = self.parse_ty_no_plus()?; + Ok(TyKind::Ptr(MutTy { ty, mutbl })) } - fn maybe_parse_fixed_length_of_vec(&mut self) -> PResult<'a, Option>> { - if self.eat(&token::Semi) { - Ok(Some(self.parse_expr()?)) + /// Parses an array (`[TYPE; EXPR]`) or slice (`[TYPE]`) type. + /// The opening `[` bracket is already eaten. + fn parse_array_or_slice_ty(&mut self) -> PResult<'a, TyKind> { + let elt_ty = self.parse_ty()?; + let ty = if self.eat(&token::Semi) { + TyKind::Array(elt_ty, self.parse_anon_const_expr()?) } else { - Ok(None) - } + TyKind::Slice(elt_ty) + }; + self.expect(&token::CloseDelim(token::Bracket))?; + Ok(ty) } fn parse_borrowed_pointee(&mut self) -> PResult<'a, TyKind> { let opt_lifetime = if self.check_lifetime() { Some(self.expect_lifetime()) } else { None }; let mutbl = self.parse_mutability(); let ty = self.parse_ty_no_plus()?; - return Ok(TyKind::Rptr(opt_lifetime, MutTy { ty, mutbl })); + Ok(TyKind::Rptr(opt_lifetime, MutTy { ty, mutbl })) + } + + // Parses the `typeof(EXPR)`. + // To avoid ambiguity, the type is surrounded by parenthesis. + fn parse_typeof_ty(&mut self) -> PResult<'a, TyKind> { + self.expect(&token::OpenDelim(token::Paren))?; + let expr = self.parse_anon_const_expr()?; + self.expect(&token::CloseDelim(token::Paren))?; + Ok(TyKind::Typeof(expr)) } /// Is the current token one of the keywords that signals a bare function type? @@ -289,20 +250,15 @@ impl<'a> Parser<'a> { self.check_keyword(kw::Extern) } - /// Parses a `TyKind::BareFn` type. + /// Parses a function pointer type (`TyKind::BareFn`). + /// ``` + /// [unsafe] [extern "ABI"] fn (S) -> T + /// ^~~~~^ ^~~~^ ^~^ ^ + /// | | | | + /// | | | Return type + /// Function Style ABI Parameter types + /// ``` fn parse_ty_bare_fn(&mut self, generic_params: Vec) -> PResult<'a, TyKind> { - /* - - [unsafe] [extern "ABI"] fn (S) -> T - ^~~~^ ^~~~^ ^~^ ^ - | | | | - | | | Return type - | | Argument types - | | - | ABI - Function Style - */ - let unsafety = self.parse_unsafety(); let ext = self.parse_extern()?; self.expect_keyword(kw::Fn)?; @@ -319,130 +275,241 @@ impl<'a> Parser<'a> { }))) } - pub(super) fn parse_generic_bounds(&mut self, - colon_span: Option) -> PResult<'a, GenericBounds> { + /// Parses an `impl B0 + ... + Bn` type. + fn parse_impl_ty(&mut self, impl_dyn_multi: &mut bool) -> PResult<'a, TyKind> { + // Always parse bounds greedily for better error recovery. + let bounds = self.parse_generic_bounds(None)?; + *impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus; + Ok(TyKind::ImplTrait(ast::DUMMY_NODE_ID, bounds)) + } + + /// Is a `dyn B0 + ... + Bn` type allowed here? + fn is_explicit_dyn_type(&mut self) -> bool { + self.check_keyword(kw::Dyn) + && (self.token.span.rust_2018() + || self.look_ahead(1, |t| { + t.can_begin_bound() && !can_continue_type_after_non_fn_ident(t) + })) + } + + /// Parses a `dyn B0 + ... + Bn` type. + /// + /// Note that this does *not* parse bare trait objects. + fn parse_dyn_ty(&mut self, impl_dyn_multi: &mut bool) -> PResult<'a, TyKind> { + self.bump(); // `dyn` + // Always parse bounds greedily for better error recovery. + let bounds = self.parse_generic_bounds(None)?; + *impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus; + Ok(TyKind::TraitObject(bounds, TraitObjectSyntax::Dyn)) + } + + /// Parses a type starting with a path. + /// + /// This can be: + /// 1. a type macro, `mac!(...)`, + /// 2. a bare trait object, `B0 + ... + Bn`, + /// 3. or a path, `path::to::MyType`. + fn parse_path_start_ty(&mut self, lo: Span, allow_plus: bool) -> PResult<'a, TyKind> { + // Simple path + let path = self.parse_path(PathStyle::Type)?; + if self.eat(&token::Not) { + // Macro invocation in type position + Ok(TyKind::Mac(Mac { + path, + args: self.parse_mac_args()?, + prior_type_ascription: self.last_type_ascription, + })) + } else if allow_plus && self.check_plus() { + // `Trait1 + Trait2 + 'a` + self.parse_remaining_bounds(Vec::new(), path, lo, true) + } else { + // Just a type path. + Ok(TyKind::Path(None, path)) + } + } + + fn error_illegal_c_varadic_ty(&self, lo: Span) { + struct_span_err!( + self.sess.span_diagnostic, + lo.to(self.prev_span), + E0743, + "C-variadic type `...` may not be nested inside another type", + ) + .emit(); + } + + pub(super) fn parse_generic_bounds( + &mut self, + colon_span: Option, + ) -> PResult<'a, GenericBounds> { self.parse_generic_bounds_common(true, colon_span) } /// Parses bounds of a type parameter `BOUND + BOUND + ...`, possibly with trailing `+`. /// - /// ``` - /// BOUND = TY_BOUND | LT_BOUND - /// LT_BOUND = LIFETIME (e.g., `'a`) - /// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) - /// TY_BOUND_NOPAREN = [?] [for] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`) - /// ``` - fn parse_generic_bounds_common(&mut self, - allow_plus: bool, - colon_span: Option) -> PResult<'a, GenericBounds> { + /// See `parse_generic_bound` for the `BOUND` grammar. + fn parse_generic_bounds_common( + &mut self, + allow_plus: bool, + colon_span: Option, + ) -> PResult<'a, GenericBounds> { let mut bounds = Vec::new(); let mut negative_bounds = Vec::new(); - let mut last_plus_span = None; - let mut was_negative = false; - loop { - // This needs to be synchronized with `TokenKind::can_begin_bound`. - let is_bound_start = self.check_path() || self.check_lifetime() || - self.check(&token::Not) || // used for error reporting only - self.check(&token::Question) || - self.check_keyword(kw::For) || - self.check(&token::OpenDelim(token::Paren)); - if is_bound_start { - let lo = self.token.span; - let has_parens = self.eat(&token::OpenDelim(token::Paren)); - let inner_lo = self.token.span; - let is_negative = self.eat(&token::Not); - let question = if self.eat(&token::Question) { Some(self.prev_span) } else { None }; - if self.token.is_lifetime() { - if let Some(question_span) = question { - self.span_err(question_span, - "`?` may only modify trait bounds, not lifetime bounds"); - } - bounds.push(GenericBound::Outlives(self.expect_lifetime())); - if has_parens { - let inner_span = inner_lo.to(self.prev_span); - self.expect(&token::CloseDelim(token::Paren))?; - let mut err = self.struct_span_err( - lo.to(self.prev_span), - "parenthesized lifetime bounds are not supported" - ); - if let Ok(snippet) = self.span_to_snippet(inner_span) { - err.span_suggestion_short( - lo.to(self.prev_span), - "remove the parentheses", - snippet.to_owned(), - Applicability::MachineApplicable - ); - } - err.emit(); - } - } else { - let lifetime_defs = self.parse_late_bound_lifetime_defs()?; - let path = self.parse_path(PathStyle::Type)?; - if has_parens { - self.expect(&token::CloseDelim(token::Paren))?; - } - let poly_span = lo.to(self.prev_span); - if is_negative { - was_negative = true; - if let Some(sp) = last_plus_span.or(colon_span) { - negative_bounds.push(sp.to(poly_span)); - } - } else { - let poly_trait = PolyTraitRef::new(lifetime_defs, path, poly_span); - let modifier = if question.is_some() { - TraitBoundModifier::Maybe - } else { - TraitBoundModifier::None - }; - bounds.push(GenericBound::Trait(poly_trait, modifier)); - } - } - } else { - break + while self.can_begin_bound() { + match self.parse_generic_bound()? { + Ok(bound) => bounds.push(bound), + Err(neg_sp) => negative_bounds.push(neg_sp), } - if !allow_plus || !self.eat_plus() { break - } else { - last_plus_span = Some(self.prev_span); } } - if !negative_bounds.is_empty() || was_negative { - let negative_bounds_len = negative_bounds.len(); - let last_span = negative_bounds.last().map(|sp| *sp); - let mut err = self.struct_span_err( - negative_bounds, - "negative trait bounds are not supported", - ); - if let Some(sp) = last_span { - err.span_label(sp, "negative trait bounds are not supported"); - } - if let Some(bound_list) = colon_span { - let bound_list = bound_list.to(self.prev_span); - let mut new_bound_list = String::new(); - if !bounds.is_empty() { - let mut snippets = bounds.iter().map(|bound| bound.span()) - .map(|span| self.span_to_snippet(span)); - while let Some(Ok(snippet)) = snippets.next() { - new_bound_list.push_str(" + "); - new_bound_list.push_str(&snippet); - } - new_bound_list = new_bound_list.replacen(" +", ":", 1); + if !negative_bounds.is_empty() { + self.error_negative_bounds(colon_span, &bounds, negative_bounds); + } + + Ok(bounds) + } + + /// Can the current token begin a bound? + fn can_begin_bound(&mut self) -> bool { + // This needs to be synchronized with `TokenKind::can_begin_bound`. + self.check_path() + || self.check_lifetime() + || self.check(&token::Not) // Used for error reporting only. + || self.check(&token::Question) + || self.check_keyword(kw::For) + || self.check(&token::OpenDelim(token::Paren)) + } + + fn error_negative_bounds( + &self, + colon_span: Option, + bounds: &[GenericBound], + negative_bounds: Vec, + ) { + let negative_bounds_len = negative_bounds.len(); + let last_span = *negative_bounds.last().expect("no negative bounds, but still error?"); + let mut err = self.struct_span_err( + negative_bounds, + "negative bounds are not supported", + ); + err.span_label(last_span, "negative bounds are not supported"); + if let Some(bound_list) = colon_span { + let bound_list = bound_list.to(self.prev_span); + let mut new_bound_list = String::new(); + if !bounds.is_empty() { + let mut snippets = bounds.iter().map(|bound| self.span_to_snippet(bound.span())); + while let Some(Ok(snippet)) = snippets.next() { + new_bound_list.push_str(" + "); + new_bound_list.push_str(&snippet); } - err.span_suggestion_hidden( - bound_list, - &format!("remove the trait bound{}", pluralize!(negative_bounds_len)), - new_bound_list, - Applicability::MachineApplicable, - ); + new_bound_list = new_bound_list.replacen(" +", ":", 1); } - err.emit(); + err.tool_only_span_suggestion( + bound_list, + &format!("remove the bound{}", pluralize!(negative_bounds_len)), + new_bound_list, + Applicability::MachineApplicable, + ); } + err.emit(); + } - return Ok(bounds); + /// Parses a bound according to the grammar: + /// ``` + /// BOUND = TY_BOUND | LT_BOUND + /// ``` + fn parse_generic_bound(&mut self) -> PResult<'a, Result> { + let anchor_lo = self.prev_span; + let lo = self.token.span; + let has_parens = self.eat(&token::OpenDelim(token::Paren)); + let inner_lo = self.token.span; + let is_negative = self.eat(&token::Not); + let question = self.eat(&token::Question).then_some(self.prev_span); + let bound = if self.token.is_lifetime() { + self.parse_generic_lt_bound(lo, inner_lo, has_parens, question)? + } else { + self.parse_generic_ty_bound(lo, has_parens, question)? + }; + Ok(if is_negative { + Err(anchor_lo.to(self.prev_span)) + } else { + Ok(bound) + }) + } + + /// Parses a lifetime ("outlives") bound, e.g. `'a`, according to: + /// ``` + /// LT_BOUND = LIFETIME + /// ``` + fn parse_generic_lt_bound( + &mut self, + lo: Span, + inner_lo: Span, + has_parens: bool, + question: Option, + ) -> PResult<'a, GenericBound> { + self.error_opt_out_lifetime(question); + let bound = GenericBound::Outlives(self.expect_lifetime()); + if has_parens { + // FIXME(Centril): Consider not erroring here and accepting `('lt)` instead, + // possibly introducing `GenericBound::Paren(P)`? + self.recover_paren_lifetime(lo, inner_lo)?; + } + Ok(bound) + } + + fn error_opt_out_lifetime(&self, question: Option) { + if let Some(span) = question { + self.struct_span_err(span, "`?` may only modify trait bounds, not lifetime bounds") + .emit(); + } + } + + /// Recover on `('lifetime)` with `(` already eaten. + fn recover_paren_lifetime(&mut self, lo: Span, inner_lo: Span) -> PResult<'a, ()> { + let inner_span = inner_lo.to(self.prev_span); + self.expect(&token::CloseDelim(token::Paren))?; + let mut err = self.struct_span_err( + lo.to(self.prev_span), + "parenthesized lifetime bounds are not supported" + ); + if let Ok(snippet) = self.span_to_snippet(inner_span) { + err.span_suggestion_short( + lo.to(self.prev_span), + "remove the parentheses", + snippet.to_owned(), + Applicability::MachineApplicable + ); + } + err.emit(); + Ok(()) + } + + /// Parses a type bound according to: + /// ``` + /// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) + /// TY_BOUND_NOPAREN = [?] [for] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`) + /// ``` + fn parse_generic_ty_bound( + &mut self, + lo: Span, + has_parens: bool, + question: Option, + ) -> PResult<'a, GenericBound> { + let lifetime_defs = self.parse_late_bound_lifetime_defs()?; + let path = self.parse_path(PathStyle::Type)?; + if has_parens { + self.expect(&token::CloseDelim(token::Paren))?; + } + let poly_trait = PolyTraitRef::new(lifetime_defs, path, lo.to(self.prev_span)); + let modifier = question.map_or(TraitBoundModifier::None, |_| TraitBoundModifier::Maybe); + Ok(GenericBound::Trait(poly_trait, modifier)) } + /// Optionally parses `for<$generic_params>`. pub(super) fn parse_late_bound_lifetime_defs(&mut self) -> PResult<'a, Vec> { if self.eat_keyword(kw::For) { self.expect_lt()?; diff --git a/src/librustc_tsan/lib.rs b/src/librustc_tsan/lib.rs index d6c8e54c18db7..4c8c9d15d5629 100644 --- a/src/librustc_tsan/lib.rs +++ b/src/librustc_tsan/lib.rs @@ -5,4 +5,4 @@ #![no_std] #![unstable(feature = "sanitizer_runtime_lib", reason = "internal implementation detail of sanitizers", - issue = "0")] + issue = "none")] diff --git a/src/librustc_typeck/check/pat.rs b/src/librustc_typeck/check/pat.rs index 11f744e97614c..ec6439c6d7729 100644 --- a/src/librustc_typeck/check/pat.rs +++ b/src/librustc_typeck/check/pat.rs @@ -1174,47 +1174,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { def_bm: BindingMode, discrim_span: Option, ) -> Ty<'tcx> { - let tcx = self.tcx; - let expected_ty = self.structurally_resolved_type(span, expected); - let (inner_ty, slice_ty) = match expected_ty.kind { + let err = self.tcx.types.err; + let expected = self.structurally_resolved_type(span, expected); + let (inner_ty, slice_ty, expected) = match expected.kind { // An array, so we might have something like `let [a, b, c] = [0, 1, 2];`. - ty::Array(inner_ty, size) => { - let slice_ty = if let Some(size) = size.try_eval_usize(tcx, self.param_env) { - // Now we know the length... - let min_len = before.len() as u64 + after.len() as u64; - if slice.is_none() { - // ...and since there is no variable-length pattern, - // we require an exact match between the number of elements - // in the array pattern and as provided by the matched type. - if min_len != size { - self.error_scrutinee_inconsistent_length(span, min_len, size) - } - tcx.types.err - } else if let Some(rest) = size.checked_sub(min_len) { - // The variable-length pattern was there, - // so it has an array type with the remaining elements left as its size... - tcx.mk_array(inner_ty, rest) - } else { - // ...however, in this case, there were no remaining elements. - // That is, the slice pattern requires more than the array type offers. - self.error_scrutinee_with_rest_inconsistent_length(span, min_len, size); - tcx.types.err - } - } else { - // No idea what the length is, which happens if we have e.g., - // `let [a, b] = arr` where `arr: [T; N]` where `const N: usize`. - self.error_scrutinee_unfixed_length(span); - tcx.types.err - }; - (inner_ty, slice_ty) + ty::Array(inner_ty, len) => { + let min = before.len() as u64 + after.len() as u64; + let slice_ty = self.check_array_pat_len(span, slice, len, min) + .map_or(err, |len| self.tcx.mk_array(inner_ty, len)); + (inner_ty, slice_ty, expected) } - ty::Slice(inner_ty) => (inner_ty, expected_ty), + ty::Slice(inner_ty) => (inner_ty, expected, expected), // The expected type must be an array or slice, but was neither, so error. _ => { - if !expected_ty.references_error() { - self.error_expected_array_or_slice(span, expected_ty); + if !expected.references_error() { + self.error_expected_array_or_slice(span, expected); } - (tcx.types.err, tcx.types.err) + (err, err, err) } }; @@ -1230,7 +1206,44 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { for elt in after { self.check_pat(&elt, inner_ty, def_bm, discrim_span); } - expected_ty + expected + } + + /// Type check the length of an array pattern. + /// + /// Return the length of the variable length pattern, + /// if it exists and there are no errors. + fn check_array_pat_len( + &self, + span: Span, + slice: Option<&'tcx Pat>, + len: &ty::Const<'tcx>, + min_len: u64, + ) -> Option { + if let Some(len) = len.try_eval_usize(self.tcx, self.param_env) { + // Now we know the length... + if slice.is_none() { + // ...and since there is no variable-length pattern, + // we require an exact match between the number of elements + // in the array pattern and as provided by the matched type. + if min_len != len { + self.error_scrutinee_inconsistent_length(span, min_len, len); + } + } else if let r @ Some(_) = len.checked_sub(min_len) { + // The variable-length pattern was there, + // so it has an array type with the remaining elements left as its size... + return r; + } else { + // ...however, in this case, there were no remaining elements. + // That is, the slice pattern requires more than the array type offers. + self.error_scrutinee_with_rest_inconsistent_length(span, min_len, len); + } + } else { + // No idea what the length is, which happens if we have e.g., + // `let [a, b] = arr` where `arr: [T; N]` where `const N: usize`. + self.error_scrutinee_unfixed_length(span); + } + None } fn error_scrutinee_inconsistent_length(&self, span: Span, min_len: u64, size: u64) { diff --git a/src/libstd/alloc.rs b/src/libstd/alloc.rs index ff52974775b05..eccf8cabf2206 100644 --- a/src/libstd/alloc.rs +++ b/src/libstd/alloc.rs @@ -205,7 +205,7 @@ fn default_alloc_error_hook(layout: Layout) { #[cfg(not(test))] #[doc(hidden)] #[alloc_error_handler] -#[unstable(feature = "alloc_internals", issue = "0")] +#[unstable(feature = "alloc_internals", issue = "none")] pub fn rust_oom(layout: Layout) -> ! { let hook = HOOK.load(Ordering::SeqCst); let hook: fn(Layout) = if hook.is_null() { @@ -220,7 +220,7 @@ pub fn rust_oom(layout: Layout) -> ! { #[cfg(not(test))] #[doc(hidden)] #[allow(unused_attributes)] -#[unstable(feature = "alloc_internals", issue = "0")] +#[unstable(feature = "alloc_internals", issue = "none")] pub mod __default_lib_allocator { use super::{System, Layout, GlobalAlloc}; // These magic symbol names are used as a fallback for implementing the diff --git a/src/libstd/ffi/c_str.rs b/src/libstd/ffi/c_str.rs index 05008958ed2f0..48ebb77cfb379 100644 --- a/src/libstd/ffi/c_str.rs +++ b/src/libstd/ffi/c_str.rs @@ -1065,7 +1065,7 @@ impl CStr { /// ``` #[inline] #[stable(feature = "cstr_from_bytes", since = "1.10.0")] - #[rustc_const_unstable(feature = "const_cstr_unchecked", issue = "0")] + #[rustc_const_unstable(feature = "const_cstr_unchecked", issue = "none")] pub const unsafe fn from_bytes_with_nul_unchecked(bytes: &[u8]) -> &CStr { &*(bytes as *const [u8] as *const CStr) } diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index a1a33bade0d7c..587ac24326742 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -280,7 +280,7 @@ pub use self::error::{Error, ErrorKind, Result}; pub use self::stdio::{stderr, stdin, stdout, Stderr, Stdin, Stdout}; #[stable(feature = "rust1", since = "1.0.0")] pub use self::stdio::{StderrLock, StdinLock, StdoutLock}; -#[unstable(feature = "print_internals", issue = "0")] +#[unstable(feature = "print_internals", issue = "none")] pub use self::stdio::{_eprint, _print}; #[unstable(feature = "libstd_io_internals", issue = "42788")] #[doc(no_inline, hidden)] diff --git a/src/libstd/io/stdio.rs b/src/libstd/io/stdio.rs index 6574ef13db953..4aa35884fb487 100644 --- a/src/libstd/io/stdio.rs +++ b/src/libstd/io/stdio.rs @@ -723,7 +723,7 @@ impl fmt::Debug for StderrLock<'_> { #[unstable(feature = "set_stdio", reason = "this function may disappear completely or be replaced \ with a more general mechanism", - issue = "0")] + issue = "none")] #[doc(hidden)] pub fn set_panic(sink: Option>) -> Option> { use crate::mem; @@ -746,7 +746,7 @@ pub fn set_panic(sink: Option>) -> Option>) -> Option> { use crate::mem; @@ -795,7 +795,7 @@ where #[unstable(feature = "print_internals", reason = "implementation detail which may disappear or be replaced at any time", - issue = "0")] + issue = "none")] #[doc(hidden)] #[cfg(not(test))] pub fn _print(args: fmt::Arguments<'_>) { @@ -804,7 +804,7 @@ pub fn _print(args: fmt::Arguments<'_>) { #[unstable(feature = "print_internals", reason = "implementation detail which may disappear or be replaced at any time", - issue = "0")] + issue = "none")] #[doc(hidden)] #[cfg(not(test))] pub fn _eprint(args: fmt::Arguments<'_>) { diff --git a/src/libstd/panic.rs b/src/libstd/panic.rs index ac8e0daf766bf..6ad5519d34aa9 100644 --- a/src/libstd/panic.rs +++ b/src/libstd/panic.rs @@ -205,7 +205,7 @@ impl UnwindSafe for &T {} impl UnwindSafe for *const T {} #[stable(feature = "catch_unwind", since = "1.9.0")] impl UnwindSafe for *mut T {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl UnwindSafe for Unique {} #[stable(feature = "nonnull", since = "1.25.0")] impl UnwindSafe for NonNull {} diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs index c028ddcd676fc..886acf1f95d13 100644 --- a/src/libstd/panicking.rs +++ b/src/libstd/panicking.rs @@ -214,7 +214,7 @@ fn default_hook(info: &PanicInfo<'_>) { #[cfg(not(test))] #[doc(hidden)] -#[unstable(feature = "update_panic_count", issue = "0")] +#[unstable(feature = "update_panic_count", issue = "none")] pub fn update_panic_count(amt: isize) -> usize { use crate::cell::Cell; thread_local! { static PANIC_COUNT: Cell = Cell::new(0) } @@ -307,7 +307,7 @@ pub fn panicking() -> bool { /// the actual formatting into this shared place. #[unstable(feature = "libstd_sys_internals", reason = "used by the panic! macro", - issue = "0")] + issue = "none")] #[cold] // If panic_immediate_abort, inline the abort call, // otherwise avoid inlining because of it is cold path. @@ -383,7 +383,7 @@ pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! { /// arbitrary payloads, not just format strings. #[unstable(feature = "libstd_sys_internals", reason = "used by the panic! macro", - issue = "0")] + issue = "none")] #[cfg_attr(not(test), lang = "begin_panic")] // lang item for CTFE panic support // never inline unless panic_immediate_abort to avoid code // bloat at the call sites as much as possible diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 1ed984509d27c..2426b2dead712 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -10,7 +10,7 @@ feature = "rt", reason = "this public module should not exist and is highly likely \ to disappear", - issue = "0" + issue = "none" )] #![doc(hidden)] diff --git a/src/libstd/sys/hermit/fast_thread_local.rs b/src/libstd/sys/hermit/fast_thread_local.rs index 05464787a05d3..1108e2545bdeb 100644 --- a/src/libstd/sys/hermit/fast_thread_local.rs +++ b/src/libstd/sys/hermit/fast_thread_local.rs @@ -1,4 +1,4 @@ #![cfg(target_thread_local)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] pub use crate::sys_common::thread_local::register_dtor_fallback as register_dtor; diff --git a/src/libstd/sys/hermit/fd.rs b/src/libstd/sys/hermit/fd.rs index f2f61fdfb8cc6..97d1a38b41ab1 100644 --- a/src/libstd/sys/hermit/fd.rs +++ b/src/libstd/sys/hermit/fd.rs @@ -1,4 +1,4 @@ -#![unstable(reason = "not public", issue = "0", feature = "fd")] +#![unstable(reason = "not public", issue = "none", feature = "fd")] use crate::io::{self, ErrorKind, Read}; use crate::mem; diff --git a/src/libstd/sys/mod.rs b/src/libstd/sys/mod.rs index 9eeab34643f93..875ff1af92013 100644 --- a/src/libstd/sys/mod.rs +++ b/src/libstd/sys/mod.rs @@ -69,7 +69,7 @@ cfg_if::cfg_if! { // On CloudABI and wasm right now the module below doesn't compile // (missing things in `libc` which is empty) so just omit everything // with an empty module - #[unstable(issue = "0", feature = "std_internals")] + #[unstable(issue = "none", feature = "std_internals")] #[allow(missing_docs)] pub mod unix_ext {} } else { @@ -92,7 +92,7 @@ cfg_if::cfg_if! { all(target_vendor = "fortanix", target_env = "sgx")))] { // On CloudABI and wasm right now the shim below doesn't compile, so // just omit it - #[unstable(issue = "0", feature = "std_internals")] + #[unstable(issue = "none", feature = "std_internals")] #[allow(missing_docs)] pub mod windows_ext {} } else { diff --git a/src/libstd/sys/unix/fast_thread_local.rs b/src/libstd/sys/unix/fast_thread_local.rs index 0861432f8a923..8730b4de8bed2 100644 --- a/src/libstd/sys/unix/fast_thread_local.rs +++ b/src/libstd/sys/unix/fast_thread_local.rs @@ -1,5 +1,5 @@ #![cfg(target_thread_local)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] // Since what appears to be glibc 2.18 this symbol has been shipped which // GCC and clang both use to invoke destructors in thread_local globals, so diff --git a/src/libstd/sys/unix/fd.rs b/src/libstd/sys/unix/fd.rs index 53b50763fbf2e..8a99836912a33 100644 --- a/src/libstd/sys/unix/fd.rs +++ b/src/libstd/sys/unix/fd.rs @@ -1,4 +1,4 @@ -#![unstable(reason = "not public", issue = "0", feature = "fd")] +#![unstable(reason = "not public", issue = "none", feature = "fd")] use crate::cmp; use crate::io::{self, Initializer, IoSlice, IoSliceMut, Read}; diff --git a/src/libstd/sys/vxworks/fast_thread_local.rs b/src/libstd/sys/vxworks/fast_thread_local.rs index 387ebd0520a71..098668cf521dd 100644 --- a/src/libstd/sys/vxworks/fast_thread_local.rs +++ b/src/libstd/sys/vxworks/fast_thread_local.rs @@ -1,5 +1,5 @@ #![cfg(target_thread_local)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) { use crate::sys_common::thread_local::register_dtor_fallback; diff --git a/src/libstd/sys/vxworks/fd.rs b/src/libstd/sys/vxworks/fd.rs index 9b649aa7ef45f..65c67dabc1ad0 100644 --- a/src/libstd/sys/vxworks/fd.rs +++ b/src/libstd/sys/vxworks/fd.rs @@ -1,4 +1,4 @@ -#![unstable(reason = "not public", issue = "0", feature = "fd")] +#![unstable(reason = "not public", issue = "none", feature = "fd")] use crate::cmp; use crate::io::{self, Initializer, IoSlice, IoSliceMut, Read}; diff --git a/src/libstd/sys/wasi/ext/fs.rs b/src/libstd/sys/wasi/ext/fs.rs index 92d0e60c07e83..6696efa8871c2 100644 --- a/src/libstd/sys/wasi/ext/fs.rs +++ b/src/libstd/sys/wasi/ext/fs.rs @@ -1,6 +1,6 @@ //! WASI-specific extensions to primitives in the `std::fs` module. -#![unstable(feature = "wasi_ext", issue = "0")] +#![unstable(feature = "wasi_ext", issue = "none")] use crate::fs::{self, File, Metadata, OpenOptions}; use crate::io::{self, IoSlice, IoSliceMut}; diff --git a/src/libstd/sys/wasi/ext/io.rs b/src/libstd/sys/wasi/ext/io.rs index f678b71a2b9f0..be3c2d97a247e 100644 --- a/src/libstd/sys/wasi/ext/io.rs +++ b/src/libstd/sys/wasi/ext/io.rs @@ -1,6 +1,6 @@ //! WASI-specific extensions to general I/O primitives -#![unstable(feature = "wasi_ext", issue = "0")] +#![unstable(feature = "wasi_ext", issue = "none")] use crate::fs; use crate::io; diff --git a/src/libstd/sys/wasm/fast_thread_local.rs b/src/libstd/sys/wasm/fast_thread_local.rs index 3b0993fdb580e..9bdc26ae7d68c 100644 --- a/src/libstd/sys/wasm/fast_thread_local.rs +++ b/src/libstd/sys/wasm/fast_thread_local.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] pub unsafe fn register_dtor(_t: *mut u8, _dtor: unsafe extern fn(*mut u8)) { // FIXME: right now there is no concept of "thread exit", but this is likely diff --git a/src/libstd/sys/windows/c.rs b/src/libstd/sys/windows/c.rs index b1f9d9766f705..4cdac89a86405 100644 --- a/src/libstd/sys/windows/c.rs +++ b/src/libstd/sys/windows/c.rs @@ -2,7 +2,7 @@ #![allow(nonstandard_style)] #![cfg_attr(test, allow(dead_code))] -#![unstable(issue = "0", feature = "windows_c")] +#![unstable(issue = "none", feature = "windows_c")] use crate::os::raw::{c_int, c_uint, c_ulong, c_long, c_longlong, c_ushort, c_char}; use crate::ptr; diff --git a/src/libstd/sys/windows/ext/fs.rs b/src/libstd/sys/windows/ext/fs.rs index 7eaff226a7654..0462f889a8e54 100644 --- a/src/libstd/sys/windows/ext/fs.rs +++ b/src/libstd/sys/windows/ext/fs.rs @@ -504,17 +504,17 @@ impl MetadataExt for Metadata { /// On Windows, a symbolic link knows whether it is a file or directory. /// /// [`FileType`]: ../../../../std/fs/struct.FileType.html -#[unstable(feature = "windows_file_type_ext", issue = "0")] +#[unstable(feature = "windows_file_type_ext", issue = "none")] pub trait FileTypeExt { /// Returns `true` if this file type is a symbolic link that is also a directory. - #[unstable(feature = "windows_file_type_ext", issue = "0")] + #[unstable(feature = "windows_file_type_ext", issue = "none")] fn is_symlink_dir(&self) -> bool; /// Returns `true` if this file type is a symbolic link that is also a file. - #[unstable(feature = "windows_file_type_ext", issue = "0")] + #[unstable(feature = "windows_file_type_ext", issue = "none")] fn is_symlink_file(&self) -> bool; } -#[unstable(feature = "windows_file_type_ext", issue = "0")] +#[unstable(feature = "windows_file_type_ext", issue = "none")] impl FileTypeExt for fs::FileType { fn is_symlink_dir(&self) -> bool { self.as_inner().is_symlink_dir() diff --git a/src/libstd/sys/windows/fast_thread_local.rs b/src/libstd/sys/windows/fast_thread_local.rs index 31d0bd1e72ed2..191fa07f32a55 100644 --- a/src/libstd/sys/windows/fast_thread_local.rs +++ b/src/libstd/sys/windows/fast_thread_local.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] #![cfg(target_thread_local)] pub use crate::sys_common::thread_local::register_dtor_fallback as register_dtor; diff --git a/src/libstd/sys/windows/handle.rs b/src/libstd/sys/windows/handle.rs index ebaa0783d603d..fd0c2350cb3ae 100644 --- a/src/libstd/sys/windows/handle.rs +++ b/src/libstd/sys/windows/handle.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_handle")] +#![unstable(issue = "none", feature = "windows_handle")] use crate::cmp; use crate::io::{self, ErrorKind, IoSlice, IoSliceMut, Read}; diff --git a/src/libstd/sys/windows/net.rs b/src/libstd/sys/windows/net.rs index 2f2f285edc1c5..53e08d5000489 100644 --- a/src/libstd/sys/windows/net.rs +++ b/src/libstd/sys/windows/net.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_net")] +#![unstable(issue = "none", feature = "windows_net")] use crate::cmp; use crate::io::{self, Read, IoSlice, IoSliceMut}; @@ -395,7 +395,7 @@ impl Socket { } } -#[unstable(reason = "not public", issue = "0", feature = "fd_read")] +#[unstable(reason = "not public", issue = "none", feature = "fd_read")] impl<'a> Read for &'a Socket { fn read(&mut self, buf: &mut [u8]) -> io::Result { (**self).read(buf) diff --git a/src/libstd/sys/windows/process.rs b/src/libstd/sys/windows/process.rs index 096b7bea8a5f1..060997be97d23 100644 --- a/src/libstd/sys/windows/process.rs +++ b/src/libstd/sys/windows/process.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "process_internals", issue = "0")] +#![unstable(feature = "process_internals", issue = "none")] use crate::collections::BTreeMap; use crate::env::split_paths; diff --git a/src/libstd/sys/windows/stdio.rs b/src/libstd/sys/windows/stdio.rs index f322c2b1d96c9..c84896296ecb9 100644 --- a/src/libstd/sys/windows/stdio.rs +++ b/src/libstd/sys/windows/stdio.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_stdio")] +#![unstable(issue = "none", feature = "windows_stdio")] use crate::char::decode_utf16; use crate::cmp; diff --git a/src/libstd/sys/windows/stdio_uwp.rs b/src/libstd/sys/windows/stdio_uwp.rs index 0f2178f73532f..5bdabf6d4b78e 100644 --- a/src/libstd/sys/windows/stdio_uwp.rs +++ b/src/libstd/sys/windows/stdio_uwp.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_stdio")] +#![unstable(issue = "none", feature = "windows_stdio")] use crate::io; use crate::mem::ManuallyDrop; diff --git a/src/libstd/sys_common/process.rs b/src/libstd/sys_common/process.rs index 55b421794c413..042641852b3e9 100644 --- a/src/libstd/sys_common/process.rs +++ b/src/libstd/sys_common/process.rs @@ -1,5 +1,5 @@ #![allow(dead_code)] -#![unstable(feature = "process_internals", issue = "0")] +#![unstable(feature = "process_internals", issue = "none")] use crate::collections::BTreeMap; use crate::env; diff --git a/src/libstd/sys_common/thread_local.rs b/src/libstd/sys_common/thread_local.rs index bdf79002e906d..9596911fd4867 100644 --- a/src/libstd/sys_common/thread_local.rs +++ b/src/libstd/sys_common/thread_local.rs @@ -45,7 +45,7 @@ //! ``` #![allow(non_camel_case_types)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] #![allow(dead_code)] // sys isn't exported yet use crate::ptr; diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index 9c530e7b3248c..1dd942e252f6b 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -1,6 +1,6 @@ //! Thread local storage -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] use crate::error::Error; use crate::fmt; @@ -142,7 +142,7 @@ macro_rules! thread_local { } #[doc(hidden)] -#[unstable(feature = "thread_local_internals", reason = "should not be necessary", issue = "0")] +#[unstable(feature = "thread_local_internals", reason = "should not be necessary", issue = "none")] #[macro_export] #[allow_internal_unstable(thread_local_internals, cfg_target_thread_local, thread_local)] #[allow_internal_unsafe] @@ -215,7 +215,7 @@ impl LocalKey { #[unstable( feature = "thread_local_internals", reason = "recently added to create a key", - issue = "0" + issue = "none" )] pub const unsafe fn new(inner: unsafe fn() -> Option<&'static T>) -> LocalKey { LocalKey { inner } diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs index 0c632d2afbdd4..9df6af4c5d887 100644 --- a/src/libstd/thread/mod.rs +++ b/src/libstd/thread/mod.rs @@ -194,13 +194,13 @@ pub use self::local::{LocalKey, AccessError}; // where fast TLS was not available; end-user code is compiled with fast TLS // where available, but both are needed. -#[unstable(feature = "libstd_thread_internals", issue = "0")] +#[unstable(feature = "libstd_thread_internals", issue = "none")] #[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))] #[doc(hidden)] pub use self::local::statik::Key as __StaticLocalKeyInner; -#[unstable(feature = "libstd_thread_internals", issue = "0")] +#[unstable(feature = "libstd_thread_internals", issue = "none")] #[cfg(target_thread_local)] #[doc(hidden)] pub use self::local::fast::Key as __FastLocalKeyInner; -#[unstable(feature = "libstd_thread_internals", issue = "0")] +#[unstable(feature = "libstd_thread_internals", issue = "none")] #[doc(hidden)] pub use self::local::os::Key as __OsLocalKeyInner; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/libsyntax/attr/builtin.rs b/src/libsyntax/attr/builtin.rs index a37b27f67bcbd..d780d0ad76488 100644 --- a/src/libsyntax/attr/builtin.rs +++ b/src/libsyntax/attr/builtin.rs @@ -376,11 +376,11 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, match (feature, reason, issue) { (Some(feature), reason, Some(issue)) => { let issue = match &*issue.as_str() { - // FIXME(rossmacarthur): remove "0" because "none" should be used - // See #41260 - "none" | "0" => None, + "none" => None, issue => { if let Ok(num) = issue.parse() { + // FIXME(rossmacarthur): disallow 0 + // Disallowing this requires updates to some submodules NonZeroU32::new(num) } else { span_err!( diff --git a/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs b/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs index 2a977ed63b155..3dcfb9dadd804 100644 --- a/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs +++ b/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs @@ -1,5 +1,5 @@ #![crate_type = "lib"] #![feature(staged_api)] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] pub fn baz() {} diff --git a/src/test/rustdoc/const-display.rs b/src/test/rustdoc/const-display.rs index bc7ad04b6a2fa..8e0d230f7d010 100644 --- a/src/test/rustdoc/const-display.rs +++ b/src/test/rustdoc/const-display.rs @@ -2,18 +2,18 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(foo, foo2)] #![feature(staged_api)] // @has 'foo/fn.foo.html' '//pre' 'pub unsafe fn foo() -> u32' #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] pub const unsafe fn foo() -> u32 { 42 } // @has 'foo/fn.foo2.html' '//pre' 'pub fn foo2() -> u32' -#[unstable(feature = "humans", issue="0")] +#[unstable(feature = "humans", issue = "none")] pub const fn foo2() -> u32 { 42 } // @has 'foo/fn.bar2.html' '//pre' 'pub const fn bar2() -> u32' @@ -22,7 +22,7 @@ pub const fn foo2() -> u32 { 42 } pub const fn bar2() -> u32 { 42 } // @has 'foo/fn.foo2_gated.html' '//pre' 'pub unsafe fn foo2_gated() -> u32' -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] pub const unsafe fn foo2_gated() -> u32 { 42 } // @has 'foo/fn.bar2_gated.html' '//pre' 'pub const unsafe fn bar2_gated() -> u32' diff --git a/src/test/rustdoc/inline_cross/auxiliary/macros.rs b/src/test/rustdoc/inline_cross/auxiliary/macros.rs index 6189b018037ea..2165be9745229 100644 --- a/src/test/rustdoc/inline_cross/auxiliary/macros.rs +++ b/src/test/rustdoc/inline_cross/auxiliary/macros.rs @@ -3,7 +3,7 @@ #![stable(feature = "rust1", since = "1.0.0")] /// docs for my_macro -#[unstable(feature = "macro_test", issue = "0")] +#[unstable(feature = "macro_test", issue = "none")] #[rustc_deprecated(since = "1.2.3", reason = "text")] #[macro_export] macro_rules! my_macro { diff --git a/src/test/rustdoc/stability.rs b/src/test/rustdoc/stability.rs index 18a21603493c2..b1b97fe134e4c 100644 --- a/src/test/rustdoc/stability.rs +++ b/src/test/rustdoc/stability.rs @@ -1,6 +1,6 @@ #![feature(staged_api)] -#![unstable(feature = "test", issue = "0")] +#![unstable(feature = "test", issue = "none")] pub struct Unstable { // @has stability/struct.Unstable.html \ diff --git a/src/test/ui/auxiliary/stability-cfg2.rs b/src/test/ui/auxiliary/stability-cfg2.rs index 8a2899584b903..c995038e5a8a7 100644 --- a/src/test/ui/auxiliary/stability-cfg2.rs +++ b/src/test/ui/auxiliary/stability-cfg2.rs @@ -1,5 +1,5 @@ // compile-flags:--cfg foo -#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "0"))] +#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "none"))] #![cfg_attr(not(foo), stable(feature = "test_feature", since = "1.0.0"))] #![feature(staged_api)] diff --git a/src/test/ui/consts/const-eval/auxiliary/stability.rs b/src/test/ui/consts/const-eval/auxiliary/stability.rs index 830db55207f1c..70531114f21dc 100644 --- a/src/test/ui/consts/const-eval/auxiliary/stability.rs +++ b/src/test/ui/consts/const-eval/auxiliary/stability.rs @@ -7,5 +7,5 @@ #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] pub const fn foo() -> u32 { 42 } diff --git a/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs b/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs index c4b89b50bc4ad..3729285956b4c 100644 --- a/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs +++ b/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const fn foo() -> u32 { 42 } fn meh() -> u32 { 42 } diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs b/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs index 97e467aece233..df10f3496c3c8 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs +++ b/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn, foo, foo2)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const fn foo() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -15,7 +15,7 @@ const fn foo() -> u32 { 42 } // can't call non-min_const_fn const fn bar() -> u32 { foo() } //~ ERROR can only call other `const fn` -#[unstable(feature = "rust1", issue="0")] +#[unstable(feature = "rust1", issue = "none")] const fn foo2() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -29,7 +29,7 @@ const fn bar2() -> u32 { foo2() } //~ ERROR can only call other `const fn` const fn bar3() -> u32 { (5f32 + 6f32) as u32 } //~ ERROR only int, `bool` and `char` operations // check whether this function cannot be called even with the feature gate active -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] const fn foo2_gated() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs index 102b380144113..12b41ee2b0d6a 100644 --- a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs +++ b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn, foo, foo2)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const unsafe fn foo() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -15,7 +15,7 @@ const unsafe fn foo() -> u32 { 42 } // can't call non-min_const_fn const unsafe fn bar() -> u32 { unsafe { foo() } } //~ ERROR can only call other `const fn` -#[unstable(feature = "rust1", issue="0")] +#[unstable(feature = "rust1", issue = "none")] const unsafe fn foo2() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -29,7 +29,7 @@ const unsafe fn bar2() -> u32 { unsafe { foo2() } } //~ ERROR can only call othe const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 } //~ ERROR only int, `bool` and `char` op // check whether this function cannot be called even with the feature gate active -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] const unsafe fn foo2_gated() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs index 121177f836654..44a6209498737 100644 --- a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs +++ b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn, foo, foo2)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const fn foo() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -15,7 +15,7 @@ const fn foo() -> u32 { 42 } // can't call non-min_const_fn const unsafe fn bar() -> u32 { foo() } //~ ERROR can only call other `const fn` -#[unstable(feature = "rust1", issue="0")] +#[unstable(feature = "rust1", issue = "none")] const fn foo2() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -24,7 +24,7 @@ const fn foo2() -> u32 { 42 } const unsafe fn bar2() -> u32 { foo2() } //~ ERROR can only call other `const fn` // check whether this function cannot be called even with the feature gate active -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] const fn foo2_gated() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/consts/unstable-const-fn-in-libcore.rs b/src/test/ui/consts/unstable-const-fn-in-libcore.rs index 655ad7b548a30..0b64786ccce54 100644 --- a/src/test/ui/consts/unstable-const-fn-in-libcore.rs +++ b/src/test/ui/consts/unstable-const-fn-in-libcore.rs @@ -14,7 +14,7 @@ enum Opt { } impl Opt { - #[rustc_const_unstable(feature = "foo", issue = "0")] + #[rustc_const_unstable(feature = "foo", issue = "none")] #[stable(feature = "rust1", since = "1.0.0")] const fn unwrap_or_else T>(self, f: F) -> T { //~^ ERROR destructors cannot be evaluated at compile-time diff --git a/src/test/ui/feature-gate/stability-attribute-consistency.rs b/src/test/ui/feature-gate/stability-attribute-consistency.rs index caafd8b885475..6ee7003c31ef7 100644 --- a/src/test/ui/feature-gate/stability-attribute-consistency.rs +++ b/src/test/ui/feature-gate/stability-attribute-consistency.rs @@ -9,7 +9,7 @@ fn foo_stable_1_0_0() {} //~^ ERROR feature `foo` is declared stable since 1.29.0 fn foo_stable_1_29_0() {} -#[unstable(feature = "foo", issue = "0")] +#[unstable(feature = "foo", issue = "none")] //~^ ERROR feature `foo` is declared unstable fn foo_unstable() {} diff --git a/src/test/ui/feature-gate/stability-attribute-consistency.stderr b/src/test/ui/feature-gate/stability-attribute-consistency.stderr index 9b4b28a3922cb..d49b44c8a3586 100644 --- a/src/test/ui/feature-gate/stability-attribute-consistency.stderr +++ b/src/test/ui/feature-gate/stability-attribute-consistency.stderr @@ -7,8 +7,8 @@ LL | #[stable(feature = "foo", since = "1.29.0")] error[E0711]: feature `foo` is declared unstable, but was previously declared stable --> $DIR/stability-attribute-consistency.rs:12:1 | -LL | #[unstable(feature = "foo", issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[unstable(feature = "foo", issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs similarity index 84% rename from src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs rename to src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs index 3ce9de3fb1b46..c8ad0d13a1413 100644 --- a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs +++ b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs @@ -1,4 +1,4 @@ -// Check that an issue value can be explicitly set to "none" instead of "0" +// Check that an issue value can be explicitly set to "0" instead of "none" #![crate_type = "lib"] #![feature(staged_api)] #![stable(feature = "stable_test_feature", since = "1.0.0")] diff --git a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr similarity index 80% rename from src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr rename to src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr index fc031f5f8c5d1..10bd6f373d928 100644 --- a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr +++ b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr @@ -1,5 +1,5 @@ error[E0545]: incorrect 'issue' - --> $DIR/unstable-attribute-allow-issue-none.rs:12:1 + --> $DIR/unstable-attribute-allow-issue-0.rs:12:1 | LL | #[unstable(feature = "unstable_test_feature", issue = "something")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/internal/auxiliary/internal_unstable.rs b/src/test/ui/internal/auxiliary/internal_unstable.rs index 7c79dcb752272..148cbd1899eba 100644 --- a/src/test/ui/internal/auxiliary/internal_unstable.rs +++ b/src/test/ui/internal/auxiliary/internal_unstable.rs @@ -1,24 +1,24 @@ #![feature(staged_api, allow_internal_unstable)] #![stable(feature = "stable", since = "1.0.0")] -#[unstable(feature = "function", issue = "0")] +#[unstable(feature = "function", issue = "none")] pub fn unstable() {} #[stable(feature = "stable", since = "1.0.0")] pub struct Foo { - #[unstable(feature = "struct_field", issue = "0")] + #[unstable(feature = "struct_field", issue = "none")] pub x: u8 } impl Foo { - #[unstable(feature = "method", issue = "0")] + #[unstable(feature = "method", issue = "none")] pub fn method(&self) {} } #[stable(feature = "stable", since = "1.0.0")] pub struct Bar { - #[unstable(feature = "struct2_field", issue = "0")] + #[unstable(feature = "struct2_field", issue = "none")] pub x: u8 } diff --git a/src/test/ui/issues/auxiliary/issue-52489.rs b/src/test/ui/issues/auxiliary/issue-52489.rs index c649930c2b4d1..f53bf7db52536 100644 --- a/src/test/ui/issues/auxiliary/issue-52489.rs +++ b/src/test/ui/issues/auxiliary/issue-52489.rs @@ -1,3 +1,3 @@ #![crate_type = "lib"] -#![unstable(feature = "issue_52489_unstable", issue = "0")] +#![unstable(feature = "issue_52489_unstable", issue = "none")] #![feature(staged_api)] diff --git a/src/test/ui/issues/auxiliary/lint-stability.rs b/src/test/ui/issues/auxiliary/lint-stability.rs index 3188d706ab057..de4058887cffd 100644 --- a/src/test/ui/issues/auxiliary/lint-stability.rs +++ b/src/test/ui/issues/auxiliary/lint-stability.rs @@ -15,16 +15,16 @@ pub fn deprecated_text() {} #[rustc_deprecated(since = "99.99.99", reason = "text")] pub fn deprecated_future() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable_text() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} -#[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] +#[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -43,16 +43,16 @@ impl MethodTester { #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -70,16 +70,16 @@ pub trait Trait { #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -90,7 +90,7 @@ pub trait Trait { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub trait TraitWithAssociatedTypes { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] type TypeUnstable = u8; #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -100,7 +100,7 @@ pub trait TraitWithAssociatedTypes { #[stable(feature = "stable_test_feature", since = "1.0.0")] impl Trait for MethodTester {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub trait UnstableTrait { fn dummy(&self) { } } #[stable(feature = "stable_test_feature", since = "1.0.0")] @@ -114,12 +114,12 @@ pub trait DeprecatedTrait { pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } @@ -127,7 +127,7 @@ pub struct UnstableStruct { pub struct StableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub enum UnstableEnum {} #[stable(feature = "rust1", since = "1.0.0")] pub enum StableEnum {} @@ -135,10 +135,10 @@ pub enum StableEnum {} #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; @@ -148,10 +148,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedUnstableVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] @@ -161,10 +161,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); diff --git a/src/test/ui/issues/issue-17337.rs b/src/test/ui/issues/issue-17337.rs index 1126ab7a206d2..65f2f8fc5ac6c 100644 --- a/src/test/ui/issues/issue-17337.rs +++ b/src/test/ui/issues/issue-17337.rs @@ -1,12 +1,12 @@ #![feature(staged_api)] #![deny(deprecated)] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] struct Foo; impl Foo { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn foo(self) {} } diff --git a/src/test/ui/issues/issue-58857.rs b/src/test/ui/issues/issue-58857.rs index 392e4ea0c2ecc..4350d7e5b403b 100644 --- a/src/test/ui/issues/issue-58857.rs +++ b/src/test/ui/issues/issue-58857.rs @@ -2,6 +2,6 @@ struct Conj {a : A} trait Valid {} impl Conj{} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported fn main() {} diff --git a/src/test/ui/issues/issue-58857.stderr b/src/test/ui/issues/issue-58857.stderr index ab9a0130c00b0..e2acec47e5abf 100644 --- a/src/test/ui/issues/issue-58857.stderr +++ b/src/test/ui/issues/issue-58857.stderr @@ -1,10 +1,8 @@ -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-58857.rs:4:7 | LL | impl Conj{} - | ^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^ negative bounds are not supported error: aborting due to previous error diff --git a/src/test/ui/lint/auxiliary/inherited_stability.rs b/src/test/ui/lint/auxiliary/inherited_stability.rs index 57af0d3ec9ccf..1e7eb26fde272 100644 --- a/src/test/ui/lint/auxiliary/inherited_stability.rs +++ b/src/test/ui/lint/auxiliary/inherited_stability.rs @@ -1,6 +1,6 @@ #![crate_name="inherited_stability"] #![crate_type = "lib"] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] #![feature(staged_api)] pub fn unstable() {} @@ -10,14 +10,14 @@ pub fn stable() {} #[stable(feature = "rust1", since = "1.0.0")] pub mod stable_mod { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} #[stable(feature = "rust1", since = "1.0.0")] pub fn stable() {} } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub mod unstable_mod { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -28,7 +28,7 @@ pub mod unstable_mod { #[stable(feature = "rust1", since = "1.0.0")] pub trait Stable { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn unstable(&self); #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/lint/auxiliary/lint_output_format.rs b/src/test/ui/lint/auxiliary/lint_output_format.rs index 5facb556122ed..58cae180196d3 100644 --- a/src/test/ui/lint/auxiliary/lint_output_format.rs +++ b/src/test/ui/lint/auxiliary/lint_output_format.rs @@ -1,7 +1,7 @@ #![crate_name="lint_output_format"] #![crate_type = "lib"] #![feature(staged_api)] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -9,12 +9,12 @@ pub fn foo() -> usize { 20 } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn bar() -> usize { 40 } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn baz() -> usize { 30 } diff --git a/src/test/ui/lint/auxiliary/lint_stability.rs b/src/test/ui/lint/auxiliary/lint_stability.rs index 3188d706ab057..de4058887cffd 100644 --- a/src/test/ui/lint/auxiliary/lint_stability.rs +++ b/src/test/ui/lint/auxiliary/lint_stability.rs @@ -15,16 +15,16 @@ pub fn deprecated_text() {} #[rustc_deprecated(since = "99.99.99", reason = "text")] pub fn deprecated_future() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable_text() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} -#[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] +#[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -43,16 +43,16 @@ impl MethodTester { #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -70,16 +70,16 @@ pub trait Trait { #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -90,7 +90,7 @@ pub trait Trait { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub trait TraitWithAssociatedTypes { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] type TypeUnstable = u8; #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -100,7 +100,7 @@ pub trait TraitWithAssociatedTypes { #[stable(feature = "stable_test_feature", since = "1.0.0")] impl Trait for MethodTester {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub trait UnstableTrait { fn dummy(&self) { } } #[stable(feature = "stable_test_feature", since = "1.0.0")] @@ -114,12 +114,12 @@ pub trait DeprecatedTrait { pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } @@ -127,7 +127,7 @@ pub struct UnstableStruct { pub struct StableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub enum UnstableEnum {} #[stable(feature = "rust1", since = "1.0.0")] pub enum StableEnum {} @@ -135,10 +135,10 @@ pub enum StableEnum {} #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; @@ -148,10 +148,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedUnstableVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] @@ -161,10 +161,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); diff --git a/src/test/ui/lint/auxiliary/lint_stability_fields.rs b/src/test/ui/lint/auxiliary/lint_stability_fields.rs index 2787da7cb7109..0efe7686ef76a 100644 --- a/src/test/ui/lint/auxiliary/lint_stability_fields.rs +++ b/src/test/ui/lint/auxiliary/lint_stability_fields.rs @@ -5,47 +5,47 @@ pub struct Stable { #[stable(feature = "rust1", since = "1.0.0")] pub inherit: u8, // it's a lie (stable doesn't inherit) - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, } #[stable(feature = "rust1", since = "1.0.0")] pub struct Stable2(#[stable(feature = "rust1", since = "1.0.0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub u8, + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub u8); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct Unstable { pub inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] pub override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct Unstable2(pub u8, #[stable(feature = "rust1", since = "1.0.0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub u8); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct Deprecated { pub inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] pub override1: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct Deprecated2(pub u8, #[stable(feature = "rust1", since = "1.0.0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] pub u8); + #[unstable(feature = "unstable_test_feature", issue = "none")] pub u8); diff --git a/src/test/ui/lint/auxiliary/stability-cfg2.rs b/src/test/ui/lint/auxiliary/stability-cfg2.rs index 8a2899584b903..c995038e5a8a7 100644 --- a/src/test/ui/lint/auxiliary/stability-cfg2.rs +++ b/src/test/ui/lint/auxiliary/stability-cfg2.rs @@ -1,5 +1,5 @@ // compile-flags:--cfg foo -#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "0"))] +#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "none"))] #![cfg_attr(not(foo), stable(feature = "test_feature", since = "1.0.0"))] #![feature(staged_api)] diff --git a/src/test/ui/lint/auxiliary/stability_cfg2.rs b/src/test/ui/lint/auxiliary/stability_cfg2.rs index 8a2899584b903..c995038e5a8a7 100644 --- a/src/test/ui/lint/auxiliary/stability_cfg2.rs +++ b/src/test/ui/lint/auxiliary/stability_cfg2.rs @@ -1,5 +1,5 @@ // compile-flags:--cfg foo -#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "0"))] +#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "none"))] #![cfg_attr(not(foo), stable(feature = "test_feature", since = "1.0.0"))] #![feature(staged_api)] diff --git a/src/test/ui/lint/lint-shorthand-field.fixed b/src/test/ui/lint/lint-shorthand-field.fixed new file mode 100644 index 0000000000000..7cd5717bc5aac --- /dev/null +++ b/src/test/ui/lint/lint-shorthand-field.fixed @@ -0,0 +1,70 @@ +// run-rustfix + +#![allow(nonstandard_style, unused_variables, unused_mut)] +#![deny(non_shorthand_field_patterns)] + +struct Foo { + x: isize, + y: isize, +} + +fn main() { + { + let Foo { + x, //~ ERROR the `x:` in this pattern is redundant + ref y, //~ ERROR the `y:` in this pattern is redundant + } = Foo { x: 0, y: 0 }; + + let Foo { + x, + ref y, + } = Foo { x: 0, y: 0 }; + } + + { + const x: isize = 1; + + match (Foo { x: 1, y: 1 }) { + Foo { x: x, ..} => {}, + _ => {}, + } + } + + { + struct Bar { + x: x, + } + + struct x; + + match (Bar { x: x }) { + Bar { x: x } => {}, + } + } + + { + struct Bar { + x: Foo, + } + + enum Foo { x } + + match (Bar { x: Foo::x }) { + Bar { x: Foo::x } => {}, + } + } + + { + struct Baz { + x: isize, + y: isize, + z: isize, + } + + let Baz { + mut x, //~ ERROR the `x:` in this pattern is redundant + ref y, //~ ERROR the `y:` in this pattern is redundant + ref mut z, //~ ERROR the `z:` in this pattern is redundant + } = Baz { x: 0, y: 0, z: 0 }; + } +} diff --git a/src/test/ui/lint/lint-shorthand-field.rs b/src/test/ui/lint/lint-shorthand-field.rs index 5e756d14dc85e..22de9c3254590 100644 --- a/src/test/ui/lint/lint-shorthand-field.rs +++ b/src/test/ui/lint/lint-shorthand-field.rs @@ -1,4 +1,6 @@ -#![allow(nonstandard_style, unused_variables)] +// run-rustfix + +#![allow(nonstandard_style, unused_variables, unused_mut)] #![deny(non_shorthand_field_patterns)] struct Foo { @@ -51,4 +53,18 @@ fn main() { Bar { x: Foo::x } => {}, } } + + { + struct Baz { + x: isize, + y: isize, + z: isize, + } + + let Baz { + x: mut x, //~ ERROR the `x:` in this pattern is redundant + y: ref y, //~ ERROR the `y:` in this pattern is redundant + z: ref mut z, //~ ERROR the `z:` in this pattern is redundant + } = Baz { x: 0, y: 0, z: 0 }; + } } diff --git a/src/test/ui/lint/lint-shorthand-field.stderr b/src/test/ui/lint/lint-shorthand-field.stderr index 366ab55d7d4df..5c9b21ffdc7b7 100644 --- a/src/test/ui/lint/lint-shorthand-field.stderr +++ b/src/test/ui/lint/lint-shorthand-field.stderr @@ -1,24 +1,38 @@ error: the `x:` in this pattern is redundant - --> $DIR/lint-shorthand-field.rs:12:13 + --> $DIR/lint-shorthand-field.rs:14:13 | LL | x: x, - | --^^ - | | - | help: remove this + | ^^^^ help: use shorthand field pattern: `x` | note: lint level defined here - --> $DIR/lint-shorthand-field.rs:2:9 + --> $DIR/lint-shorthand-field.rs:4:9 | LL | #![deny(non_shorthand_field_patterns)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the `y:` in this pattern is redundant - --> $DIR/lint-shorthand-field.rs:13:13 + --> $DIR/lint-shorthand-field.rs:15:13 | LL | y: ref y, - | --^^^^^^ - | | - | help: remove this + | ^^^^^^^^ help: use shorthand field pattern: `ref y` -error: aborting due to 2 previous errors +error: the `x:` in this pattern is redundant + --> $DIR/lint-shorthand-field.rs:65:13 + | +LL | x: mut x, + | ^^^^^^^^ help: use shorthand field pattern: `mut x` + +error: the `y:` in this pattern is redundant + --> $DIR/lint-shorthand-field.rs:66:13 + | +LL | y: ref y, + | ^^^^^^^^ help: use shorthand field pattern: `ref y` + +error: the `z:` in this pattern is redundant + --> $DIR/lint-shorthand-field.rs:67:13 + | +LL | z: ref mut z, + | ^^^^^^^^^^^^ help: use shorthand field pattern: `ref mut z` + +error: aborting due to 5 previous errors diff --git a/src/test/ui/lint/lint-stability-2.rs b/src/test/ui/lint/lint-stability-2.rs index 53eee35a9ca24..2a4f95f555fd9 100644 --- a/src/test/ui/lint/lint-stability-2.rs +++ b/src/test/ui/lint/lint-stability-2.rs @@ -168,16 +168,16 @@ mod cross_crate { } mod this_crate { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_text() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -189,16 +189,16 @@ mod this_crate { pub struct MethodTester; impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -208,16 +208,16 @@ mod this_crate { } pub trait Trait { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -228,12 +228,12 @@ mod this_crate { impl Trait for MethodTester {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } @@ -242,29 +242,29 @@ mod this_crate { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; pub enum Enum { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] StableVariant, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(isize); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(isize); @@ -381,7 +381,7 @@ mod this_crate { foo.trait_stable(); } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_fn_body() { fn fn_in_body() {} @@ -389,7 +389,7 @@ mod this_crate { } impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_method_body(&self) { fn fn_in_body() {} @@ -397,7 +397,7 @@ mod this_crate { } } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub trait DeprecatedTrait { fn dummy(&self) { } diff --git a/src/test/ui/lint/lint-stability-deprecated.rs b/src/test/ui/lint/lint-stability-deprecated.rs index 5e747467a127e..0585fec99b418 100644 --- a/src/test/ui/lint/lint-stability-deprecated.rs +++ b/src/test/ui/lint/lint-stability-deprecated.rs @@ -216,16 +216,16 @@ mod inheritance { } mod this_crate { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_text() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -237,16 +237,16 @@ mod this_crate { pub struct MethodTester; impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -256,16 +256,16 @@ mod this_crate { } pub trait Trait { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -276,12 +276,12 @@ mod this_crate { impl Trait for MethodTester {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } @@ -290,29 +290,29 @@ mod this_crate { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; pub enum Enum { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] StableVariant, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(isize); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(isize); @@ -430,7 +430,7 @@ mod this_crate { foo.trait_stable(); } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_fn_body() { fn fn_in_body() {} @@ -438,7 +438,7 @@ mod this_crate { } impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_method_body(&self) { fn fn_in_body() {} @@ -446,7 +446,7 @@ mod this_crate { } } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub trait DeprecatedTrait { fn dummy(&self) { } diff --git a/src/test/ui/lint/lint-stability-fields-deprecated.rs b/src/test/ui/lint/lint-stability-fields-deprecated.rs index 9d5b7c51cc82b..50e3970c7f0d4 100644 --- a/src/test/ui/lint/lint-stability-fields-deprecated.rs +++ b/src/test/ui/lint/lint-stability-fields-deprecated.rs @@ -153,50 +153,50 @@ mod this_crate { #[stable(feature = "rust1", since = "1.0.0")] struct Stable { inherit: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } #[stable(feature = "rust1", since = "1.0.0")] struct Stable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] u8); + #[unstable(feature = "unstable_test_feature", issue = "none")] u8); pub fn foo() { let x = Stable { diff --git a/src/test/ui/lint/lint-stability-fields.rs b/src/test/ui/lint/lint-stability-fields.rs index 9be8710bd4cef..c5de5748aa300 100644 --- a/src/test/ui/lint/lint-stability-fields.rs +++ b/src/test/ui/lint/lint-stability-fields.rs @@ -128,50 +128,50 @@ mod this_crate { #[stable(feature = "rust1", since = "1.0.0")] struct Stable { inherit: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } #[stable(feature = "rust1", since = "1.0.0")] struct Stable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] u8); + #[unstable(feature = "unstable_test_feature", issue = "none")] u8); pub fn foo() { let x = Stable { diff --git a/src/test/ui/lint/lint-stability.rs b/src/test/ui/lint/lint-stability.rs index fde27eec7d3e8..e5620a9f8e710 100644 --- a/src/test/ui/lint/lint-stability.rs +++ b/src/test/ui/lint/lint-stability.rs @@ -203,10 +203,10 @@ mod inheritance { } mod this_crate { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_text() {} @@ -214,9 +214,9 @@ mod this_crate { #[rustc_deprecated(since = "99.99.99", reason = "text")] pub fn deprecated_future() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -228,16 +228,16 @@ mod this_crate { pub struct MethodTester; impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -247,16 +247,16 @@ mod this_crate { } pub trait Trait { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -267,12 +267,12 @@ mod this_crate { impl Trait for MethodTester {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } @@ -281,29 +281,29 @@ mod this_crate { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; pub enum Enum { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] StableVariant, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(isize); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(isize); @@ -422,7 +422,7 @@ mod this_crate { foo.trait_stable(); } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_fn_body() { fn fn_in_body() {} @@ -430,7 +430,7 @@ mod this_crate { } impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_method_body(&self) { fn fn_in_body() {} @@ -438,7 +438,7 @@ mod this_crate { } } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub trait DeprecatedTrait { fn dummy(&self) { } diff --git a/src/test/ui/lint/suggestions.rs b/src/test/ui/lint/suggestions.rs index aa5518d1a7adc..29297d08dcac4 100644 --- a/src/test/ui/lint/suggestions.rs +++ b/src/test/ui/lint/suggestions.rs @@ -60,7 +60,7 @@ fn main() { match d { Equinox { warp_factor: warp_factor } => {} //~^ WARN this pattern is redundant - //~| HELP remove this + //~| HELP use shorthand field pattern } println!("{} {}", registry_no, b); } diff --git a/src/test/ui/lint/suggestions.stderr b/src/test/ui/lint/suggestions.stderr index 2042ed7553786..e42ee0fa6401c 100644 --- a/src/test/ui/lint/suggestions.stderr +++ b/src/test/ui/lint/suggestions.stderr @@ -77,9 +77,7 @@ warning: the `warp_factor:` in this pattern is redundant --> $DIR/suggestions.rs:61:23 | LL | Equinox { warp_factor: warp_factor } => {} - | ------------^^^^^^^^^^^^ - | | - | help: remove this + | ^^^^^^^^^^^^^^^^^^^^^^^^ help: use shorthand field pattern: `warp_factor` | = note: `#[warn(non_shorthand_field_patterns)]` on by default diff --git a/src/test/ui/macros/auxiliary/unstable-macros.rs b/src/test/ui/macros/auxiliary/unstable-macros.rs index e928dc705d71f..123e244a53eb4 100644 --- a/src/test/ui/macros/auxiliary/unstable-macros.rs +++ b/src/test/ui/macros/auxiliary/unstable-macros.rs @@ -2,7 +2,7 @@ #![feature(staged_api)] #![stable(feature = "unit_test", since = "1.0.0")] -#[unstable(feature = "unstable_macros", issue = "0")] +#[unstable(feature = "unstable_macros", issue = "none")] #[macro_export] macro_rules! unstable_macro{ () => () } @@ -12,5 +12,5 @@ macro_rules! unstable_macro{ () => () } macro_rules! deprecated_macro{ () => () } // FIXME: Cannot use a `pub` macro 2.0 in a staged API crate due to reachability issues. -// #[unstable(feature = "unstable_macros", issue = "0")] +// #[unstable(feature = "unstable_macros", issue = "none")] // pub macro unstable_macro_modern() {} diff --git a/src/test/ui/macros/macro-stability-rpass.rs b/src/test/ui/macros/macro-stability-rpass.rs index 817bddf69562b..a5f538ba6b36a 100644 --- a/src/test/ui/macros/macro-stability-rpass.rs +++ b/src/test/ui/macros/macro-stability-rpass.rs @@ -5,7 +5,7 @@ #[macro_use] extern crate unstable_macros; -#[unstable(feature = "local_unstable", issue = "0")] +#[unstable(feature = "local_unstable", issue = "none")] macro_rules! local_unstable { () => () } fn main() { diff --git a/src/test/ui/macros/macro-stability.rs b/src/test/ui/macros/macro-stability.rs index ab927e419b4c3..755f55c28de47 100644 --- a/src/test/ui/macros/macro-stability.rs +++ b/src/test/ui/macros/macro-stability.rs @@ -4,10 +4,10 @@ #![feature(staged_api)] #[macro_use] extern crate unstable_macros; -#[unstable(feature = "local_unstable", issue = "0")] +#[unstable(feature = "local_unstable", issue = "none")] macro_rules! local_unstable { () => () } -#[unstable(feature = "local_unstable", issue = "0")] +#[unstable(feature = "local_unstable", issue = "none")] macro local_unstable_modern() {} #[stable(feature = "deprecated_macros", since = "1.0.0")] diff --git a/src/test/ui/missing/missing-stability.rs b/src/test/ui/missing/missing-stability.rs index 469c22fdb17d7..0da5808b47dc2 100644 --- a/src/test/ui/missing/missing-stability.rs +++ b/src/test/ui/missing/missing-stability.rs @@ -10,7 +10,7 @@ pub fn unmarked() { () } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub mod foo { // #[unstable] is inherited pub fn unmarked() {} diff --git a/src/test/ui/parser/issue-33418.fixed b/src/test/ui/parser/issue-33418.fixed index 2aaa3b5b1ea50..ed885ae143566 100644 --- a/src/test/ui/parser/issue-33418.fixed +++ b/src/test/ui/parser/issue-33418.fixed @@ -1,15 +1,15 @@ // run-rustfix trait Tr {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr2: SuperA {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr3: SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr4: SuperB + SuperD {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr5 {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait SuperA {} trait SuperB {} diff --git a/src/test/ui/parser/issue-33418.rs b/src/test/ui/parser/issue-33418.rs index 5533152092719..9934284abfbbe 100644 --- a/src/test/ui/parser/issue-33418.rs +++ b/src/test/ui/parser/issue-33418.rs @@ -1,17 +1,17 @@ // run-rustfix trait Tr: !SuperA {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr2: SuperA + !SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr3: !SuperA + SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr4: !SuperA + SuperB + !SuperC + SuperD {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr5: !SuperA + !SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait SuperA {} trait SuperB {} diff --git a/src/test/ui/parser/issue-33418.stderr b/src/test/ui/parser/issue-33418.stderr index 479e7bed1016a..9a8733e89292e 100644 --- a/src/test/ui/parser/issue-33418.stderr +++ b/src/test/ui/parser/issue-33418.stderr @@ -1,46 +1,36 @@ -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:3:9 | LL | trait Tr: !SuperA {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:5:19 | LL | trait Tr2: SuperA + !SuperB {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:7:10 | LL | trait Tr3: !SuperA + SuperB {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:9:10 | LL | trait Tr4: !SuperA + SuperB | ^^^^^^^^^ LL | + !SuperC + SuperD {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bounds + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:12:10 | LL | trait Tr5: !SuperA | ^^^^^^^^^ LL | + !SuperB {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bounds + | ^^^^^^^^^ negative bounds are not supported error: aborting due to 5 previous errors diff --git a/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs new file mode 100644 index 0000000000000..5a109ba7c6894 --- /dev/null +++ b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs @@ -0,0 +1,12 @@ +// In this regression test for #67146, we check that the +// negative outlives bound `!'a` is rejected by the parser. +// This regression was first introduced in PR #57364. + +fn main() {} + +fn f1() {} +//~^ ERROR negative bounds are not supported +fn f2<'a, T: Ord + !'a>() {} +//~^ ERROR negative bounds are not supported +fn f3<'a, T: !'a + Ord>() {} +//~^ ERROR negative bounds are not supported diff --git a/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr new file mode 100644 index 0000000000000..4dc0634730442 --- /dev/null +++ b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr @@ -0,0 +1,20 @@ +error: negative bounds are not supported + --> $DIR/issue-67146-negative-outlives-bound-syntactic-fail.rs:7:8 + | +LL | fn f1() {} + | ^^^^^^^^^^ negative bounds are not supported + +error: negative bounds are not supported + --> $DIR/issue-67146-negative-outlives-bound-syntactic-fail.rs:9:18 + | +LL | fn f2<'a, T: Ord + !'a>() {} + | ^^^^^ negative bounds are not supported + +error: negative bounds are not supported + --> $DIR/issue-67146-negative-outlives-bound-syntactic-fail.rs:11:12 + | +LL | fn f3<'a, T: !'a + Ord>() {} + | ^^^^^ negative bounds are not supported + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.rs b/src/test/ui/stability-attribute/stability-attribute-sanity.rs index 2e3d790d2d867..5db924642e59d 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity.rs +++ b/src/test/ui/stability-attribute/stability-attribute-sanity.rs @@ -22,7 +22,7 @@ mod bogus_attribute_types_1 { } mod missing_feature_names { - #[unstable(issue = "0")] //~ ERROR missing 'feature' [E0546] + #[unstable(issue = "none")] //~ ERROR missing 'feature' [E0546] fn f1() { } #[unstable(feature = "b")] //~ ERROR missing 'issue' [E0547] @@ -45,12 +45,12 @@ mod missing_version { fn f3() { } } -#[unstable(feature = "b", issue = "0")] +#[unstable(feature = "b", issue = "none")] #[stable(feature = "a", since = "b")] //~ ERROR multiple stability levels [E0544] fn multiple1() { } -#[unstable(feature = "b", issue = "0")] -#[unstable(feature = "b", issue = "0")] //~ ERROR multiple stability levels [E0544] +#[unstable(feature = "b", issue = "none")] +#[unstable(feature = "b", issue = "none")] //~ ERROR multiple stability levels [E0544] fn multiple2() { } #[stable(feature = "a", since = "b")] @@ -60,8 +60,8 @@ fn multiple3() { } #[stable(feature = "a", since = "b")] #[rustc_deprecated(since = "b", reason = "text")] #[rustc_deprecated(since = "b", reason = "text")] -#[rustc_const_unstable(feature = "c", issue = "0")] -#[rustc_const_unstable(feature = "d", issue = "0")] //~ ERROR multiple stability levels +#[rustc_const_unstable(feature = "c", issue = "none")] +#[rustc_const_unstable(feature = "d", issue = "none")] //~ ERROR multiple stability levels pub const fn multiple4() { } //~ ERROR multiple rustc_deprecated attributes [E0540] //~^ ERROR Invalid stability or deprecation version found diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr index 552e078f45fde..d0ca170503796 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr +++ b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr @@ -31,8 +31,8 @@ LL | #[stable(feature(b), since = "a")] error[E0546]: missing 'feature' --> $DIR/stability-attribute-sanity.rs:25:5 | -LL | #[unstable(issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[unstable(issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0547]: missing 'issue' --> $DIR/stability-attribute-sanity.rs:28:5 @@ -73,8 +73,8 @@ LL | #[stable(feature = "a", since = "b")] error[E0544]: multiple stability levels --> $DIR/stability-attribute-sanity.rs:53:1 | -LL | #[unstable(feature = "b", issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[unstable(feature = "b", issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0544]: multiple stability levels --> $DIR/stability-attribute-sanity.rs:57:1 @@ -91,8 +91,8 @@ LL | pub const fn multiple4() { } error[E0544]: multiple stability levels --> $DIR/stability-attribute-sanity.rs:64:1 | -LL | #[rustc_const_unstable(feature = "d", issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[rustc_const_unstable(feature = "d", issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: Invalid stability or deprecation version found --> $DIR/stability-attribute-sanity.rs:65:1 diff --git a/src/test/ui/type/ascription/issue-47666.stderr b/src/test/ui/type/ascription/issue-47666.stderr index 2f052341faead..648635f0c32fa 100644 --- a/src/test/ui/type/ascription/issue-47666.stderr +++ b/src/test/ui/type/ascription/issue-47666.stderr @@ -11,7 +11,7 @@ LL | let _ = Option:Some(vec![0, 1]); | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` = note: for more information, see https://github.com/rust-lang/rust/issues/23416 - = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs index 4ea101296b738..82292a6912c64 100644 --- a/src/tools/tidy/src/features.rs +++ b/src/tools/tidy/src/features.rs @@ -12,6 +12,7 @@ use std::collections::HashMap; use std::fmt; use std::fs; +use std::num::NonZeroU32; use std::path::Path; use regex::Regex; @@ -48,7 +49,7 @@ pub struct Feature { pub level: Status, pub since: Option, pub has_gate_test: bool, - pub tracking_issue: Option, + pub tracking_issue: Option, } pub type Features = HashMap; @@ -396,6 +397,14 @@ fn map_lib_features(base_src_path: &Path, return; } + let handle_issue_none = |s| match s { + "none" => None, + issue => { + let n = issue.parse().expect("issue number is not a valid integer"); + assert_ne!(n, 0, "\"none\" should be used when there is no issue, not \"0\""); + NonZeroU32::new(n) + } + }; let mut becoming_feature: Option<(&str, Feature)> = None; let mut iter_lines = contents.lines().enumerate().peekable(); while let Some((i, line)) = iter_lines.next() { @@ -407,8 +416,7 @@ fn map_lib_features(base_src_path: &Path, }; if let Some((ref name, ref mut f)) = becoming_feature { if f.tracking_issue.is_none() { - f.tracking_issue = find_attr_val(line, "issue") - .map(|s| s.parse().unwrap()); + f.tracking_issue = find_attr_val(line, "issue").and_then(handle_issue_none); } if line.ends_with(']') { mf(Ok((name, f.clone())), file, i + 1); @@ -439,7 +447,7 @@ fn map_lib_features(base_src_path: &Path, // FIXME(#57563): #57563 is now used as a common tracking issue, // although we would like to have specific tracking issues for each // `rustc_const_unstable` in the future. - tracking_issue: Some(57563), + tracking_issue: NonZeroU32::new(57563), }; mf(Ok((feature_name, feature)), file, i + 1); continue; @@ -467,7 +475,7 @@ fn map_lib_features(base_src_path: &Path, } None => None, }; - let tracking_issue = find_attr_val(line, "issue").map(|s| s.parse().unwrap()); + let tracking_issue = find_attr_val(line, "issue").and_then(handle_issue_none); let feature = Feature { level, diff --git a/src/tools/unstable-book-gen/src/main.rs b/src/tools/unstable-book-gen/src/main.rs index fdb0b6d3e5653..39e8d61edeb09 100644 --- a/src/tools/unstable-book-gen/src/main.rs +++ b/src/tools/unstable-book-gen/src/main.rs @@ -2,7 +2,7 @@ #![deny(warnings)] -use tidy::features::{Feature, Features, collect_lib_features, collect_lang_features}; +use tidy::features::{Features, collect_lib_features, collect_lang_features}; use tidy::unstable_book::{collect_unstable_feature_names, collect_unstable_book_section_file_names, PATH_STR, LANG_FEATURES_DIR, LIB_FEATURES_DIR}; use std::collections::BTreeSet; @@ -70,15 +70,6 @@ fn generate_summary(path: &Path, lang_features: &Features, lib_features: &Featur } -fn has_valid_tracking_issue(f: &Feature) -> bool { - if let Some(n) = f.tracking_issue { - if n > 0 { - return true; - } - } - false -} - fn generate_unstable_book_files(src :&Path, out: &Path, features :&Features) { let unstable_features = collect_unstable_feature_names(features); let unstable_section_file_names = collect_unstable_book_section_file_names(src); @@ -89,10 +80,10 @@ fn generate_unstable_book_files(src :&Path, out: &Path, features :&Features) { let out_file_path = out.join(&file_name); let feature = &features[&feature_name_underscore]; - if has_valid_tracking_issue(&feature) { + if let Some(issue) = feature.tracking_issue { generate_stub_issue(&out_file_path, &feature_name_underscore, - feature.tracking_issue.unwrap()); + issue.get()); } else { generate_stub_no_issue(&out_file_path, &feature_name_underscore); }