From 4e76c3820fea97e06f08555d4eeee3de3be4eb5a Mon Sep 17 00:00:00 2001 From: Fabian Wolff Date: Tue, 27 Jul 2021 23:40:32 +0200 Subject: [PATCH 01/13] Fix ICE in `improper_ctypes_definitions` lint with all-ZST transparent types --- compiler/rustc_lint/src/types.rs | 10 ++++++++-- src/test/ui/repr/repr-transparent-issue-87496.rs | 12 ++++++++++++ .../ui/repr/repr-transparent-issue-87496.stderr | 16 ++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/repr/repr-transparent-issue-87496.rs create mode 100644 src/test/ui/repr/repr-transparent-issue-87496.stderr diff --git a/compiler/rustc_lint/src/types.rs b/compiler/rustc_lint/src/types.rs index a3a87a48768dc..639fe5ca2a46a 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/src/test/ui/repr/repr-transparent-issue-87496.rs b/src/test/ui/repr/repr-transparent-issue-87496.rs new file mode 100644 index 0000000000000..a4dd45c63f564 --- /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 0000000000000..c488755cc242c --- /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 + From ced597edb7e154092efde9df975ee76f9642a200 Mon Sep 17 00:00:00 2001 From: piegames Date: Wed, 25 Aug 2021 20:22:19 +0200 Subject: [PATCH 02/13] Add TcpListener::into_incoming and IntoIncoming The `incoming` method is really useful, however for some use cases the borrow this introduces is needlessly restricting. Thus, an owned variant is added. --- library/std/src/net/tcp.rs | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/library/std/src/net/tcp.rs b/library/std/src/net/tcp.rs index 336891ec1eb94..45f5f3dac85a5 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. /// @@ -798,6 +810,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 { + /// 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 @@ -935,6 +978,14 @@ impl<'a> Iterator for Incoming<'a> { } } +#[unstable(feature = "tcplistener_into_incoming", issue = "88339")] +impl Iterator for IntoIncoming { + type Item = io::Result; + fn next(&mut self) -> Option> { + Some(self.listener.accept().map(|p| p.0)) + } +} + impl AsInner for TcpListener { fn as_inner(&self) -> &net_imp::TcpListener { &self.0 From a4a22f07d79b1a2adc6e59811ebfbcd8b2cf21a4 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Tue, 31 Aug 2021 18:31:29 +0200 Subject: [PATCH 03/13] Doc comments --- compiler/rustc_session/src/filesearch.rs | 12 ++++++------ compiler/rustc_session/src/search_paths.rs | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/compiler/rustc_session/src/filesearch.rs b/compiler/rustc_session/src/filesearch.rs index 6fe6a555f1af8..a9999e1d92197 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,12 +83,12 @@ 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 { self.search_paths().map(|sp| sp.dir.to_path_buf()).collect() } - // Returns a list of directories where target-specific tool binaries are located. + /// Returns a list of directories where target-specific tool binaries are located. pub fn get_tools_search_paths(&self, self_contained: bool) -> Vec { let rustlib_path = rustc_target::target_rustlib_path(self.sysroot, &self.triple); let p = std::array::IntoIter::new([ @@ -107,8 +107,8 @@ pub fn make_target_lib_path(sysroot: &Path, target_triple: &str) -> PathBuf { .collect::() } -// 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 83b737a73b1e8..acb6c735e051e 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, } -// The obvious implementation of `SearchPath::files` is a `Vec`. 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` containing the -// `PathBuf`'s filename. The prefix and suffix checking is much faster on the -// `Option` 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`. 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` containing the +/// `PathBuf`'s filename. The prefix and suffix checking is much faster on the +/// `Option` 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, From 58000ed0e9152e331dc7c7319c7783cc7f028f84 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Tue, 31 Aug 2021 18:36:25 +0200 Subject: [PATCH 04/13] Move get_tools_search_paths from FileSearch to Session It only uses fields of FileSearch that are stored in Session too --- compiler/rustc_codegen_ssa/src/back/link.rs | 8 +++----- compiler/rustc_codegen_ssa/src/back/linker.rs | 3 +-- compiler/rustc_session/src/filesearch.rs | 12 ------------ compiler/rustc_session/src/session.rs | 14 +++++++++++++- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index 4fb51ecc1d347..826c09cd948f6 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 9e1c6a169f152..e3b0eea0d89c7 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_session/src/filesearch.rs b/compiler/rustc_session/src/filesearch.rs index a9999e1d92197..9359a55e55a9c 100644 --- a/compiler/rustc_session/src/filesearch.rs +++ b/compiler/rustc_session/src/filesearch.rs @@ -87,18 +87,6 @@ impl<'a> FileSearch<'a> { pub fn search_path_dirs(&self) -> Vec { 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 { - 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::(); - 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 { diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index c71595ab57e72..648743b7e866d 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; @@ -799,6 +799,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 { + 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::(); + if self_contained { vec![p.clone(), p.join("self-contained")] } else { vec![p] } + } + pub fn init_incr_comp_session( &self, session_dir: PathBuf, From d7ef0b30e89960aede88bf450e4a2172332432e0 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Wed, 1 Sep 2021 13:39:48 +0200 Subject: [PATCH 05/13] Use Lrc instead of Option to avoid duplication of a SearchPath --- compiler/rustc_driver/src/lib.rs | 5 +---- compiler/rustc_session/src/session.rs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_driver/src/lib.rs b/compiler/rustc_driver/src/lib.rs index 53053327d0dab..4c6a2baaef1e5 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_session/src/session.rs b/compiler/rustc_session/src/session.rs index 648743b7e866d..58ea29c080f3b 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -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, + pub host_tlib_path: Lrc, + pub target_tlib_path: Lrc, pub parse_sess: ParseSess, pub sysroot: PathBuf, /// The name of the root source file of the crate, in the local file system. @@ -784,8 +783,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, ) } @@ -1254,11 +1252,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(); From cbd79836a5b7ef07e33213cb979294ad1b9faccc Mon Sep 17 00:00:00 2001 From: Fabian Wolff Date: Mon, 13 Sep 2021 19:39:30 +0200 Subject: [PATCH 06/13] Improve error message for type mismatch in generator arguments --- .../src/traits/error_reporting/mod.rs | 5 ++- .../src/traits/error_reporting/suggestions.rs | 33 +++++++++++-------- src/test/ui/generator/issue-88653.rs | 19 +++++++++++ src/test/ui/generator/issue-88653.stderr | 12 +++++++ 4 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 src/test/ui/generator/issue-88653.rs create mode 100644 src/test/ui/generator/issue-88653.stderr 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 761b217c78f4e..6eb6164846ccc 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs @@ -730,7 +730,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 9371ff3405eb0..362a5f47ffe30 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs @@ -1250,33 +1250,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/src/test/ui/generator/issue-88653.rs b/src/test/ui/generator/issue-88653.rs new file mode 100644 index 0000000000000..ce9159b53e0f0 --- /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 0000000000000..5bd8ad129fef9 --- /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`. From 349ac4f6c8839c89a39d1dd9fac1fbe9a30f2626 Mon Sep 17 00:00:00 2001 From: Deadbeef Date: Sun, 12 Sep 2021 15:26:30 +0000 Subject: [PATCH 07/13] Const Deref --- library/alloc/src/borrow.rs | 6 +++++- library/core/src/mem/manually_drop.rs | 6 ++++-- library/core/src/ops/deref.rs | 6 ++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/library/alloc/src/borrow.rs b/library/alloc/src/borrow.rs index 482a497201de6..9ecbf0582319e 100644 --- a/library/alloc/src/borrow.rs +++ b/library/alloc/src/borrow.rs @@ -330,7 +330,11 @@ impl Cow<'_, B> { } #[stable(feature = "rust1", since = "1.0.0")] -impl Deref for Cow<'_, B> { +#[rustc_const_unstable(feature = "const_deref", issue = "88955")] +impl const Deref for Cow<'_, B> +where + B::Owned: ~const Borrow, +{ 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 d86939454be5b..20b6453990d75 100644 --- a/library/core/src/mem/manually_drop.rs +++ b/library/core/src/mem/manually_drop.rs @@ -145,7 +145,8 @@ impl ManuallyDrop { } #[stable(feature = "manually_drop", since = "1.20.0")] -impl Deref for ManuallyDrop { +#[rustc_const_unstable(feature = "const_deref", issue = "88955")] +impl const Deref for ManuallyDrop { type Target = T; #[inline(always)] fn deref(&self) -> &T { @@ -154,7 +155,8 @@ impl Deref for ManuallyDrop { } #[stable(feature = "manually_drop", since = "1.20.0")] -impl DerefMut for ManuallyDrop { +#[rustc_const_unstable(feature = "const_deref", issue = "88955")] +impl const DerefMut for ManuallyDrop { #[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 dcf3ce070ec65..fb4ec83bc287e 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 Deref for &T { +#[rustc_const_unstable(feature = "const_deref", issue = "88955")] +impl const Deref for &T { type Target = T; #[rustc_diagnostic_item = "noop_method_deref"] @@ -89,7 +90,8 @@ impl Deref for &T { impl !DerefMut for &T {} #[stable(feature = "rust1", since = "1.0.0")] -impl Deref for &mut T { +#[rustc_const_unstable(feature = "const_deref", issue = "88955")] +impl const Deref for &mut T { type Target = T; fn deref(&self) -> &T { From 1b0186e9ecdaa6fd00f1beea7d877b5a4fbd762d Mon Sep 17 00:00:00 2001 From: Caio Date: Wed, 15 Sep 2021 14:03:27 -0300 Subject: [PATCH 08/13] Move some tests to more reasonable directories --- .../issue-19883.rs | 0 .../issue-19883.stderr | 0 .../issue-21363.rs | 0 .../auxiliary/issue-72470-lib.rs | 0 .../issue-72470-llvm-dominate.rs | 0 .../ui/{issues => closures}/issue-78720.rs | 0 .../{issues => closures}/issue-78720.stderr | 0 src/test/ui/{issues => consts}/issue-23833.rs | 0 src/test/ui/{issues => consts}/issue-34784.rs | 0 .../ui/{issues => deriving}/issue-3935.rs | 0 .../ui/{ => generics}/mid-path-type-params.rs | 0 .../type-arg-mismatch-due-to-impl-trait.rs | 0 ...type-arg-mismatch-due-to-impl-trait.stderr | 0 src/test/ui/issues/issue-5791.rs | 14 ------------- src/test/ui/issues/issue-5791.stderr | 21 ------------------- .../{ => lint}/enable-unstable-lib-feature.rs | 0 .../enable-unstable-lib-feature.stderr | 0 src/test/ui/{issues => lint}/issue-57410.rs | 0 src/test/ui/{issues => lint}/issue-79744.rs | 0 .../ui/{issues => lint}/issue-79744.stderr | 0 .../ui/{issues => llvm-asm}/issue-37433.rs | 0 .../{issues => llvm-asm}/issue-37433.stderr | 0 .../ui/{ => macros}/auxiliary/define-macro.rs | 0 .../ui/{ => macros}/out-of-order-shadowing.rs | 0 .../out-of-order-shadowing.stderr | 0 src/test/ui/{ => match}/guards.rs | 0 src/test/ui/{issues => match}/issue-33498.rs | 0 src/test/ui/{issues => match}/issue-41255.rs | 0 .../ui/{issues => match}/issue-41255.stderr | 0 src/test/ui/{issues => match}/issue-56685.rs | 0 .../ui/{issues => match}/issue-56685.stderr | 0 .../ui/{ => never_type}/expr-empty-ret.rs | 0 .../issue-74614.rs | 0 .../ui/{issues => privacy}/issue-79593.rs | 0 .../ui/{issues => privacy}/issue-79593.stderr | 0 .../ui/{issues => resolve}/issue-42944.rs | 0 .../ui/{issues => resolve}/issue-42944.stderr | 0 .../ui/{ => resolve}/use-self-in-inner-fn.rs | 0 .../{ => resolve}/use-self-in-inner-fn.stderr | 0 .../{issues => specialization}/issue-35376.rs | 0 .../issue-35376.stderr | 0 src/test/ui/{issues => static}/issue-34194.rs | 0 .../{issues => structs-enums}/issue-38002.rs | 0 .../{issues => symbol-names}/issue-53912.rs | 0 .../ui/{issues => test-attrs}/issue-36768.rs | 0 src/test/ui/{ => thread-local}/tls.rs | 0 src/test/ui/{ => traits}/bug-7183-generics.rs | 0 src/test/ui/{issues => traits}/issue-20692.rs | 0 .../ui/{issues => traits}/issue-20692.stderr | 0 src/test/ui/{issues => traits}/issue-23825.rs | 0 ...7-unnecessary-unsafe-in-closure.mir.stderr | 0 ...sue-45107-unnecessary-unsafe-in-closure.rs | 0 ...-unnecessary-unsafe-in-closure.thir.stderr | 0 src/tools/tidy/src/ui_tests.rs | 4 ++-- 54 files changed, 2 insertions(+), 37 deletions(-) rename src/test/ui/{issues => associated-types}/issue-19883.rs (100%) rename src/test/ui/{issues => associated-types}/issue-19883.stderr (100%) rename src/test/ui/{issues => associated-types}/issue-21363.rs (100%) rename src/test/ui/{ => async-await}/auxiliary/issue-72470-lib.rs (100%) rename src/test/ui/{ => async-await}/issue-72470-llvm-dominate.rs (100%) rename src/test/ui/{issues => closures}/issue-78720.rs (100%) rename src/test/ui/{issues => closures}/issue-78720.stderr (100%) rename src/test/ui/{issues => consts}/issue-23833.rs (100%) rename src/test/ui/{issues => consts}/issue-34784.rs (100%) rename src/test/ui/{issues => deriving}/issue-3935.rs (100%) rename src/test/ui/{ => generics}/mid-path-type-params.rs (100%) rename src/test/ui/{issues => impl-trait}/type-arg-mismatch-due-to-impl-trait.rs (100%) rename src/test/ui/{issues => impl-trait}/type-arg-mismatch-due-to-impl-trait.stderr (100%) delete mode 100644 src/test/ui/issues/issue-5791.rs delete mode 100644 src/test/ui/issues/issue-5791.stderr rename src/test/ui/{ => lint}/enable-unstable-lib-feature.rs (100%) rename src/test/ui/{ => lint}/enable-unstable-lib-feature.stderr (100%) rename src/test/ui/{issues => lint}/issue-57410.rs (100%) rename src/test/ui/{issues => lint}/issue-79744.rs (100%) rename src/test/ui/{issues => lint}/issue-79744.stderr (100%) rename src/test/ui/{issues => llvm-asm}/issue-37433.rs (100%) rename src/test/ui/{issues => llvm-asm}/issue-37433.stderr (100%) rename src/test/ui/{ => macros}/auxiliary/define-macro.rs (100%) rename src/test/ui/{ => macros}/out-of-order-shadowing.rs (100%) rename src/test/ui/{ => macros}/out-of-order-shadowing.stderr (100%) rename src/test/ui/{ => match}/guards.rs (100%) rename src/test/ui/{issues => match}/issue-33498.rs (100%) rename src/test/ui/{issues => match}/issue-41255.rs (100%) rename src/test/ui/{issues => match}/issue-41255.stderr (100%) rename src/test/ui/{issues => match}/issue-56685.rs (100%) rename src/test/ui/{issues => match}/issue-56685.stderr (100%) rename src/test/ui/{ => never_type}/expr-empty-ret.rs (100%) rename src/test/ui/{issues => polymorphization}/issue-74614.rs (100%) rename src/test/ui/{issues => privacy}/issue-79593.rs (100%) rename src/test/ui/{issues => privacy}/issue-79593.stderr (100%) rename src/test/ui/{issues => resolve}/issue-42944.rs (100%) rename src/test/ui/{issues => resolve}/issue-42944.stderr (100%) rename src/test/ui/{ => resolve}/use-self-in-inner-fn.rs (100%) rename src/test/ui/{ => resolve}/use-self-in-inner-fn.stderr (100%) rename src/test/ui/{issues => specialization}/issue-35376.rs (100%) rename src/test/ui/{issues => specialization}/issue-35376.stderr (100%) rename src/test/ui/{issues => static}/issue-34194.rs (100%) rename src/test/ui/{issues => structs-enums}/issue-38002.rs (100%) rename src/test/ui/{issues => symbol-names}/issue-53912.rs (100%) rename src/test/ui/{issues => test-attrs}/issue-36768.rs (100%) rename src/test/ui/{ => thread-local}/tls.rs (100%) rename src/test/ui/{ => traits}/bug-7183-generics.rs (100%) rename src/test/ui/{issues => traits}/issue-20692.rs (100%) rename src/test/ui/{issues => traits}/issue-20692.stderr (100%) rename src/test/ui/{issues => traits}/issue-23825.rs (100%) rename src/test/ui/{issues => unsafe}/issue-45107-unnecessary-unsafe-in-closure.mir.stderr (100%) rename src/test/ui/{issues => unsafe}/issue-45107-unnecessary-unsafe-in-closure.rs (100%) rename src/test/ui/{issues => unsafe}/issue-45107-unnecessary-unsafe-in-closure.thir.stderr (100%) diff --git a/src/test/ui/issues/issue-19883.rs b/src/test/ui/associated-types/issue-19883.rs similarity index 100% rename from src/test/ui/issues/issue-19883.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-19883.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-21363.rs rename to 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 similarity index 100% rename from src/test/ui/auxiliary/issue-72470-lib.rs rename to 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 similarity index 100% rename from src/test/ui/issue-72470-llvm-dominate.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-78720.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-78720.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-23833.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-34784.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-3935.rs rename to src/test/ui/deriving/issue-3935.rs diff --git a/src/test/ui/mid-path-type-params.rs b/src/test/ui/generics/mid-path-type-params.rs similarity index 100% rename from src/test/ui/mid-path-type-params.rs rename to 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 similarity index 100% rename from src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs rename to 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 similarity index 100% rename from src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr rename to src/test/ui/impl-trait/type-arg-mismatch-due-to-impl-trait.stderr diff --git a/src/test/ui/issues/issue-5791.rs b/src/test/ui/issues/issue-5791.rs deleted file mode 100644 index 3544160f094e5..0000000000000 --- 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 cf60e609deb31..0000000000000 --- 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 similarity index 100% rename from src/test/ui/enable-unstable-lib-feature.rs rename to 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 similarity index 100% rename from src/test/ui/enable-unstable-lib-feature.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-57410.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-79744.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-79744.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-37433.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-37433.stderr rename to 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 similarity index 100% rename from src/test/ui/auxiliary/define-macro.rs rename to 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 similarity index 100% rename from src/test/ui/out-of-order-shadowing.rs rename to 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 similarity index 100% rename from src/test/ui/out-of-order-shadowing.stderr rename to src/test/ui/macros/out-of-order-shadowing.stderr diff --git a/src/test/ui/guards.rs b/src/test/ui/match/guards.rs similarity index 100% rename from src/test/ui/guards.rs rename to src/test/ui/match/guards.rs diff --git a/src/test/ui/issues/issue-33498.rs b/src/test/ui/match/issue-33498.rs similarity index 100% rename from src/test/ui/issues/issue-33498.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-41255.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-41255.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-56685.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-56685.stderr rename to 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 similarity index 100% rename from src/test/ui/expr-empty-ret.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-74614.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-79593.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-79593.stderr rename to src/test/ui/privacy/issue-79593.stderr diff --git a/src/test/ui/issues/issue-42944.rs b/src/test/ui/resolve/issue-42944.rs similarity index 100% rename from src/test/ui/issues/issue-42944.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-42944.stderr rename to 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 similarity index 100% rename from src/test/ui/use-self-in-inner-fn.rs rename to 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 similarity index 100% rename from src/test/ui/use-self-in-inner-fn.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-35376.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-35376.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-34194.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-38002.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-53912.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-36768.rs rename to src/test/ui/test-attrs/issue-36768.rs diff --git a/src/test/ui/tls.rs b/src/test/ui/thread-local/tls.rs similarity index 100% rename from src/test/ui/tls.rs rename to 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 similarity index 100% rename from src/test/ui/bug-7183-generics.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-20692.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-20692.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-23825.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.mir.stderr rename to 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 similarity index 100% rename from src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.rs rename to 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 similarity index 100% rename from src/test/ui/issues/issue-45107-unnecessary-unsafe-in-closure.thir.stderr rename to 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 46b5b877b4c26..a341527c84cf0 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")) From a97f89aeb4b4d7e2131f34c067df0f952fb8caad Mon Sep 17 00:00:00 2001 From: Augie Fackler Date: Thu, 16 Sep 2021 11:45:38 -0400 Subject: [PATCH 09/13] PassWrapper: handle separate Module*SanitizerPass Change ab41eef9aca3 in LLVM split MemorySanitizerPass into MemorySanitizerPass for functions and ModuleMemorySanitizerPass for modules. There's a related change for ThreadSanitizerPass, and in here since we're using a ModulePassManager I only add the module flavor of the pass on LLVM 14. r? @nikic cc @nagisa --- compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp index b3f86f3295ae9..3af1d31816e7e 100644 --- a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp @@ -875,8 +875,12 @@ 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)); MPM.addPass(createModuleToFunctionPassAdaptor(MemorySanitizerPass(Options))); +#endif } ); #else @@ -897,8 +901,12 @@ 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()); MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); +#endif } ); #else From bc4d8af123ce376261b1abd7acbc7d67a0197280 Mon Sep 17 00:00:00 2001 From: Augie Fackler Date: Thu, 16 Sep 2021 15:04:18 -0400 Subject: [PATCH 10/13] PassWrapper: these two lines shouldn't have been ifdef'd --- compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp index 3af1d31816e7e..b7cad1c3ba6d9 100644 --- a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp @@ -879,8 +879,8 @@ LLVMRustOptimizeWithNewPassManager( MPM.addPass(ModuleMemorySanitizerPass(Options)); #else MPM.addPass(MemorySanitizerPass(Options)); - MPM.addPass(createModuleToFunctionPassAdaptor(MemorySanitizerPass(Options))); #endif + MPM.addPass(createModuleToFunctionPassAdaptor(MemorySanitizerPass(Options))); } ); #else @@ -905,8 +905,8 @@ LLVMRustOptimizeWithNewPassManager( MPM.addPass(ModuleThreadSanitizerPass()); #else MPM.addPass(ThreadSanitizerPass()); - MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); #endif + MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); } ); #else From 5f464bb7f2d3656837a6fa4f6d2265a86e02e5b4 Mon Sep 17 00:00:00 2001 From: Hans <49440977+hnj2@users.noreply.github.com> Date: Wed, 8 Sep 2021 01:09:15 +0200 Subject: [PATCH 11/13] Don't lint about missing code examples in derived traits Fixes #81775 --- src/librustdoc/passes/doc_test_lints.rs | 1 + src/test/rustdoc-ui/lint-missing-doc-code-example.rs | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/librustdoc/passes/doc_test_lints.rs b/src/librustdoc/passes/doc_test_lints.rs index 1b5ec1b08fab0..279d0dbda82ee 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/rustdoc-ui/lint-missing-doc-code-example.rs b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs index 7dd2ebfedbbd7..fac6342cd24b9 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() {} From 67edf94416cdb8cef46360cd284efc358736d689 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Thu, 16 Sep 2021 17:30:36 -0700 Subject: [PATCH 12/13] Set the library path in sysroot-crates-are-unstable Most of the `run-make-fulldeps` tests use a make-driven rustc command that includes `HOST_RPATH_DIR` in the library path, but this particular test runs from python instead. When the toolchain is built without `rpath` enabled, we need that library path in the environment so it can find its own libraries. --- .../sysroot-crates-are-unstable/test.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 f479bdabb9c0c..cb77eb34fef08 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 From 378300a63d1951e2718a6b0a077439fc1b14742b Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 17 Jun 2021 06:35:42 +0900 Subject: [PATCH 13/13] Make diagnostics clearer for `?` operators --- compiler/rustc_errors/src/diagnostic.rs | 12 ++++++++++++ .../src/infer/error_reporting/mod.rs | 19 ++++++++++++++++--- src/test/ui/inference/issue-71309.rs | 7 +++++++ src/test/ui/inference/issue-71309.stderr | 15 +++++++++++++++ ...ue-51632-try-desugar-incompatible-types.rs | 2 +- ...1632-try-desugar-incompatible-types.stderr | 3 ++- 6 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 src/test/ui/inference/issue-71309.rs create mode 100644 src/test/ui/inference/issue-71309.stderr diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index 232cf4bdb7f61..41a73268f4673 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -74,6 +74,10 @@ impl DiagnosticStyledString { pub fn highlighted>(t: S) -> DiagnosticStyledString { DiagnosticStyledString(vec![StringPart::Highlighted(t.into())]) } + + pub fn content(&self) -> String { + self.0.iter().map(|x| x.content()).collect::() + } } #[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 1139b714d0a1f..b8089b2499b66 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/src/test/ui/inference/issue-71309.rs b/src/test/ui/inference/issue-71309.rs new file mode 100644 index 0000000000000..c31107d8fed05 --- /dev/null +++ b/src/test/ui/inference/issue-71309.rs @@ -0,0 +1,7 @@ +fn foo(x: Result) -> 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 0000000000000..af8714f1c8083 --- /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 bb74f0e0dc3c7..35402dff67553 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 { fn forbidden_narratives() -> Result { 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 2c821aa23088d..0f61e03c3b58f 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` = note: expected enum `Result` found type `isize` help: try removing this `?`