about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-12-22 07:01:50 +0000
committerbors <bors@rust-lang.org>2019-12-22 07:01:50 +0000
commit3982d3514efbb65b3efac6bb006b3fa496d16663 (patch)
tree5fcfb7b8bd5ee606865be1abb448a4858f8c6770 /src
parent005cf38f7e66757b32b03ea35fedca372eb063e3 (diff)
parentca528fcc046aca3e1cccb74a4bbebe855df3e3b6 (diff)
downloadrust-3982d3514efbb65b3efac6bb006b3fa496d16663.tar.gz
rust-3982d3514efbb65b3efac6bb006b3fa496d16663.zip
Auto merge of #67505 - Centril:rollup-7win7ty, r=Centril
Rollup of 6 pull requests

Successful merges:

 - #67148 ( Refactor type & bounds parsing thoroughly)
 - #67410 (Reenable static linking of libstdc++ on windows-gnu)
 - #67439 (Cleanup `lower_pattern_unadjusted` & Improve slice pat typeck)
 - #67480 (Require issue = "none" over issue = "0" in unstable attributes)
 - #67500 (Tweak non_shorthand_field_patterns' suggestion)
 - #67504 (Warn against relying on ?Sized being last)

Failed merges:

r? @ghost
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/compile.rs2
-rw-r--r--src/liballoc/boxed.rs8
-rw-r--r--src/liballoc/collections/mod.rs2
-rw-r--r--src/liballoc/fmt.rs2
-rw-r--r--src/liballoc/lib.rs2
-rw-r--r--src/liballoc/raw_vec.rs2
-rw-r--r--src/liballoc/rc.rs10
-rw-r--r--src/liballoc/sync.rs10
-rw-r--r--src/libcore/array/mod.rs6
-rw-r--r--src/libcore/char/convert.rs2
-rw-r--r--src/libcore/clone.rs4
-rw-r--r--src/libcore/cmp.rs2
-rw-r--r--src/libcore/ffi.rs4
-rw-r--r--src/libcore/fmt/mod.rs14
-rw-r--r--src/libcore/hash/mod.rs2
-rw-r--r--src/libcore/hash/sip.rs10
-rw-r--r--src/libcore/internal_macros.rs2
-rw-r--r--src/libcore/intrinsics.rs6
-rw-r--r--src/libcore/macros/mod.rs2
-rw-r--r--src/libcore/mem/maybe_uninit.rs8
-rw-r--r--src/libcore/mem/mod.rs2
-rw-r--r--src/libcore/num/bignum.rs2
-rw-r--r--src/libcore/num/dec2flt/mod.rs4
-rw-r--r--src/libcore/num/diy_float.rs2
-rw-r--r--src/libcore/num/flt2dec/mod.rs2
-rw-r--r--src/libcore/num/mod.rs4
-rw-r--r--src/libcore/ops/deref.rs6
-rw-r--r--src/libcore/ops/mod.rs4
-rw-r--r--src/libcore/ops/unsize.rs10
-rw-r--r--src/libcore/panic.rs8
-rw-r--r--src/libcore/panicking.rs2
-rw-r--r--src/libcore/pin.rs2
-rw-r--r--src/libcore/ptr/mod.rs2
-rw-r--r--src/libcore/ptr/non_null.rs4
-rw-r--r--src/libcore/ptr/unique.rs28
-rw-r--r--src/libcore/slice/mod.rs16
-rw-r--r--src/libcore/str/lossy.rs6
-rw-r--r--src/libcore/str/mod.rs6
-rw-r--r--src/libcore/unicode/mod.rs2
-rw-r--r--src/libprofiler_builtins/lib.rs2
-rw-r--r--src/librustc_asan/lib.rs2
-rw-r--r--src/librustc_error_codes/error_codes/E0734.md2
-rw-r--r--src/librustc_lint/builtin.rs23
-rw-r--r--src/librustc_lsan/lib.rs2
-rw-r--r--src/librustc_mir/hair/pattern/_match.rs9
-rw-r--r--src/librustc_mir/hair/pattern/mod.rs162
-rw-r--r--src/librustc_msan/lib.rs2
-rw-r--r--src/librustc_parse/parser/expr.rs11
-rw-r--r--src/librustc_parse/parser/item.rs7
-rw-r--r--src/librustc_parse/parser/ty.rs547
-rw-r--r--src/librustc_tsan/lib.rs2
-rw-r--r--src/librustc_typeck/check/pat.rs87
-rw-r--r--src/libstd/alloc.rs4
-rw-r--r--src/libstd/ffi/c_str.rs2
-rw-r--r--src/libstd/io/mod.rs2
-rw-r--r--src/libstd/io/stdio.rs8
-rw-r--r--src/libstd/panic.rs2
-rw-r--r--src/libstd/panicking.rs6
-rw-r--r--src/libstd/rt.rs2
-rw-r--r--src/libstd/sys/hermit/fast_thread_local.rs2
-rw-r--r--src/libstd/sys/hermit/fd.rs2
-rw-r--r--src/libstd/sys/mod.rs4
-rw-r--r--src/libstd/sys/unix/fast_thread_local.rs2
-rw-r--r--src/libstd/sys/unix/fd.rs2
-rw-r--r--src/libstd/sys/vxworks/fast_thread_local.rs2
-rw-r--r--src/libstd/sys/vxworks/fd.rs2
-rw-r--r--src/libstd/sys/wasi/ext/fs.rs2
-rw-r--r--src/libstd/sys/wasi/ext/io.rs2
-rw-r--r--src/libstd/sys/wasm/fast_thread_local.rs2
-rw-r--r--src/libstd/sys/windows/c.rs2
-rw-r--r--src/libstd/sys/windows/ext/fs.rs8
-rw-r--r--src/libstd/sys/windows/fast_thread_local.rs2
-rw-r--r--src/libstd/sys/windows/handle.rs2
-rw-r--r--src/libstd/sys/windows/net.rs4
-rw-r--r--src/libstd/sys/windows/process.rs2
-rw-r--r--src/libstd/sys/windows/stdio.rs2
-rw-r--r--src/libstd/sys/windows/stdio_uwp.rs2
-rw-r--r--src/libstd/sys_common/process.rs2
-rw-r--r--src/libstd/sys_common/thread_local.rs2
-rw-r--r--src/libstd/thread/local.rs6
-rw-r--r--src/libstd/thread/mod.rs6
-rw-r--r--src/libsyntax/attr/builtin.rs6
-rw-r--r--src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs2
-rw-r--r--src/test/rustdoc/const-display.rs8
-rw-r--r--src/test/rustdoc/inline_cross/auxiliary/macros.rs2
-rw-r--r--src/test/rustdoc/stability.rs2
-rw-r--r--src/test/ui/auxiliary/stability-cfg2.rs2
-rw-r--r--src/test/ui/consts/const-eval/auxiliary/stability.rs2
-rw-r--r--src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs4
-rw-r--r--src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs8
-rw-r--r--src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs8
-rw-r--r--src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs8
-rw-r--r--src/test/ui/consts/unstable-const-fn-in-libcore.rs2
-rw-r--r--src/test/ui/feature-gate/stability-attribute-consistency.rs2
-rw-r--r--src/test/ui/feature-gate/stability-attribute-consistency.stderr4
-rw-r--r--src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs (renamed from src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs)2
-rw-r--r--src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr (renamed from src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr)2
-rw-r--r--src/test/ui/internal/auxiliary/internal_unstable.rs8
-rw-r--r--src/test/ui/issues/auxiliary/issue-52489.rs2
-rw-r--r--src/test/ui/issues/auxiliary/lint-stability.rs46
-rw-r--r--src/test/ui/issues/issue-17337.rs4
-rw-r--r--src/test/ui/issues/issue-58857.rs2
-rw-r--r--src/test/ui/issues/issue-58857.stderr6
-rw-r--r--src/test/ui/lint/auxiliary/inherited_stability.rs8
-rw-r--r--src/test/ui/lint/auxiliary/lint_output_format.rs6
-rw-r--r--src/test/ui/lint/auxiliary/lint_stability.rs46
-rw-r--r--src/test/ui/lint/auxiliary/lint_stability_fields.rs24
-rw-r--r--src/test/ui/lint/auxiliary/stability-cfg2.rs2
-rw-r--r--src/test/ui/lint/auxiliary/stability_cfg2.rs2
-rw-r--r--src/test/ui/lint/lint-shorthand-field.fixed70
-rw-r--r--src/test/ui/lint/lint-shorthand-field.rs18
-rw-r--r--src/test/ui/lint/lint-shorthand-field.stderr34
-rw-r--r--src/test/ui/lint/lint-stability-2.rs46
-rw-r--r--src/test/ui/lint/lint-stability-deprecated.rs46
-rw-r--r--src/test/ui/lint/lint-stability-fields-deprecated.rs22
-rw-r--r--src/test/ui/lint/lint-stability-fields.rs22
-rw-r--r--src/test/ui/lint/lint-stability.rs46
-rw-r--r--src/test/ui/lint/suggestions.rs2
-rw-r--r--src/test/ui/lint/suggestions.stderr4
-rw-r--r--src/test/ui/macros/auxiliary/unstable-macros.rs4
-rw-r--r--src/test/ui/macros/macro-stability-rpass.rs2
-rw-r--r--src/test/ui/macros/macro-stability.rs4
-rw-r--r--src/test/ui/missing/missing-stability.rs2
-rw-r--r--src/test/ui/parser/issue-33418.fixed10
-rw-r--r--src/test/ui/parser/issue-33418.rs10
-rw-r--r--src/test/ui/parser/issue-33418.stderr30
-rw-r--r--src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs12
-rw-r--r--src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr20
-rw-r--r--src/test/ui/stability-attribute/stability-attribute-sanity.rs12
-rw-r--r--src/test/ui/stability-attribute/stability-attribute-sanity.stderr12
-rw-r--r--src/test/ui/type/ascription/issue-47666.stderr2
-rw-r--r--src/tools/tidy/src/features.rs18
-rw-r--r--src/tools/unstable-book-gen/src/main.rs15
133 files changed, 985 insertions, 856 deletions
diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs
index baf9aabed00..831053bc0f7 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 1c39a3721f4..3e4005acaf3 100644
--- a/src/liballoc/boxed.rs
+++ b/src/liballoc/boxed.rs
@@ -476,7 +476,7 @@ impl<T: ?Sized> Box<T> {
         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<T>) -> Unique<T> {
@@ -830,7 +830,7 @@ impl From<Box<str>> for Box<[u8]> {
     }
 }
 
