about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-09-17 06:47:35 +0000
committerbors <bors@rust-lang.org>2021-09-17 06:47:35 +0000
commit1c03f0d0ba4fee54b7aa458f4d3ad989d8bf7b34 (patch)
tree535fc47baf233bb1a844d22916a3c086d6daab11
parent38e576423dc56a006ccf0b72e106f09bdea6efc2 (diff)
parent4d5bcbe957fa2f9b47aba81484d47206de742f3d (diff)
downloadrust-1c03f0d0ba4fee54b7aa458f4d3ad989d8bf7b34.tar.gz
rust-1c03f0d0ba4fee54b7aa458f4d3ad989d8bf7b34.zip
Auto merge of #89037 - JohnTitor:rollup-rd9btbs, r=JohnTitor
Rollup of 10 pull requests

Successful merges:

 - #86382 (Make diagnostics clearer for `?` operators)
 - #87529 (Fix ICE in `improper_ctypes_definitions` lint with all-ZST transparent types)
 - #88339 (Add TcpListener::into_incoming and IntoIncoming)
 - #88735 (Don't lint about missing code examples in derived traits)
 - #88751 (Couple of changes to FileSearch and SearchPath)
 - #88883 (Move some tests to more reasonable directories - 7)
 - #88887 (Const Deref)
 - #88911 (Improve error message for type mismatch in generator arguments)
 - #89014 (PassWrapper: handle separate Module*SanitizerPass)
 - #89033 (Set the library path in sysroot-crates-are-unstable)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