-#[unstable(feature = "boxed_slice_try_from", issue = "0")]
+#[unstable(feature = "boxed_slice_try_from", issue = "none")]
 impl<T, const N: usize> TryFrom<Box<[T]>> for Box<[T; N]>
 where
     [T; N]: LengthAtMost32,
@@ -946,7 +946,7 @@ impl<T: ?Sized> DerefMut for Box<T> {
     }
 }
 
-#[unstable(feature = "receiver_trait", issue = "0")]
+#[unstable(feature = "receiver_trait", issue = "none")]
 impl<T: ?Sized> Receiver for Box<T> {}
 
 #[stable(feature = "rust1", since = "1.0.0")]
@@ -1040,7 +1040,7 @@ impl<A, F: Fn<A> + ?Sized> Fn<A> for Box<F> {
 #[unstable(feature = "coerce_unsized", issue = "27732")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Box<U>> for Box<T> {}
 
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Box<U>> for Box<T> {}
 
 #[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 f1f22fe48c5..390a48180c0 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 18ebae33309..01d4913665c 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 be46e632be4..b549fa1ef4f 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 3201c702abb..444450f6628 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 42a278de98b..fd266210519 100644
--- a/src/liballoc/rc.rs
+++ b/src/liballoc/rc.rs
@@ -291,7 +291,7 @@ impl<T: ?Sized> !marker::Sync for Rc<T> {}
 #[unstable(feature = "coerce_unsized", issue = "27732")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Rc<U>> for Rc<T> {}
 
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Rc<U>> for Rc<T> {}
 
 impl<T: ?Sized> Rc<T> {
@@ -1090,7 +1090,7 @@ impl<T: ?Sized> Deref for Rc<T> {
     }
 }
 
-#[unstable(feature = "receiver_trait", issue = "0")]
+#[unstable(feature = "receiver_trait", issue = "none")]
 impl<T: ?Sized> Receiver for Rc<T> {}
 
 #[stable(feature = "rust1", since = "1.0.0")]
@@ -1471,7 +1471,7 @@ impl<T> From<Vec<T>> for Rc<[T]> {
     }
 }
 