-rw-r--r--compiler/rustc_codegen_ssa/src/back/link.rs8
-rw-r--r--compiler/rustc_codegen_ssa/src/back/linker.rs3
-rw-r--r--compiler/rustc_driver/src/lib.rs5
-rw-r--r--compiler/rustc_errors/src/diagnostic.rs12
-rw-r--r--compiler/rustc_infer/src/infer/error_reporting/mod.rs19
-rw-r--r--compiler/rustc_lint/src/types.rs10
-rw-r--r--compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp8
-rw-r--r--compiler/rustc_session/src/filesearch.rs22
-rw-r--r--compiler/rustc_session/src/search_paths.rs22
-rw-r--r--compiler/rustc_session/src/session.rs30
-rw-r--r--compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs5
-rw-r--r--compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs33
-rw-r--r--library/alloc/src/borrow.rs6
-rw-r--r--library/core/src/mem/manually_drop.rs6
-rw-r--r--library/core/src/ops/deref.rs6
-rw-r--r--library/std/src/net/tcp.rs51
-rw-r--r--src/librustdoc/passes/doc_test_lints.rs1
-rw-r--r--src/test/run-make-fulldeps/sysroot-crates-are-unstable/test.py13
-rw-r--r--src/test/rustdoc-ui/lint-missing-doc-code-example.rs9
-rw-r--r--src/test/ui/associated-types/issue-19883.rs (renamed from src/test/ui/issues/issue-19883.rs)0
-rw-r--r--src/test/ui/associated-types/issue-19883.stderr (renamed from src/test/ui/issues/issue-19883.stderr)0
-rw-r--r--src/test/ui/associated-types/issue-21363.rs (renamed from src/test/ui/issues/issue-21363.rs)0
-rw-r--r--src/test/ui/async-await/auxiliary/issue-72470-lib.rs (renamed from src/test/ui/auxiliary/issue-72470-lib.rs)0
-rw-r--r--src/test/ui/async-await/issue-72470-llvm-dominate.rs (renamed from src/test/ui/issue-72470-llvm-dominate.rs)0
-rw-r--r--src/test/ui/closures/issue-78720.rs (renamed from src/test/ui/issues/issue-78720.rs)0
-rw-r--r--src/test/ui/closures/issue-78720.stderr (renamed from src/test/ui/issues/issue-78720.stderr)0
-rw-r--r--src/test/ui/consts/issue-23833.rs (renamed from src/test/ui/issues/issue-23833.rs)0
-rw-r--r--src/test/ui/consts/issue-34784.rs (renamed from src/test/ui/issues/issue-34784.rs)0
-rw-r--r--src/test/ui/deriving/issue-3935.rs (renamed from src/test/ui/issues/issue-3935.rs)0
-rw-r--r--src/test/ui/generator/issue-88653.rs19
-rw-r--r--src/test/ui/generator/issue-88653.stderr12
-rw-r--r--src/test/ui/generics/mid-path-type-params.rs (renamed from src/test/ui/mid-path-type-params.rs)0
-rw-r--r--src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.rs (renamed from src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs)0
-rw-r--r--src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.stderr (renamed from src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr)0
-rw-r--r--src/test/ui/inference/issue-71309.rs7
-rw-r--r--src/test/ui/inference/issue-71309.stderr15
-rw-r--r--src/test/ui/issues/issue-51632-try-desugar-incompatible-types.rs2
-rw-r--r--src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr3
-rw-r--r--src/test/ui/issues/issue-5791.rs14
-rw-r--r--src/test/ui/issues/issue-5791.stderr21
-rw-r--r--src/test/ui/lint/enable-unstable-lib-feature.rs (renamed from src/test/ui/enable-unstable-lib-feature.rs)0
-rw-r--r--src/test/ui/lint/enable-unstable-lib-feature.stderr (renamed from src/test/ui/enable-unstable-lib-feature.stderr)0
-rw-r--r--src/test/ui/lint/issue-57410.rs (renamed from src/test/ui/issues/issue-57410.rs)0
-rw-r--r--src/test/ui/lint/issue-79744.rs (renamed from src/test/ui/issues/issue-79744.rs)0
-rw-r--r--src/test/ui/lint/issue-79744.stderr (renamed from src/test/ui/issues/issue-79744.stderr)0
-rw-r--r--src/test/ui/llvm-asm/issue-37433.rs (renamed from src/test/ui/issues/issue-37433.rs)0
-rw-r--r--src/test/ui/llvm-asm/issue-37433.stderr (renamed from src/test/ui/issues/issue-37433.stderr)0
-rw-r--r--src/test/ui/macros/auxiliary/define-macro.rs (renamed from src/test/ui/auxiliary/define-macro.rs)0
-rw-r--r--src/test/ui/macros/out-of-order-shadowing.rs (renamed from src/test/ui/out-of-order-shadowing.rs)0
-rw-r--r--src/test/ui/macros/out-of-order-shadowing.stderr (renamed from src/test/ui/out-of-order-shadowing.stderr)0
-rw-r--r--src/test/ui/match/guards.rs (renamed from src/test/ui/guards.rs)0
-rw-r--r--src/test/ui/match/issue-33498.rs (renamed from src/test/ui/issues/issue-33498.rs)0
-rw-r--r--src/test/ui/match/issue-41255.rs (renamed from src/test/ui/issues/issue-41255.rs)0
-rw-r--r--src/test/ui/match/issue-41255.stderr (renamed from src/test/ui/issues/issue-41255.stderr)0
-rw-r--r--src/test/ui/match/issue-56685.rs (renamed from src/test/ui/issues/issue-56685.rs)0
-rw-r--r--src/test/ui/match/issue-56685.stderr (renamed from src/test/ui/issues/issue-56685.stderr)0
-rw-r--r--src/test/ui/never_type/expr-empty-ret.rs (renamed from src/test/ui/expr-empty-ret.rs)0
-rw-r--r--src/test/ui/polymorphization/issue-74614.rs (renamed from src/test/ui/issues/issue-74614.rs)0
-rw-r--r--src/test/ui/privacy/issue-79593.rs (renamed from src/test/ui/issues/issue-79593.rs)0
-rw-r--r--src/test/ui/privacy/issue-79593.stderr (renamed from src/test/ui/issues/issue-79593.stderr)0
-rw-r--r--src/test/ui/repr/repr-transparent-issue-87496.rs12
-rw-r--r--src/test/ui/repr/repr-transparent-issue-87496.stderr16
-rw-r--r--src/test/ui/resolve/issue-42944.rs (renamed from src/test/ui/issues/issue-42944.rs)0
-rw-r--r--src/test/ui/resolve/issue-42944.stderr (renamed from src/test/ui/issues/issue-42944.stderr)0
-rw-r--r--src/test/ui/resolve/use-self-in-inner-fn.rs (renamed from src/test/ui/use-self-in-inner-fn.rs)0
-rw-r--r--src/test/ui/resolve/use-self-in-inner-fn.stderr (renamed from src/test/ui/use-self-in-inner-fn.stderr)0
-rw-r--r--src/test/ui/specialization/issue-35376.rs (renamed from src/test/ui/issues/issue-35376.rs)0
-rw-r--r--src/test/ui/specialization/issue-35376.stderr (renamed from src/test/ui/issues/issue-35376.stderr)0
-rw-r--r--src/test/ui/static/issue-34194.rs (renamed from src/test/ui/issues/issue-34194.rs)0
-rw-r--r--src/test/ui/structs-enums/issue-38002.rs (renamed from src/test/ui/issues/issue-38002.rs)0
-rw-r--r--src/test/ui/symbol-names/issue-53912.rs (renamed from src/test/ui/issues/issue-53912.rs)0
-rw-r--r--src/test/ui/test-attrs/issue-36768.rs (renamed from src/test/ui/issues/issue-36768.rs)0
-rw-r--r--src/test/ui/thread-local/tls.rs (renamed from src/test/ui/tls.rs)0
-rw-r--r--src/test/ui/traits/bug-7183-generics.rs (renamed from src/test/ui/bug-7183-generics.rs)0
-rw-r--r--src/test/ui/traits/issue-20692.rs (renamed from src/test/ui/issues/issue-20692.rs)0
-rw-r--r--src/test/ui/traits/issue-20692.stderr (renamed from src/test/ui/issues/issue-20692.stderr)0
-rw-r--r--src/test/ui/traits/issue-23825.rs (renamed from src/test/ui/issues/issue-23825.rs)0
-rw-r--r--src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.mir.stderr (renamed from src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.mir.stderr)0
-rw-r--r--src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.rs (renamed from src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.rs)0
-rw-r--r--src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.thir.stderr (renamed from src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.thir.stderr)0
-rw-r--r--src/tools/tidy/src/ui_tests.rs4
81 files changed, 283 insertions, 111 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs
index 4fb51ecc1d3..826c09cd948 100644
--- a/compiler/rustc_codegen_ssa/src/back/link.rs
+++ b/compiler/rustc_codegen_ssa/src/back/link.rs
@@ -637,7 +637,7 @@ fn link_dwarf_object<'a>(sess: &'a Session, executable_out_filename: &Path) {
     cmd.arg("-o");
     cmd.arg(&dwp_out_filename);
 
-    let mut new_path = sess.host_filesearch(PathKind::All).get_tools_search_paths(false);
+    let mut new_path = sess.get_tools_search_paths(false);
     if let Some(path) = env::var_os("PATH") {
         new_path.extend(env::split_paths(&path));
     }
@@ -2555,8 +2555,7 @@ fn add_gcc_ld_path(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
             match ld_impl {
                 LdImpl::Lld => {
                     if sess.target.lld_flavor == LldFlavor::Ld64 {
-                        let tools_path =
-                            sess.host_filesearch(PathKind::All).get_tools_search_paths(false);
+                        let tools_path = sess.get_tools_search_paths(false);
                         let ld64_exe = tools_path
                             .into_iter()
                             .map(|p| p.join("gcc-ld"))
@@ -2571,8 +2570,7 @@ fn add_gcc_ld_path(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
                             arg
                         });
                     } else {
-                        let tools_path =
-                            sess.host_filesearch(PathKind::All).get_tools_search_paths(false);
+                        let tools_path = sess.get_tools_search_paths(false);
                         let lld_path = tools_path
                             .into_iter()
                             .map(|p| p.join("gcc-ld"))
diff --git a/compiler/rustc_codegen_ssa/src/back/linker.rs b/compiler/rustc_codegen_ssa/src/back/linker.rs
index 9e1c6a169f1..e3b0eea0d89 100644
--- a/compiler/rustc_codegen_ssa/src/back/linker.rs
+++ b/compiler/rustc_codegen_ssa/src/back/linker.rs
@@ -15,7 +15,6 @@ use rustc_middle::middle::dependency_format::Linkage;
 use rustc_middle::ty::TyCtxt;
 use rustc_serialize::{json, Encoder};
 use rustc_session::config::{self, CrateType, DebugInfo, LinkerPluginLto, Lto, OptLevel, Strip};
-use rustc_session::search_paths::PathKind;
 use rustc_session::Session;
 use rustc_span::symbol::Symbol;
 use rustc_target::spec::{LinkOutputKind, LinkerFlavor, LldFlavor};
@@ -101,7 +100,7 @@ pub fn get_linker<'a>(
 
     // The compiler's sysroot often has some bundled tools, so add it to the
     // PATH for the child.
-    let mut new_path = sess.host_filesearch(PathKind::All).get_tools_search_paths(self_contained);
+    let mut new_path = sess.get_tools_search_paths(self_contained);
     let mut msvc_changed_path = false;
     if sess.target.is_like_msvc {
         if let Some(ref tool) = msvc_tool {
diff --git a/compiler/rustc_driver/src/lib.rs b/compiler/rustc_driver/src/lib.rs
index 53053327d0d..4c6a2baaef1 100644
--- a/compiler/rustc_driver/src/lib.rs
+++ b/compiler/rustc_driver/src/lib.rs
@@ -677,10 +677,7 @@ impl RustcDefaultCalls {
                     println!("{}", targets.join("\n"));
                 }
                 Sysroot => println!("{}", sess.sysroot.display()),
-                TargetLibdir => println!(
-                    "{}",
-                    sess.target_tlib_path.as_ref().unwrap_or(&sess.host_tlib_path).dir.display()
-                ),
+                TargetLibdir => println!("{}", sess.target_tlib_path.dir.display()),
                 TargetSpec => println!("{}", sess.target.to_json().pretty()),
                 FileNames | CrateName => {
                     let input = input.unwrap_or_else(|| {
diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs
index 232cf4bdb7f..41a73268f46 100644
--- a/compiler/rustc_errors/src/diagnostic.rs
+++ b/compiler/rustc_errors/src/diagnostic.rs
@@ -74,6 +74,10 @@ impl DiagnosticStyledString {
     pub fn highlighted<S: Into<String>>(t: S) -> DiagnosticStyledString {
         DiagnosticStyledString(vec![StringPart::Highlighted(t.into())])
     }
+
+    pub fn content(&self) -> String {
+        self.0.iter().map(|x| x.content()).collect::<String>()
+    }
 }
 
 #[derive(Debug, PartialEq, Eq)]
@@ -82,6 +86,14 @@ pub enum StringPart {
     Highlighted(String),
 }
 
+impl StringPart {
+    pub fn content(&self) -> &str {
+        match self {
+            &StringPart::Normal(ref s) | &StringPart::Highlighted(ref s) => s,
+        }
+    }
+}
+
 impl Diagnostic {
     pub fn new(level: Level, message: &str) -> Self {
         Diagnostic::new_with_code(level, None, message)
diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs
index 1139b714d0a..b8089b2499b 100644
--- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs
+++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs
@@ -1971,6 +1971,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
         trace: TypeTrace<'tcx>,
         terr: &TypeError<'tcx>,
     ) -> DiagnosticBuilder<'tcx> {
+        use crate::traits::ObligationCauseCode::MatchExpressionArm;
+
         debug!("report_and_explain_type_error(trace={:?}, terr={:?})", trace, terr);
 
         let span = trace.cause.span(self.tcx);
@@ -2013,6 +2015,19 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
                         _ => {}
                     }
                 }
+                if let MatchExpressionArm(box MatchExpressionArmCause { source, .. }) =
+                    trace.cause.code
+                {
+                    if let hir::MatchSource::TryDesugar = source {
+                        if let Some((expected_ty, found_ty)) = self.values_str(trace.values) {
+                            err.note(&format!(
+                                "`?` operator cannot convert from `{}` to `{}`",
+                                found_ty.content(),
+                                expected_ty.content(),
+                            ));
+                        }
+                    }
+                }
                 err
             }
             FailureCode::Error0644(failure_str) => {
@@ -2585,9 +2600,7 @@ impl<'tcx> ObligationCauseExt<'tcx> for ObligationCause<'tcx> {
             CompareImplTypeObligation { .. } => Error0308("type not compatible with trait"),
             MatchExpressionArm(box MatchExpressionArmCause { source, .. }) => {
                 Error0308(match source {
-                    hir::MatchSource::TryDesugar => {
-                        "try expression alternatives have incompatible types"
-                    }
+                    hir::MatchSource::TryDesugar => "`?` operator has incompatible types",
                     _ => "`match` arms have incompatible types",
                 })
             }
diff --git a/compiler/rustc_lint/src/types.rs b/compiler/rustc_lint/src/types.rs
index 0143978cfba..d35497c1b38 100644
--- a/compiler/rustc_lint/src/types.rs
+++ b/compiler/rustc_lint/src/types.rs
@@ -851,12 +851,18 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
         use FfiResult::*;
 
         if def.repr.transparent() {
-            // Can assume that only one field is not a ZST, so only check
+            // Can assume that at most one field is not a ZST, so only check
             // that field's type for FFI-safety.
             if let Some(field) = transparent_newtype_field(self.cx.tcx, variant) {
                 self.check_field_type_for_ffi(cache, field, substs)
             } else {
-                bug!("malformed transparent type");
+                // All fields are ZSTs; this means that the type should behave
+                // like (), which is FFI-unsafe
+                FfiUnsafe {
+                    ty,
+                    reason: "this struct contains only zero-sized fields".into(),
+                    help: None,
+                }
             }
         } else {
             // We can't completely trust repr(C) markings; make sure the fields are
diff --git a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
index b3f86f3295a..b7cad1c3ba6 100644
--- a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
+++ b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
@@ -875,7 +875,11 @@ LLVMRustOptimizeWithNewPassManager(
 #if LLVM_VERSION_GE(11, 0)
       OptimizerLastEPCallbacks.push_back(
         [Options](ModulePassManager &MPM, OptimizationLevel Level) {
+#if LLVM_VERSION_GE(14, 0)
+          MPM.addPass(ModuleMemorySanitizerPass(Options));
+#else
           MPM.addPass(MemorySanitizerPass(Options));
+#endif
           MPM.addPass(createModuleToFunctionPassAdaptor(MemorySanitizerPass(Options)));
         }
       );
@@ -897,7 +901,11 @@ LLVMRustOptimizeWithNewPassManager(
 #if LLVM_VERSION_GE(11, 0)
       OptimizerLastEPCallbacks.push_back(
         [](ModulePassManager &MPM, OptimizationLevel Level) {
+#if LLVM_VERSION_GE(14, 0)
+          MPM.addPass(ModuleThreadSanitizerPass());
+#else
           MPM.addPass(ThreadSanitizerPass());
+#endif
           MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
         }
       );
diff --git a/compiler/rustc_session/src/filesearch.rs b/compiler/rustc_session/src/filesearch.rs
index 6fe6a555f1a..9359a55e55a 100644
--- a/compiler/rustc_session/src/filesearch.rs
+++ b/compiler/rustc_session/src/filesearch.rs
@@ -1,3 +1,5 @@
+//! A module for searching for libraries
+
 pub use self::FileMatch::*;
 
 use std::env;
@@ -14,8 +16,6 @@ pub enum FileMatch {
     FileDoesntMatch,
 }
 
-// A module for searching for libraries
-
 #[derive(Clone)]
 pub struct FileSearch<'a> {
     sysroot: &'a Path,
@@ -83,22 +83,10 @@ impl<'a> FileSearch<'a> {
         FileSearch { sysroot, triple, search_paths, tlib_path, kind }
     }
 
-    // Returns just the directories within the search paths.
+    /// Returns just the directories within the search paths.
     pub fn search_path_dirs(&self) -> Vec<PathBuf> {
         self.search_paths().map(|sp| sp.dir.to_path_buf()).collect()
     }
-
-    // Returns a list of directories where target-specific tool binaries are located.
-    pub fn get_tools_search_paths(&self, self_contained: bool) -> Vec<PathBuf> {
-        let rustlib_path = rustc_target::target_rustlib_path(self.sysroot, &self.triple);
-        let p = std::array::IntoIter::new([
-            Path::new(&self.sysroot),
-            Path::new(&rustlib_path),
-            Path::new("bin"),
-        ])
-        .collect::<PathBuf>();
-        if self_contained { vec![p.clone(), p.join("self-contained")] } else { vec![p] }
-    }
 }
 
 pub fn make_target_lib_path(sysroot: &Path, target_triple: &str) -> PathBuf {
@@ -107,8 +95,8 @@ pub fn make_target_lib_path(sysroot: &Path, target_triple: &str) -> PathBuf {
         .collect::<PathBuf>()
 }
 
-// This function checks if sysroot is found using env::args().next(), and if it
-// is not found, uses env::current_exe() to imply sysroot.
+/// This function checks if sysroot is found using env::args().next(), and if it
+/// is not found, uses env::current_exe() to imply sysroot.
 pub fn get_or_default_sysroot() -> PathBuf {
     // Follow symlinks.  If the resolved path is relative, make it absolute.
     fn canonicalize(path: PathBuf) -> PathBuf {
diff --git a/compiler/rustc_session/src/search_paths.rs b/compiler/rustc_session/src/search_paths.rs
index 83b737a73b1..acb6c735e05 100644
--- a/compiler/rustc_session/src/search_paths.rs
+++ b/compiler/rustc_session/src/search_paths.rs
@@ -9,17 +9,17 @@ pub struct SearchPath {
     pub files: Vec<SearchPathFile>,
 }
 
-// The obvious implementation of `SearchPath::files` is a `Vec<PathBuf>`. But
-// it is searched repeatedly by `find_library_crate`, and the searches involve
-// checking the prefix and suffix of the filename of each `PathBuf`. This is
-// doable, but very slow, because it involves calls to `file_name` and
-// `extension` that are themselves slow.
-//
-// This type augments the `PathBuf` with an `Option<String>` containing the
-// `PathBuf`'s filename. The prefix and suffix checking is much faster on the
-// `Option<String>` than the `PathBuf`. (It's an `Option` because
-// `Path::file_name` can fail; if that happens then all subsequent checking
-// will also fail, which is fine.)
+/// The obvious implementation of `SearchPath::files` is a `Vec<PathBuf>`. But
+/// it is searched repeatedly by `find_library_crate`, and the searches involve
+/// checking the prefix and suffix of the filename of each `PathBuf`. This is
+/// doable, but very slow, because it involves calls to `file_name` and
+/// `extension` that are themselves slow.
+///
+/// This type augments the `PathBuf` with an `Option<String>` containing the
+/// `PathBuf`'s filename. The prefix and suffix checking is much faster on the
+/// `Option<String>` than the `PathBuf`. (It's an `Option` because
+/// `Path::file_name` can fail; if that happens then all subsequent checking
+/// will also fail, which is fine.)
 #[derive(Clone, Debug)]
 pub struct SearchPathFile {
     pub path: PathBuf,
diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs
index 4471e1e0ae8..d6f4a3ae4f1 100644
--- a/compiler/rustc_session/src/session.rs
+++ b/compiler/rustc_session/src/session.rs
@@ -36,7 +36,7 @@ use std::fmt;
 use std::io::Write;
 use std::num::NonZeroU32;
 use std::ops::{Div, Mul};
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
 use std::str::FromStr;
 use std::sync::Arc;
 use std::time::Duration;
@@ -131,9 +131,8 @@ pub struct Session {
     pub target: Target,
     pub host: Target,
     pub opts: config::Options,
-    pub host_tlib_path: SearchPath,
-    /// `None` if the host and target are the same.
-    pub target_tlib_path: Option<SearchPath>,
+    pub host_tlib_path: Lrc<SearchPath>,
+    pub target_tlib_path: Lrc<SearchPath>,
     pub parse_sess: ParseSess,
     pub sysroot: PathBuf,
     /// The name of the root source file of the crate, in the local file system.
@@ -787,8 +786,7 @@ impl Session {
             &self.sysroot,
             self.opts.target_triple.triple(),
             &self.opts.search_paths,
-            // `target_tlib_path == None` means it's the same as `host_tlib_path`.
-            self.target_tlib_path.as_ref().unwrap_or(&self.host_tlib_path),
+            &self.target_tlib_path,
             kind,
         )
     }
@@ -802,6 +800,18 @@ impl Session {
         )
     }
 
+    /// Returns a list of directories where target-specific tool binaries are located.
+    pub fn get_tools_search_paths(&self, self_contained: bool) -> Vec<PathBuf> {
+        let rustlib_path = rustc_target::target_rustlib_path(&self.sysroot, &config::host_triple());
+        let p = std::array::IntoIter::new([
+            Path::new(&self.sysroot),
+            Path::new(&rustlib_path),
+            Path::new("bin"),
+        ])
+        .collect::<PathBuf>();
+        if self_contained { vec![p.clone(), p.join("self-contained")] } else { vec![p] }
+    }
+
     pub fn init_incr_comp_session(
         &self,
         session_dir: PathBuf,
@@ -1245,11 +1255,13 @@ pub fn build_session(
 
     let host_triple = config::host_triple();
     let target_triple = sopts.target_triple.triple();
-    let host_tlib_path = SearchPath::from_sysroot_and_triple(&sysroot, host_triple);
+    let host_tlib_path = Lrc::new(SearchPath::from_sysroot_and_triple(&sysroot, host_triple));
     let target_tlib_path = if host_triple == target_triple {
-        None
+        // Use the same `SearchPath` if host and target triple are identical to avoid unnecessary
+        // rescanning of the target lib path and an unnecessary allocation.
+        host_tlib_path.clone()
     } else {
-        Some(SearchPath::from_sysroot_and_triple(&sysroot, target_triple))
+        Lrc::new(SearchPath::from_sysroot_and_triple(&sysroot, target_triple))
     };
 
     let file_path_mapping = sopts.file_path_mapping();
diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
index 8c9acd3ba73..e435154d931 100644
--- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
@@ -722,7 +722,10 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
                 };
 
                 let found_did = match *found_trait_ty.kind() {
-                    ty::Closure(did, _) | ty::Foreign(did) | ty::FnDef(did, _) => Some(did),
+                    ty::Closure(did, _)
+                    | ty::Foreign(did)
+                    | ty::FnDef(did, _)
+                    | ty::Generator(did, ..) => Some(did),
                     ty::Adt(def, _) => Some(def.did),
                     _ => None,
                 };
diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
index f006bede409..ae61988928f 100644
--- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
+++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
@@ -1256,33 +1256,40 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
             trait_ref: ty::PolyTraitRef<'tcx>,
         ) -> String {
             let inputs = trait_ref.skip_binder().substs.type_at(1);
-            let sig = if let ty::Tuple(inputs) = inputs.kind() {
-                tcx.mk_fn_sig(
-                    inputs.iter().map(|k| k.expect_ty()),
-                    tcx.mk_ty_infer(ty::TyVar(ty::TyVid::from_u32(0))),
-                    false,
-                    hir::Unsafety::Normal,
-                    abi::Abi::Rust,
-                )
-            } else {
-                tcx.mk_fn_sig(
+            let sig = match inputs.kind() {
+                ty::Tuple(inputs)
+                    if tcx.fn_trait_kind_from_lang_item(trait_ref.def_id()).is_some() =>
+                {
+                    tcx.mk_fn_sig(
+                        inputs.iter().map(|k| k.expect_ty()),
+                        tcx.mk_ty_infer(ty::TyVar(ty::TyVid::from_u32(0))),
+                        false,
+                        hir::Unsafety::Normal,
+                        abi::Abi::Rust,
+                    )
+                }
+                _ => tcx.mk_fn_sig(
                     std::iter::once(inputs),
                     tcx.mk_ty_infer(ty::TyVar(ty::TyVid::from_u32(0))),
                     false,
                     hir::Unsafety::Normal,
                     abi::Abi::Rust,
-                )
+                ),
             };
             trait_ref.rebind(sig).to_string()
         }
 
-        let argument_is_closure = expected_ref.skip_binder().substs.type_at(0).is_closure();
+        let argument_kind = match expected_ref.skip_binder().substs.type_at(0) {
+            t if t.is_closure() => "closure",
+            t if t.is_generator() => "generator",
+            _ => "function",
+        };
         let mut err = struct_span_err!(
             self.tcx.sess,
             span,
             E0631,
             "type mismatch in {} arguments",
-            if argument_is_closure { "closure" } else { "function" }
+            argument_kind
         );
 
         let found_str = format!("expected signature of `{}`", build_fn_sig_string(self.tcx, found));
diff --git a/library/alloc/src/borrow.rs b/library/alloc/src/borrow.rs
index 482a497201d..9ecbf058231 100644
--- a/library/alloc/src/borrow.rs
+++ b/library/alloc/src/borrow.rs
@@ -330,7 +330,11 @@ impl<B: ?Sized + ToOwned> Cow<'_, B> {
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
-impl<B: ?Sized + ToOwned> Deref for Cow<'_, B> {
+#[rustc_const_unstable(feature = "const_deref", issue = "88955")]
+impl<B: ?Sized + ToOwned> const Deref for Cow<'_, B>
+where
+    B::Owned: ~const Borrow<B>,
+{
     type Target = B;
 
     fn deref(&self) -> &B {
diff --git a/library/core/src/mem/manually_drop.rs b/library/core/src/mem/manually_drop.rs
index d86939454be..20b6453990d 100644
--- a/library/core/src/mem/manually_drop.rs
+++ b/library/core/src/mem/manually_drop.rs
@@ -145,7 +145,8 @@ impl<T: ?Sized> ManuallyDrop<T> {
 }
 
 #[stable(feature = "manually_drop", since = "1.20.0")]
-impl<T: ?Sized> Deref for ManuallyDrop<T> {
+#[rustc_const_unstable(feature = "const_deref", issue = "88955")]
+impl<T: ?Sized> const Deref for ManuallyDrop<T> {
     type Target = T;
     #[inline(always)]
     fn deref(&self) -> &T {
@@ -154,7 +155,8 @@ impl<T: ?Sized> Deref for ManuallyDrop<T> {
 }
 
 #[stable(feature = "manually_drop", since = "1.20.0")]
-impl<T: ?Sized> DerefMut for ManuallyDrop<T> {
+#[rustc_const_unstable(feature = "const_deref", issue = "88955")]
+impl<T: ?Sized> const DerefMut for ManuallyDrop<T> {
     #[inline(always)]
     fn deref_mut(&mut self) -> &mut T {
         &mut self.value
diff --git a/library/core/src/ops/deref.rs b/library/core/src/ops/deref.rs
index dcf3ce070ec..fb4ec83bc28 100644
--- a/library/core/src/ops/deref.rs
+++ b/library/core/src/ops/deref.rs
@@ -76,7 +76,8 @@ pub trait Deref {
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
-impl<T: ?Sized> Deref for &T {
+#[rustc_const_unstable(feature = "const_deref", issue = "88955")]
+impl<T: ?Sized> const Deref for &T {
     type Target = T;
 
     #[rustc_diagnostic_item = "noop_method_deref"]
@@ -89,7 +90,8 @@ impl<T: ?Sized> Deref for &T {
 impl<T: ?Sized> !DerefMut for &T {}
 
 #[stable(feature = "rust1", since = "1.0.0")]
-impl<T: ?Sized> Deref for &mut T {
+#[rustc_const_unstable(feature = "const_deref", issue = "88955")]
+impl<T: ?Sized> const Deref for &mut T {
     type Target = T;
 
     fn deref(&self) -> &T {
diff --git a/library/std/src/net/tcp.rs b/library/std/src/net/tcp.rs
index 5b4a9fa7979..223726d45d7 100644
--- a/library/std/src/net/tcp.rs
+++ b/library/std/src/net/tcp.rs
@@ -96,6 +96,18 @@ pub struct Incoming<'a> {
     listener: &'a TcpListener,
 }
 
+/// An iterator that infinitely [`accept`]s connections on a [`TcpListener`].
+///
+/// This `struct` is created by the [`TcpListener::into_incoming`] method.
+/// See its documentation for more.
+///
+/// [`accept`]: TcpListener::accept
+#[derive(Debug)]
+#[unstable(feature = "tcplistener_into_incoming", issue = "88339")]
+pub struct IntoIncoming {
+    listener: TcpListener,
+}
+
 impl TcpStream {
     /// Opens a TCP connection to a remote host.
     ///
@@ -845,6 +857,37 @@ impl TcpListener {
         Incoming { listener: self }
     }
 
+    /// Turn this into an iterator over the connections being received on this
+    /// listener.
+    ///
+    /// The returned iterator will never return [`None`] and will also not yield
+    /// the peer's [`SocketAddr`] structure. Iterating over it is equivalent to
+    /// calling [`TcpListener::accept`] in a loop.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// #![feature(tcplistener_into_incoming)]
+    /// use std::net::{TcpListener, TcpStream};
+    ///
+    /// fn listen_on(port: u16) -> impl Iterator<Item = TcpStream> {
+    ///     let listener = TcpListener::bind("127.0.0.1:80").unwrap();
+    ///     listener.into_incoming()
+    ///         .filter_map(Result::ok) /* Ignore failed connections */
+    /// }
+    ///
+    /// fn main() -> std::io::Result<()> {
+    ///     for stream in listen_on(80) {
+    ///         /* handle the connection here */
+    ///     }
+    ///     Ok(())
+    /// }
+    /// ```
+    #[unstable(feature = "tcplistener_into_incoming", issue = "88339")]
+    pub fn into_incoming(self) -> IntoIncoming {
+        IntoIncoming { listener: self }
+    }
+
     /// Sets the value for the `IP_TTL` option on this socket.
     ///
     /// This value sets the time-to-live field that is used in every packet sent
@@ -982,6 +1025,14 @@ impl<'a> Iterator for Incoming<'a> {
     }
 }
 
+#[unstable(feature = "tcplistener_into_incoming", issue = "88339")]
+impl Iterator for IntoIncoming {
+    type Item = io::Result<TcpStream>;
+    fn next(&mut self) -> Option<io::Result<TcpStream>> {
+        Some(self.listener.accept().map(|p| p.0))
+    }
+}
+
 impl AsInner<net_imp::TcpListener> for TcpListener {
     fn as_inner(&self) -> &net_imp::TcpListener {
         &self.0
diff --git a/src/librustdoc/passes/doc_test_lints.rs b/src/librustdoc/passes/doc_test_lints.rs
index 1b5ec1b08fa..279d0dbda82 100644
--- a/src/librustdoc/passes/doc_test_lints.rs
+++ b/src/librustdoc/passes/doc_test_lints.rs
@@ -96,6 +96,7 @@ crate fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -> boo
 
     if cx.tcx.hir().attrs(hir_id).lists(sym::doc).has_word(sym::hidden)
         || inherits_doc_hidden(cx.tcx, hir_id)
+        || cx.tcx.hir().span(hir_id).in_derive_expansion()
     {
         return false;
     }
diff --git a/src/test/run-make-fulldeps/sysroot-crates-are-unstable/test.py b/src/test/run-make-fulldeps/sysroot-crates-are-unstable/test.py
index f479bdabb9c..cb77eb34fef 100644
--- a/src/test/run-make-fulldeps/sysroot-crates-are-unstable/test.py
+++ b/src/test/run-make-fulldeps/sysroot-crates-are-unstable/test.py
@@ -17,6 +17,17 @@ def convert_to_string(s):
     return s
 
 
+def set_ld_lib_path():
+    var = os.environ.get("LD_LIB_PATH_ENVVAR")
+    rpath = os.environ.get("HOST_RPATH_DIR")
+    if var and rpath:
+        path = os.environ.get(var)
+        if path:
+            os.environ[var] = rpath + os.pathsep + path
+        else:
+            os.environ[var] = rpath
+
+
 def exec_command(command, to_input=None):
     child = None
     if to_input is None:
@@ -50,7 +61,9 @@ def get_all_libs(dir_path):
             if isfile(join(dir_path, f)) and f.endswith('.rlib') and f not in STABLE_CRATES]
 
 
+set_ld_lib_path()
 sysroot = exec_command([os.environ['RUSTC'], '--print', 'sysroot'])[0].replace('\n', '')
+assert sysroot, "Could not read the rustc sysroot!"
 libs = get_all_libs(join(sysroot, 'lib/rustlib/{}/lib'.format(os.environ['TARGET'])))
 
 ret = 0
diff --git a/src/test/rustdoc-ui/lint-missing-doc-code-example.rs b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs
index 7dd2ebfedbb..fac6342cd24 100644
--- a/src/test/rustdoc-ui/lint-missing-doc-code-example.rs
+++ b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs
@@ -78,6 +78,15 @@ impl Clone for Struct {
 }
 
 
+
+/// doc
+///
+/// ```
+/// println!("hello");
+/// ```
+#[derive(Clone)]
+pub struct NiceStruct;
+
 #[doc(hidden)]
 pub mod foo {
     pub fn bar() {}
diff --git a/src/test/ui/issues/issue-19883.rs b/src/test/ui/associated-types/issue-19883.rs
index 5cf422043a5..5cf422043a5 100644
--- a/src/test/ui/issues/issue-19883.rs
+++ b/src/test/ui/associated-types/issue-19883.rs
diff --git a/src/test/ui/issues/issue-19883.stderr b/src/test/ui/associated-types/issue-19883.stderr
index bd6a86b7420..bd6a86b7420 100644
--- a/src/test/ui/issues/issue-19883.stderr
+++ b/src/test/ui/associated-types/issue-19883.stderr
diff --git a/src/test/ui/issues/issue-21363.rs b/src/test/ui/associated-types/issue-21363.rs
index acc28cb430b..acc28cb430b 100644
--- a/src/test/ui/issues/issue-21363.rs
+++ b/src/test/ui/associated-types/issue-21363.rs
diff --git a/src/test/ui/auxiliary/issue-72470-lib.rs b/src/test/ui/async-await/auxiliary/issue-72470-lib.rs
index 8383eba8912..8383eba8912 100644
--- a/src/test/ui/auxiliary/issue-72470-lib.rs
+++ b/src/test/ui/async-await/auxiliary/issue-72470-lib.rs
diff --git a/src/test/ui/issue-72470-llvm-dominate.rs b/src/test/ui/async-await/issue-72470-llvm-dominate.rs
index 5bb69a07305..5bb69a07305 100644
--- a/src/test/ui/issue-72470-llvm-dominate.rs
+++ b/src/test/ui/async-await/issue-72470-llvm-dominate.rs
diff --git a/src/test/ui/issues/issue-78720.rs b/src/test/ui/closures/issue-78720.rs
index 4cdb9f49113..4cdb9f49113 100644
--- a/src/test/ui/issues/issue-78720.rs
+++ b/src/test/ui/closures/issue-78720.rs
diff --git a/src/test/ui/issues/issue-78720.stderr b/src/test/ui/closures/issue-78720.stderr
index 3dd13877298..3dd13877298 100644
--- a/src/test/ui/issues/issue-78720.stderr
+++ b/src/test/ui/closures/issue-78720.stderr
diff --git a/src/test/ui/issues/issue-23833.rs b/src/test/ui/consts/issue-23833.rs
index d4128fa54e3..d4128fa54e3 100644
--- a/src/test/ui/issues/issue-23833.rs
+++ b/src/test/ui/consts/issue-23833.rs
diff --git a/src/test/ui/issues/issue-34784.rs b/src/test/ui/consts/issue-34784.rs
index 98d943470a7..98d943470a7 100644
--- a/src/test/ui/issues/issue-34784.rs
+++ b/src/test/ui/consts/issue-34784.rs
diff --git a/src/test/ui/issues/issue-3935.rs b/src/test/ui/deriving/issue-3935.rs
index e98d68e0eb2..e98d68e0eb2 100644
--- a/src/test/ui/issues/issue-3935.rs
+++ b/src/test/ui/deriving/issue-3935.rs
diff --git a/src/test/ui/generator/issue-88653.rs b/src/test/ui/generator/issue-88653.rs
new file mode 100644
index 00000000000..ce9159b53e0
--- /dev/null
+++ b/src/test/ui/generator/issue-88653.rs
@@ -0,0 +1,19 @@
+// Regression test for #88653, where a confusing warning about a
+// type mismatch in generator arguments was issued.
+
+#![feature(generators, generator_trait)]
+
+use std::ops::Generator;
+
+fn foo(bar: bool) -> impl Generator<(bool,)> {
+//~^ ERROR: type mismatch in generator arguments [E0631]
+//~| NOTE: expected signature of `fn((bool,)) -> _`
+    |bar| {
+    //~^ NOTE: found signature of `fn(bool) -> _`
+        if bar {
+            yield bar;
+        }
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/generator/issue-88653.stderr b/src/test/ui/generator/issue-88653.stderr
new file mode 100644
index 00000000000..5bd8ad129fe
--- /dev/null
+++ b/src/test/ui/generator/issue-88653.stderr
@@ -0,0 +1,12 @@
+error[E0631]: type mismatch in generator arguments
+  --> $DIR/issue-88653.rs:8:22
+   |
+LL | fn foo(bar: bool) -> impl Generator<(bool,)> {
+   |                      ^^^^^^^^^^^^^^^^^^^^^^^ expected signature of `fn((bool,)) -> _`
+...
+LL |     |bar| {
+   |     ----- found signature of `fn(bool) -> _`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0631`.
diff --git a/src/test/ui/mid-path-type-params.rs b/src/test/ui/generics/mid-path-type-params.rs
index a8128207c80..a8128207c80 100644
--- a/src/test/ui/mid-path-type-params.rs
+++ b/src/test/ui/generics/mid-path-type-params.rs
diff --git a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs b/src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.rs
index ecfa5c69e2f..ecfa5c69e2f 100644
--- a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs
+++ b/src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.rs
diff --git a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr b/src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.stderr
index 30322f88cca..30322f88cca 100644
--- a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr
+++ b/src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.stderr
diff --git a/src/test/ui/inference/issue-71309.rs b/src/test/ui/inference/issue-71309.rs
new file mode 100644
index 00000000000..c31107d8fed
--- /dev/null
+++ b/src/test/ui/inference/issue-71309.rs
@@ -0,0 +1,7 @@
+fn foo(x: Result<i32, ()>) -> Result<(), ()> {
+    let y: u32 = x?;
+    //~^ ERROR: `?` operator has incompatible types
+    Ok(())
+}
+
+fn main() {}
diff --git a/src/test/ui/inference/issue-71309.stderr b/src/test/ui/inference/issue-71309.stderr
new file mode 100644
index 00000000000..af8714f1c80
--- /dev/null
+++ b/src/test/ui/inference/issue-71309.stderr
@@ -0,0 +1,15 @@
+error[E0308]: `?` operator has incompatible types
+  --> $DIR/issue-71309.rs:2:18
+   |
+LL |     let y: u32 = x?;
+   |                  ^^ expected `u32`, found `i32`
+   |
+   = note: `?` operator cannot convert from `i32` to `u32`
+help: you can convert an `i32` to a `u32` and panic if the converted value doesn't fit
+   |
+LL |     let y: u32 = x?.try_into().unwrap();
+   |                    ++++++++++++++++++++
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.rs b/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.rs
index bb74f0e0dc3..35402dff675 100644
--- a/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.rs
+++ b/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.rs
@@ -6,7 +6,7 @@ fn missing_discourses() -> Result<isize, ()> {
 
 fn forbidden_narratives() -> Result<isize, ()> {
     missing_discourses()?
-    //~^ ERROR try expression alternatives have incompatible types
+    //~^ ERROR: `?` operator has incompatible types
 }
 
 fn main() {}
diff --git a/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr b/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr
index 2c821aa2308..0f61e03c3b5 100644
--- a/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr
+++ b/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr
@@ -1,9 +1,10 @@
-error[E0308]: try expression alternatives have incompatible types
+error[E0308]: `?` operator has incompatible types
   --> $DIR/issue-51632-try-desugar-incompatible-types.rs:8:5
    |
 LL |     missing_discourses()?
    |     ^^^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `isize`
    |
+   = note: `?` operator cannot convert from `isize` to `Result<isize, ()>`
    = note: expected enum `Result<isize, ()>`
               found type `isize`
 help: try removing this `?`
diff --git a/src/test/ui/issues/issue-5791.rs b/src/test/ui/issues/issue-5791.rs
deleted file mode 100644
index 3544160f094..00000000000
--- a/src/test/ui/issues/issue-5791.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// run-pass
-#![allow(dead_code)]
-#![warn(clashing_extern_declarations)]
-// pretty-expanded FIXME #23616
-
-extern "C" {
-    #[link_name = "malloc"]
-    fn malloc1(len: i32) -> *const u8;
-    #[link_name = "malloc"]
-    //~^ WARN `malloc2` redeclares `malloc` with a different signature
-    fn malloc2(len: i32, foo: i32) -> *const u8;
-}
-
-pub fn main() {}
diff --git a/src/test/ui/issues/issue-5791.stderr b/src/test/ui/issues/issue-5791.stderr
deleted file mode 100644
index cf60e609deb..00000000000
--- a/src/test/ui/issues/issue-5791.stderr
+++ /dev/null
@@ -1,21 +0,0 @@
-warning: `malloc2` redeclares `malloc` with a different signature
-  --> $DIR/issue-5791.rs:9:5
-   |
-LL | /     #[link_name = "malloc"]
-LL | |     fn malloc1(len: i32) -> *const u8;
-   | |______________________________________- `malloc` previously declared here
-LL | /     #[link_name = "malloc"]
-LL | |
-LL | |     fn malloc2(len: i32, foo: i32) -> *const u8;
-   | |________________________________________________^ this signature doesn't match the previous declaration
-   |
-note: the lint level is defined here
-  --> $DIR/issue-5791.rs:3:9
-   |
-LL | #![warn(clashing_extern_declarations)]
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   = note: expected `unsafe extern "C" fn(i32) -> *const u8`
-              found `unsafe extern "C" fn(i32, i32) -> *const u8`
-
-warning: 1 warning emitted
-
diff --git a/src/test/ui/enable-unstable-lib-feature.rs b/src/test/ui/lint/enable-unstable-lib-feature.rs
index aa6a973d7bd..aa6a973d7bd 100644
--- a/src/test/ui/enable-unstable-lib-feature.rs
+++ b/src/test/ui/lint/enable-unstable-lib-feature.rs
diff --git a/src/test/ui/enable-unstable-lib-feature.stderr b/src/test/ui/lint/enable-unstable-lib-feature.stderr
index bb4e928ad15..bb4e928ad15 100644
--- a/src/test/ui/enable-unstable-lib-feature.stderr
+++ b/src/test/ui/lint/enable-unstable-lib-feature.stderr
diff --git a/src/test/ui/issues/issue-57410.rs b/src/test/ui/lint/issue-57410.rs
index 0cf4b8068e4..0cf4b8068e4 100644
--- a/src/test/ui/issues/issue-57410.rs
+++ b/src/test/ui/lint/issue-57410.rs
diff --git a/src/test/ui/issues/issue-79744.rs b/src/test/ui/lint/issue-79744.rs
index e9725a027d3..e9725a027d3 100644
--- a/src/test/ui/issues/issue-79744.rs
+++ b/src/test/ui/lint/issue-79744.rs
diff --git a/src/test/ui/issues/issue-79744.stderr b/src/test/ui/lint/issue-79744.stderr
index 6f6dd44d236..6f6dd44d236 100644
--- a/src/test/ui/issues/issue-79744.stderr
+++ b/src/test/ui/lint/issue-79744.stderr
diff --git a/src/test/ui/issues/issue-37433.rs b/src/test/ui/llvm-asm/issue-37433.rs
index 1c362e8aba0..1c362e8aba0 100644
--- a/src/test/ui/issues/issue-37433.rs
+++ b/src/test/ui/llvm-asm/issue-37433.rs
diff --git a/src/test/ui/issues/issue-37433.stderr b/src/test/ui/llvm-asm/issue-37433.stderr
index 44a8eb32b7c..44a8eb32b7c 100644
--- a/src/test/ui/issues/issue-37433.stderr
+++ b/src/test/ui/llvm-asm/issue-37433.stderr
diff --git a/src/test/ui/auxiliary/define-macro.rs b/src/test/ui/macros/auxiliary/define-macro.rs
index 4956907c55e..4956907c55e 100644
--- a/src/test/ui/auxiliary/define-macro.rs
+++ b/src/test/ui/macros/auxiliary/define-macro.rs
diff --git a/src/test/ui/out-of-order-shadowing.rs b/src/test/ui/macros/out-of-order-shadowing.rs
index a0d1a973764..a0d1a973764 100644
--- a/src/test/ui/out-of-order-shadowing.rs
+++ b/src/test/ui/macros/out-of-order-shadowing.rs
diff --git a/src/test/ui/out-of-order-shadowing.stderr b/src/test/ui/macros/out-of-order-shadowing.stderr
index 1db31e0272c..1db31e0272c 100644
--- a/src/test/ui/out-of-order-shadowing.stderr
+++ b/src/test/ui/macros/out-of-order-shadowing.stderr
diff --git a/src/test/ui/guards.rs b/src/test/ui/match/guards.rs
index 10a4bb67387..10a4bb67387 100644
--- a/src/test/ui/guards.rs
+++ b/src/test/ui/match/guards.rs
diff --git a/src/test/ui/issues/issue-33498.rs b/src/test/ui/match/issue-33498.rs
index 9c8a97e7e6b..9c8a97e7e6b 100644
--- a/src/test/ui/issues/issue-33498.rs
+++ b/src/test/ui/match/issue-33498.rs
diff --git a/src/test/ui/issues/issue-41255.rs b/src/test/ui/match/issue-41255.rs
index 9d7072f1665..9d7072f1665 100644
--- a/src/test/ui/issues/issue-41255.rs
+++ b/src/test/ui/match/issue-41255.rs
diff --git a/src/test/ui/issues/issue-41255.stderr b/src/test/ui/match/issue-41255.stderr
index bf81c8d371c..bf81c8d371c 100644
--- a/src/test/ui/issues/issue-41255.stderr
+++ b/src/test/ui/match/issue-41255.stderr
diff --git a/src/test/ui/issues/issue-56685.rs b/src/test/ui/match/issue-56685.rs
index f320c99ed15..f320c99ed15 100644
--- a/src/test/ui/issues/issue-56685.rs
+++ b/src/test/ui/match/issue-56685.rs
diff --git a/src/test/ui/issues/issue-56685.stderr b/src/test/ui/match/issue-56685.stderr
index ccf357d4aa0..ccf357d4aa0 100644
--- a/src/test/ui/issues/issue-56685.stderr
+++ b/src/test/ui/match/issue-56685.stderr
diff --git a/src/test/ui/expr-empty-ret.rs b/src/test/ui/never_type/expr-empty-ret.rs
index ce8ffaf94d0..ce8ffaf94d0 100644
--- a/src/test/ui/expr-empty-ret.rs
+++ b/src/test/ui/never_type/expr-empty-ret.rs
diff --git a/src/test/ui/issues/issue-74614.rs b/src/test/ui/polymorphization/issue-74614.rs
index 8b0c00b1355..8b0c00b1355 100644
--- a/src/test/ui/issues/issue-74614.rs
+++ b/src/test/ui/polymorphization/issue-74614.rs
diff --git a/src/test/ui/issues/issue-79593.rs b/src/test/ui/privacy/issue-79593.rs
index b94278bfdd2..b94278bfdd2 100644
--- a/src/test/ui/issues/issue-79593.rs
+++ b/src/test/ui/privacy/issue-79593.rs
diff --git a/src/test/ui/issues/issue-79593.stderr b/src/test/ui/privacy/issue-79593.stderr
index b8c7d4f23a2..b8c7d4f23a2 100644
--- a/src/test/ui/issues/issue-79593.stderr
+++ b/src/test/ui/privacy/issue-79593.stderr
diff --git a/src/test/ui/repr/repr-transparent-issue-87496.rs b/src/test/ui/repr/repr-transparent-issue-87496.rs
new file mode 100644
index 00000000000..a4dd45c63f5
--- /dev/null
+++ b/src/test/ui/repr/repr-transparent-issue-87496.rs
@@ -0,0 +1,12 @@
+// Regression test for the ICE described in #87496.
+
+// check-pass
+
+#[repr(transparent)]
+struct TransparentCustomZst(());
+extern "C" {
+    fn good17(p: TransparentCustomZst);
+    //~^ WARNING: `extern` block uses type `TransparentCustomZst`, which is not FFI-safe
+}
+
+fn main() {}
diff --git a/src/test/ui/repr/repr-transparent-issue-87496.stderr b/src/test/ui/repr/repr-transparent-issue-87496.stderr
new file mode 100644
index 00000000000..c488755cc24
--- /dev/null
+++ b/src/test/ui/repr/repr-transparent-issue-87496.stderr
@@ -0,0 +1,16 @@
+warning: `extern` block uses type `TransparentCustomZst`, which is not FFI-safe
+  --> $DIR/repr-transparent-issue-87496.rs:8:18
+   |
+LL |     fn good17(p: TransparentCustomZst);
+   |                  ^^^^^^^^^^^^^^^^^^^^ not FFI-safe
+   |
+   = note: `#[warn(improper_ctypes)]` on by default
+   = note: this struct contains only zero-sized fields
+note: the type is defined here
+  --> $DIR/repr-transparent-issue-87496.rs:6:1
+   |
+LL | struct TransparentCustomZst(());
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+warning: 1 warning emitted
+
diff --git a/src/test/ui/issues/issue-42944.rs b/src/test/ui/resolve/issue-42944.rs
index a4404857a56..a4404857a56 100644
--- a/src/test/ui/issues/issue-42944.rs
+++ b/src/test/ui/resolve/issue-42944.rs
diff --git a/src/test/ui/issues/issue-42944.stderr b/src/test/ui/resolve/issue-42944.stderr
index 008492529d1..008492529d1 100644
--- a/src/test/ui/issues/issue-42944.stderr
+++ b/src/test/ui/resolve/issue-42944.stderr
diff --git a/src/test/ui/use-self-in-inner-fn.rs b/src/test/ui/resolve/use-self-in-inner-fn.rs
index eccb315feb1..eccb315feb1 100644
--- a/src/test/ui/use-self-in-inner-fn.rs
+++ b/src/test/ui/resolve/use-self-in-inner-fn.rs
diff --git a/src/test/ui/use-self-in-inner-fn.stderr b/src/test/ui/resolve/use-self-in-inner-fn.stderr
index 96609349924..96609349924 100644
--- a/src/test/ui/use-self-in-inner-fn.stderr
+++ b/src/test/ui/resolve/use-self-in-inner-fn.stderr
diff --git a/src/test/ui/issues/issue-35376.rs b/src/test/ui/specialization/issue-35376.rs
index cc35213b93d..cc35213b93d 100644
--- a/src/test/ui/issues/issue-35376.rs
+++ b/src/test/ui/specialization/issue-35376.rs
diff --git a/src/test/ui/issues/issue-35376.stderr b/src/test/ui/specialization/issue-35376.stderr
index 835277d408e..835277d408e 100644
--- a/src/test/ui/issues/issue-35376.stderr
+++ b/src/test/ui/specialization/issue-35376.stderr
diff --git a/src/test/ui/issues/issue-34194.rs b/src/test/ui/static/issue-34194.rs
index 6dce556e9e3..6dce556e9e3 100644
--- a/src/test/ui/issues/issue-34194.rs
+++ b/src/test/ui/static/issue-34194.rs
diff --git a/src/test/ui/issues/issue-38002.rs b/src/test/ui/structs-enums/issue-38002.rs
index fdb31fc44a1..fdb31fc44a1 100644
--- a/src/test/ui/issues/issue-38002.rs
+++ b/src/test/ui/structs-enums/issue-38002.rs
diff --git a/src/test/ui/issues/issue-53912.rs b/src/test/ui/symbol-names/issue-53912.rs
index 65b6825a832..65b6825a832 100644
--- a/src/test/ui/issues/issue-53912.rs
+++ b/src/test/ui/symbol-names/issue-53912.rs
diff --git a/src/test/ui/issues/issue-36768.rs b/src/test/ui/test-attrs/issue-36768.rs
index f671cbc8205..f671cbc8205 100644
--- a/src/test/ui/issues/issue-36768.rs
+++ b/src/test/ui/test-attrs/issue-36768.rs
diff --git a/src/test/ui/tls.rs b/src/test/ui/thread-local/tls.rs
index fbd3413885f..fbd3413885f 100644
--- a/src/test/ui/tls.rs
+++ b/src/test/ui/thread-local/tls.rs
diff --git a/src/test/ui/bug-7183-generics.rs b/src/test/ui/traits/bug-7183-generics.rs
index f53a1736127..f53a1736127 100644
--- a/src/test/ui/bug-7183-generics.rs
+++ b/src/test/ui/traits/bug-7183-generics.rs
diff --git a/src/test/ui/issues/issue-20692.rs b/src/test/ui/traits/issue-20692.rs
index 1cb2d8c7302..1cb2d8c7302 100644
--- a/src/test/ui/issues/issue-20692.rs
+++ b/src/test/ui/traits/issue-20692.rs
diff --git a/src/test/ui/issues/issue-20692.stderr b/src/test/ui/traits/issue-20692.stderr
index 1d7f252e556..1d7f252e556 100644
--- a/src/test/ui/issues/issue-20692.stderr
+++ b/src/test/ui/traits/issue-20692.stderr
diff --git a/src/test/ui/issues/issue-23825.rs b/src/test/ui/traits/issue-23825.rs
index a9f0095d2e2..a9f0095d2e2 100644
--- a/src/test/ui/issues/issue-23825.rs
+++ b/src/test/ui/traits/issue-23825.rs
diff --git a/src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.mir.stderr b/src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.mir.stderr
index 9e9cbcf33ae..9e9cbcf33ae 100644
--- a/src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.mir.stderr
+++ b/src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.mir.stderr
diff --git a/src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.rs b/src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.rs
index ac1cfd62a05..ac1cfd62a05 100644
--- a/src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.rs
+++ b/src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.rs
diff --git a/src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.thir.stderr b/src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.thir.stderr
index 9e9cbcf33ae..9e9cbcf33ae 100644
--- a/src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.thir.stderr
+++ b/src/test/ui/unsafe/issue-45107-unnecessary-unsafe-in-closure.thir.stderr
diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs
index 46b5b877b4c..a341527c84c 100644
--- a/src/tools/tidy/src/ui_tests.rs
+++ b/src/tools/tidy/src/ui_tests.rs
@@ -7,8 +7,8 @@ use std::path::Path;
 
 const ENTRY_LIMIT: usize = 1000;
 // FIXME: The following limits should be reduced eventually.
-const ROOT_ENTRY_LIMIT: usize = 1345;
-const ISSUES_ENTRY_LIMIT: usize = 2525;
+const ROOT_ENTRY_LIMIT: usize = 1330;
+const ISSUES_ENTRY_LIMIT: usize = 2488;
 
 fn check_entries(path: &Path, bad: &mut bool) {
     let dirs = walkdir::WalkDir::new(&path.join("test/ui"))