-#[unstable(feature = "boxed_slice_try_from", issue = "0")]
+#[unstable(feature = "boxed_slice_try_from", issue = "none")]
 impl<T, const N: usize> TryFrom<Rc<[T]>> for Rc<[T; N]>
 where
     [T; N]: LengthAtMost32,
@@ -1621,7 +1621,7 @@ impl<T: ?Sized> !marker::Sync for Weak<T> {}
 #[unstable(feature = "coerce_unsized", issue = "27732")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Weak<U>> for Weak<T> {}
 
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Weak<U>> for Weak<T> {}
 
 impl<T> Weak<T> {
@@ -2106,6 +2106,8 @@ impl<T: ?Sized> Unpin for Rc<T> { }
 unsafe fn data_offset<T: ?Sized>(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 a99564c0dac..3343384754f 100644
--- a/src/liballoc/sync.rs
+++ b/src/liballoc/sync.rs
@@ -206,7 +206,7 @@ unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
 #[unstable(feature = "coerce_unsized", issue = "27732")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Arc<U>> for Arc<T> {}
 
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Arc<U>> for Arc<T> {}
 
 impl<T: ?Sized> Arc<T> {
@@ -263,7 +263,7 @@ unsafe impl<T: ?Sized + Sync + Send> Sync for Weak<T> {}
 
 #[unstable(feature = "coerce_unsized", issue = "27732")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Weak<U>> for Weak<T> {}
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Weak<U>> for Weak<T> {}
 
 #[stable(feature = "arc_weak", since = "1.4.0")]
@@ -993,7 +993,7 @@ impl<T: ?Sized> Deref for Arc<T> {
     }
 }
 
-#[unstable(feature = "receiver_trait", issue = "0")]
+#[unstable(feature = "receiver_trait", issue = "none")]
 impl<T: ?Sized> Receiver for Arc<T> {}
 
 impl<T: Clone> Arc<T> {
@@ -2032,7 +2032,7 @@ impl<T> From<Vec<T>> for Arc<[T]> {
     }
 }
 
-#[unstable(feature = "boxed_slice_try_from", issue = "0")]
+#[unstable(feature = "boxed_slice_try_from", issue = "none")]
 impl<T, const N: usize> TryFrom<Arc<[T]>> for Arc<[T; N]>
 where
     [T; N]: LengthAtMost32,
@@ -2161,6 +2161,8 @@ impl<T: ?Sized> Unpin for Arc<T> { }
 unsafe fn data_offset<T: ?Sized>(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 38d248d701d..fd80000b6fb 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<T> LengthAtMost32 for [T; $N] {}
         )+
     }
diff --git a/src/libcore/char/convert.rs b/src/libcore/char/convert.rs
index dd21c72e745..315020bac58 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 18f808638de..9a412e57294 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<T: Clone + ?Sized> {
     _field: crate::marker::PhantomData<T>,
@@ -160,7 +160,7 @@ pub struct AssertParamIsClone<T: Clone + ?Sized> {
 #[unstable(
     feature = "derive_clone_copy",
     reason = "deriving hack, should not be public",
-    issue = "0"
+    issue = "none"
 )]
 pub struct AssertParamIsCopy<T: Copy + ?Sized> {
     _field: crate::marker::PhantomData<T>,
diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs
index 4aa52a7a390..a0e72fb66b0 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<T: Eq + ?Sized> { _field: crate::marker::PhantomData<T> }
 
 /// An `Ordering` is the result of a comparison between two values.
diff --git a/src/libcore/ffi.rs b/src/libcore/ffi.rs
index 74ec24939a3..6277da4f123 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 793c1f124ed..6c8d1626b09 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 0db8d86ebbf..2a7fa58dd30 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 0aa3b97ebcf..7ebe01e26dc 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: <https://131002.net/siphash>
-#[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: <https://131002.net/siphash/>
-#[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 3acf2ec837d..4ea7dfc0735 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 b02acce2d00..e73d125c13f 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>() -> 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>() -> T;
diff --git a/src/libcore/macros/mod.rs b/src/libcore/macros/mod.rs
index dd06da7a6d2..6c7ec2cbfe3 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 7f80f61aaf9..de3b837fb68 100644
--- a/src/libcore/mem/maybe_uninit.rs
+++ b/src/libcore/mem/maybe_uninit.rs
@@ -301,7 +301,7 @@ impl<T> MaybeUninit<T> {
     /// let mut buf: [MaybeUninit<u8>; 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<const LEN: usize>() -> [Self; LEN] {
         unsafe {
@@ -310,7 +310,7 @@ impl<T> MaybeUninit<T> {
     }
 
     /// 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<T> MaybeUninit<T> {
     /// It is up to the caller to guarantee that the `MaybeUninit<T>` 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<T> MaybeUninit<T> {
     /// It is up to the caller to guarantee that the `MaybeUninit<T>` 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 4e8ba8131f7..db5d2650331 100644
--- a/src/libcore/mem/mod.rs
+++ b/src/libcore/mem/mod.rs
@@ -121,7 +121,7 @@ pub fn forget<T>(t: T) {
 ///
 /// [`forget`]: fn.forget.html
 #[inline]
-#[unstable(feature = "forget_unsized", issue = "0")]
+#[unstable(feature = "forget_unsized", issue = "none")]
 pub fn forget_unsized<T: ?Sized>(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 b8ddd5322a1..39cc381b64c 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 6fe9af8cbd8..c83c6b0eccb 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 0e601d45a21..0a609417dcf 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 63df5613453..9e760c13c0c 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 6c864f74b1f..8a32479b2ff 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 f521355a907..68244fdb381 100644
--- a/src/libcore/ops/deref.rs
+++ b/src/libcore/ops/deref.rs
@@ -178,14 +178,14 @@ impl<T: ?Sized> DerefMut for &mut T {
 /// `arbitrary_self_types` feature. This is implemented by stdlib pointer types like `Box<T>`,
 /// `Rc<T>`, `&T`, and `Pin<P>`.
 #[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<T: ?Sized> Receiver for &T {}
 
-#[unstable(feature = "receiver_trait", issue = "0")]
+#[unstable(feature = "receiver_trait", issue = "none")]
 impl<T: ?Sized> Receiver for &mut T {}
diff --git a/src/libcore/ops/mod.rs b/src/libcore/ops/mod.rs
index 80ab906961e..77b92b6ccbd 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 80fb5642a6a..95a4393592b 100644
--- a/src/libcore/ops/unsize.rs
+++ b/src/libcore/ops/unsize.rs
@@ -81,21 +81,21 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *const T {}
 ///     T: Unsize<U>,
 /// {}
 /// ```
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 #[lang = "dispatch_from_dyn"]
 pub trait DispatchFromDyn<T> {
     // Empty.
 }
 
 // &T -> &U
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<'a, T: ?Sized + Unsize<U>, 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>, 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<T: ?Sized + Unsize<U>, 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<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<*mut U> for *mut T {}
diff --git a/src/libcore/panic.rs b/src/libcore/panic.rs
index c9a1c4b0049..a90b025c093 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 4857b114595..7ebb72e3ce7 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 6a0c5bbebc1..aca6fb20138 100644
--- a/src/libcore/pin.rs
+++ b/src/libcore/pin.rs
@@ -786,7 +786,7 @@ impl<P: DerefMut<Target: Unpin>> DerefMut for Pin<P> {
     }
 }
 
-#[unstable(feature = "receiver_trait", issue = "0")]
+#[unstable(feature = "receiver_trait", issue = "none")]
 impl<P: Receiver> Receiver for Pin<P> {}
 
 #[stable(feature = "pin", since = "1.33.0")]
diff --git a/src/libcore/ptr/mod.rs b/src/libcore/ptr/mod.rs
index 924563fc44f..d42b673ff65 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 6946fd2413e..626e58d4930 100644
--- a/src/libcore/ptr/non_null.rs
+++ b/src/libcore/ptr/non_null.rs
@@ -149,7 +149,7 @@ impl<T: ?Sized> Copy for NonNull<T> {}
 #[unstable(feature = "coerce_unsized", issue = "27732")]
 impl<T: ?Sized, U: ?Sized> CoerceUnsized<NonNull<U>> for NonNull<T> where T: Unsize<U> {}
 
-#[unstable(feature = "dispatch_from_dyn", issue = "0")]
+#[unstable(feature = "dispatch_from_dyn", issue = "none")]
 impl<T: ?Sized, U: ?Sized> DispatchFromDyn<NonNull<U>> for NonNull<T> where T: Unsize<U> {}
 
 #[stable(feature = "nonnull", since = "1.25.0")]
@@ -201,7 +201,7 @@ impl<T: ?Sized> hash::Hash for NonNull<T> {
     }
 }
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> From<Unique<T>> for NonNull<T> {
     #[inline]
     fn from(unique: Unique<T>) -> Self {
diff --git a/src/libcore/ptr/unique.rs b/src/libcore/ptr/unique.rs
index 546b7c9d777..87b56d951c6 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<T>` \
               (if you also use `#[may_dangle]`), `Send`, and/or `Sync`"
 )]
@@ -50,17 +50,17 @@ pub struct Unique<T: ?Sized> {
 /// 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<T: Send + ?Sized> Send for Unique<T> {}
 
 /// `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<T: Sync + ?Sized> Sync for Unique<T> {}
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: Sized> Unique<T> {
     /// Creates a new `Unique` that is dangling, but well-aligned.
     ///
@@ -78,7 +78,7 @@ impl<T: Sized> Unique<T> {
     }
 }
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> Unique<T> {
     /// Creates a new `Unique`.
     ///
@@ -133,7 +133,7 @@ impl<T: ?Sized> Unique<T> {
     }
 }
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> Clone for Unique<T> {
     #[inline]
     fn clone(&self) -> Self {
@@ -141,30 +141,30 @@ impl<T: ?Sized> Clone for Unique<T> {
     }
 }
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> Copy for Unique<T> {}
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized, U: ?Sized> CoerceUnsized<Unique<U>> for Unique<T> where T: Unsize<U> {}
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized, U: ?Sized> DispatchFromDyn<Unique<U>> for Unique<T> where T: Unsize<U> {}
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> fmt::Debug for Unique<T> {
     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<T: ?Sized> fmt::Pointer for Unique<T> {
     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<T: ?Sized> From<&mut T> for Unique<T> {
     #[inline]
     fn from(reference: &mut T) -> Self {
@@ -172,7 +172,7 @@ impl<T: ?Sized> From<&mut T> for Unique<T> {
     }
 }
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> From<&T> for Unique<T> {
     #[inline]
     fn from(reference: &T) -> Self {
@@ -180,7 +180,7 @@ impl<T: ?Sized> From<&T> for Unique<T> {
     }
 }
 
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: ?Sized> From<NonNull<T>> for Unique<T> {
     #[inline]
     fn from(p: NonNull<T>) -> Self {
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs
index 05baa1899b3..68e12e87789 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<T: ?Sized>: 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<T: ?Sized>: 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<T: ?Sized>: 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<T>(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<T, F>(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 762de0489a9..cf6ee6ed593 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 e2cc99813ac..15b65ed7655 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<Item = &'a u8>>(bytes: &mut I) -> Option<u32> {
     // 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 a3ec9fd51f0..e424174f554 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 0d12ba01c87..e503795c519 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 d6c8e54c18d..4c8c9d15d56 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 913801d2236..7506c8e693e 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 4cf694631d0..6461263bf51 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 d6c8e54c18d..4c8c9d15d56 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 c3720328506..f267be812c3 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 7f15b3de5ef..9d0a67151fb 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<hir::Pat>],
+        expected_len: usize,
+        gap_pos: Option<usize>,
+    ) -> Vec<FieldPat<'tcx>> {
+        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<hir::Pat>]) -> Vec<Pat<'tcx>> {
         pats.iter().map(|p| self.lower_pattern(p)).collect()
     }
 
-    fn lower_opt_pattern(&mut self, pat: &'tcx Option<P<hir::Pat>>) -> Option<Pat<'tcx>>
-    {
+    fn lower_opt_pattern(&mut self, pat: &'tcx Option<P<hir::Pat>>) -> Option<Pat<'tcx>> {
         pat.as_ref().map(|p| self.lower_pattern(p))
     }
 
-    fn flatten_nested_slice_patterns(
-        &mut self,
-        prefix: Vec<Pat<'tcx>>,
-        slice: Option<Pat<'tcx>>,
-        suffix: Vec<Pat<'tcx>>)
-        -> (Vec<Pat<'tcx>>, Option<Pat<'tcx>>, Vec<Pat<'tcx>>)
-    {
-        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<hir::Pat>],
         slice: &'tcx Option<P<hir::Pat>>,
-        suffix: &'tcx [P<hir::Pat>])
-        -> PatKind<'tcx>
-    {
+        suffix: &'tcx [P<hir::Pat>],
+    ) -> 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 d6c8e54c18d..4c8c9d15d56 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 159c2121d36..71c9e58f58f 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<Expr>> {
         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<P<Expr>>> {
         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 271e5092018..ea9047d2d77 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 86692610324..58f3a5b3d60 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<GenericParam>, 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<GenericParam>,
+        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<P<ast::Expr>>> {
-        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<GenericParam>) -> 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<Span>) -> 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<Span>,
+    ) -> 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<LT_PARAM_DEFS>] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`)
-    /// ```
-    fn parse_generic_bounds_common(&mut self,
-                                   allow_plus: bool,
-                                   colon_span: Option<Span>) -> PResult<'a, GenericBounds> {
+    /// See `parse_generic_bound` for the `BOUND` grammar.
+    fn parse_generic_bounds_common(
+        &mut self,
+        allow_plus: bool,
+        colon_span: Option<Span>,
+    ) -> 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<Span>,
+        bounds: &[GenericBound],
+        negative_bounds: Vec<Span>,
+    ) {
+        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<GenericBound, Span>> {
+        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<Span>,
+    ) -> 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<GenericBound>)`?
+            self.recover_paren_lifetime(lo, inner_lo)?;
+        }
+        Ok(bound)
+    }
+
+    fn error_opt_out_lifetime(&self, question: Option<Span>) {
+        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<LT_PARAM_DEFS>] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`)
+    /// ```
+    fn parse_generic_ty_bound(
+        &mut self,
+        lo: Span,
+        has_parens: bool,
+        question: Option<Span>,
+    ) -> 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<GenericParam>> {
         if self.eat_keyword(kw::For) {
             self.expect_lt()?;
diff --git a/src/librustc_tsan/lib.rs b/src/librustc_tsan/lib.rs
index d6c8e54c18d..4c8c9d15d56 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 11f744e9761..ec6439c6d77 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<Span>,
     ) -> 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<u64> {
+        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 ff52974775b..eccf8cabf22 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 05008958ed2..48ebb77cfb3 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 a1a33bade0d..587ac243267 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 6574ef13db9..4aa35884fb4 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<Box<dyn Write + Send>>) -> Option<Box<dyn Write + Send>> {
     use crate::mem;
@@ -746,7 +746,7 @@ pub fn set_panic(sink: Option<Box<dyn Write + Send>>) -> Option<Box<dyn Write +
 #[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_print(sink: Option<Box<dyn Write + Send>>) -> Option<Box<dyn Write + Send>> {
     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 ac8e0daf766..6ad5519d34a 100644
--- a/src/libstd/panic.rs
+++ b/src/libstd/panic.rs
@@ -205,7 +205,7 @@ impl<T: RefUnwindSafe + ?Sized> UnwindSafe for &T {}
 impl<T: RefUnwindSafe + ?Sized> UnwindSafe for *const T {}
 #[stable(feature = "catch_unwind", since = "1.9.0")]
 impl<T: RefUnwindSafe + ?Sized> UnwindSafe for *mut T {}
-#[unstable(feature = "ptr_internals", issue = "0")]
+#[unstable(feature = "ptr_internals", issue = "none")]
 impl<T: UnwindSafe + ?Sized> UnwindSafe for Unique<T> {}
 #[stable(feature = "nonnull", since = "1.25.0")]
 impl<T: RefUnwindSafe + ?Sized> UnwindSafe for NonNull<T> {}
diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs
index c028ddcd676..886acf1f95d 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<usize> = 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 1ed984509d2..2426b2dead7 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 05464787a05..1108e2545bd 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 f2f61fdfb8c..97d1a38b41a 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 9eeab34643f..875ff1af920 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 0861432f8a9..8730b4de8be 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 53b50763fbf..8a99836912a 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 387ebd0520a..098668cf521 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 9b649aa7ef4..65c67dabc1a 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 92d0e60c07e..6696efa8871 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 f678b71a2b9..be3c2d97a24 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 3b0993fdb58..9bdc26ae7d6 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 b1f9d9766f7..4cdac89a864 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 7eaff226a76..0462f889a8e 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 31d0bd1e72e..191fa07f32a 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 ebaa0783d60..fd0c2350cb3 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 2f2f285edc1..53e08d50004 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<usize> {
         (**self).read(buf)
diff --git a/src/libstd/sys/windows/process.rs b/src/libstd/sys/windows/process.rs
index 096b7bea8a5..060997be97d 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 f322c2b1d96..c84896296ec 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 0f2178f7353..5bdabf6d4b7 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 55b421794c4..042641852b3 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 bdf79002e90..9596911fd48 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 9c530e7b324..1dd942e252f 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<T: 'static> LocalKey<T> {
     #[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<T> {
         LocalKey { inner }
diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs
index 0c632d2afbd..9df6af4c5d8 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 a37b27f67bc..d780d0ad764 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 2a977ed63b1..3dcfb9dadd8 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 bc7ad04b6a2..8e0d230f7d0 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 6189b018037..2165be97452 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 18a21603493..b1b97fe134e 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 8a2899584b9..c995038e5a8 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 830db55207f..70531114f21 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 c4b89b50bc4..3729285956b 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 97e467aece2..df10f3496c3 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 102b3801441..12b41ee2b0d 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 121177f8366..44a62094987 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 655ad7b548a..0b64786ccce 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<T> {
 }
 
 impl<T> Opt<T> {
-    #[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<F: FnOnce() -> 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 caafd8b8854..6ee7003c31e 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 9b4b28a3922..d49b44c8a35 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
index 3ce9de3fb1b..c8ad0d13a14 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
index fc031f5f8c5..10bd6f373d9 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 7c79dcb7522..148cbd1899e 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 c649930c2b4..f53bf7db525 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 3188d706ab0..de4058887cf 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 1126ab7a206..65f2f8fc5ac 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 392e4ea0c2e..4350d7e5b40 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 : A}
 trait Valid {}
 
 impl<A: !Valid> Conj<A>{}
-//~^ 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 ab9a0130c00..e2acec47e5a 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<A: !Valid> Conj<A>{}
-   |       ^^^^^^^^ 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 57af0d3ec9c..1e7eb26fde2 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 5facb556122..58cae180196 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 3188d706ab0..de4058887cf 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 2787da7cb71..0efe7686ef7 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 8a2899584b9..c995038e5a8 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 8a2899584b9..c995038e5a8 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 00000000000..7cd5717bc5a
--- /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 5e756d14dc8..22de9c32545 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 366ab55d7d4..5c9b21ffdc7 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 53eee35a9ca..2a4f95f555f 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 5e747467a12..0585fec99b4 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 9d5b7c51cc8..50e3970c7f0 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 9be8710bd4c..c5de5748aa3 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 fde27eec7d3..e5620a9f8e7 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 aa5518d1a7a..29297d08dca 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 2042ed75537..e42ee0fa640 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 e928dc705d7..123e244a53e 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 817bddf6956..a5f538ba6b3 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 ab927e419b4..755f55c28de 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 469c22fdb17..0da5808b47d 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 2aaa3b5b1ea..ed885ae1435 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 55331520927..9934284abfb 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 479e7bed101..9a8733e8929 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 00000000000..5a109ba7c68
--- /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<T: !'static>() {}
+//~^ 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 00000000000..4dc06347304
--- /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<T: !'static>() {}
+   |        ^^^^^^^^^^ 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 2e3d790d2d8..5db924642e5 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 552e078f45f..d0ca1705037 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 2f052341fae..648635f0c32 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: `<expr>: <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 4ea101296b7..82292a6912c 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<Version>,
     pub has_gate_test: bool,
-    pub tracking_issue: Option<u32>,
+    pub tracking_issue: Option<NonZeroU32>,
 }
 
 pub type Features = HashMap<String, Feature>;
@@ -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 fdb0b6d3e56..39e8d61edeb 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);
         }