From 2d74528c21d352969eb044a87d3686a92c9c02bd Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 31 Mar 2022 21:11:29 -0400 Subject: [PATCH 01/14] caution against ptr-to-int transmutes --- library/core/src/intrinsics.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index 8ad4317c145ac..4962299de6f3f 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -991,6 +991,12 @@ extern "rust-intrinsic" { /// let ptr_num_cast = ptr as *const i32 as usize; /// ``` /// + /// Note that using `transmute` to turn a pointer to a `usize` is (as noted above) [undefined + /// behavior][ub] in `const` contexts. Also outside of consts, this operation might not behave + /// as expected -- this is touching on many unspecified aspects of the Rust memory model. To + /// make sure your code is well-defined, the conversion of pointers to integers and back should + /// always be done explicitly via casts. + /// /// Turning a `*mut T` into an `&mut T`: /// /// ``` From dd85a7682cf17103ec72eb1606fabf04bbf52971 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 2 Apr 2022 10:25:06 -0400 Subject: [PATCH 02/14] refine wording and describe alternatives --- library/core/src/intrinsics.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index 4962299de6f3f..4a98b480c9d16 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -993,9 +993,13 @@ extern "rust-intrinsic" { /// /// Note that using `transmute` to turn a pointer to a `usize` is (as noted above) [undefined /// behavior][ub] in `const` contexts. Also outside of consts, this operation might not behave - /// as expected -- this is touching on many unspecified aspects of the Rust memory model. To - /// make sure your code is well-defined, the conversion of pointers to integers and back should - /// always be done explicitly via casts. + /// as expected -- this is touching on many unspecified aspects of the Rust memory model. + /// Depending on what the code is doing, the following alternatives are preferrable to + /// pointer-to-integer transmutation: + /// - If the code just wants to store data of arbitrary type in some buffer and needs to pick a + /// type for that buffer, it can use [`MaybeUninit`][mem::MaybeUninit]. + /// - If the code actually wants to work on the address the pointer points to, it can use `as` + /// casts or [`ptr.addr()`][pointer::addr]. /// /// Turning a `*mut T` into an `&mut T`: /// From 23e6314a31383d69038314a926626e3d8a4056e7 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 14 Aug 2021 10:42:17 +0100 Subject: [PATCH 03/14] ScmCredentials netbsd implementation. --- library/std/src/os/unix/net/ancillary.rs | 97 +++++++++++++++++++++--- library/std/src/os/unix/net/datagram.rs | 4 +- library/std/src/os/unix/net/stream.rs | 4 +- library/std/src/sys/unix/net.rs | 11 +++ 4 files changed, 103 insertions(+), 13 deletions(-) diff --git a/library/std/src/os/unix/net/ancillary.rs b/library/std/src/os/unix/net/ancillary.rs index fb1ff4b725ced..658c79896eb2e 100644 --- a/library/std/src/os/unix/net/ancillary.rs +++ b/library/std/src/os/unix/net/ancillary.rs @@ -10,7 +10,7 @@ use crate::slice::from_raw_parts; use crate::sys::net::Socket; // FIXME(#43348): Make libc adapt #[doc(cfg(...))] so we don't need these fake definitions here? -#[cfg(all(doc, not(target_os = "linux"), not(target_os = "android")))] +#[cfg(all(doc, not(target_os = "linux"), not(target_os = "android"), not(target_os = "netbsd")))] #[allow(non_camel_case_types)] mod libc { pub use libc::c_int; @@ -177,13 +177,24 @@ impl<'a, T> Iterator for AncillaryDataIter<'a, T> { } } +#[cfg(all(doc, not(target_os = "android"), not(target_os = "linux"), not(target_os = "netbsd")))] +#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] +#[derive(Clone)] +pub struct SocketCred(()); + /// Unix credential. -#[cfg(any(doc, target_os = "android", target_os = "linux",))] +#[cfg(any(target_os = "android", target_os = "linux",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] #[derive(Clone)] pub struct SocketCred(libc::ucred); -#[cfg(any(doc, target_os = "android", target_os = "linux",))] +#[cfg(target_os = "netbsd")] +#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] +#[derive(Clone)] +pub struct SocketCred(libc::sockcred); + +#[doc(cfg(any(target_os = "android", target_os = "linux")))] +#[cfg(any(target_os = "android", target_os = "linux"))] impl SocketCred { /// Create a Unix credential struct. /// @@ -234,6 +245,61 @@ impl SocketCred { } } +#[cfg(target_os = "netbsd")] +impl SocketCred { + /// Create a Unix credential struct. + /// + /// PID, UID and GID is set to 0. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn new() -> SocketCred { + SocketCred(libc::sockcred { + sc_pid: 0, + sc_uid: 0, + sc_euid: 0, + sc_gid: 0, + sc_egid: 0, + sc_ngroups: 0, + sc_groups: [0u32; 1], + }) + } + + /// Set the PID. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn set_pid(&mut self, pid: libc::pid_t) { + self.0.sc_pid = pid; + } + + /// Get the current PID. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn get_pid(&self) -> libc::pid_t { + self.0.sc_pid + } + + /// Set the UID. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn set_uid(&mut self, uid: libc::uid_t) { + self.0.sc_uid = uid; + } + + /// Get the current UID. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn get_uid(&self) -> libc::uid_t { + self.0.sc_uid + } + + /// Set the GID. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn set_gid(&mut self, gid: libc::gid_t) { + self.0.sc_gid = gid; + } + + /// Get the current GID. + #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] + pub fn get_gid(&self) -> libc::gid_t { + self.0.sc_gid + } +} + /// This control message contains file descriptors. /// /// The level is equal to `SOL_SOCKET` and the type is equal to `SCM_RIGHTS`. @@ -249,14 +315,22 @@ impl<'a> Iterator for ScmRights<'a> { } } +#[cfg(all(doc, not(target_os = "android"), not(target_os = "linux"), not(target_os = "netbsd")))] +#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] +pub struct ScmCredentials<'a>(AncillaryDataIter<'a, ()>); + /// This control message contains unix credentials. /// /// The level is equal to `SOL_SOCKET` and the type is equal to `SCM_CREDENTIALS` or `SCM_CREDS`. -#[cfg(any(doc, target_os = "android", target_os = "linux",))] +#[cfg(any(target_os = "android", target_os = "linux",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub struct ScmCredentials<'a>(AncillaryDataIter<'a, libc::ucred>); -#[cfg(any(doc, target_os = "android", target_os = "linux",))] +#[cfg(target_os = "netbsd")] +#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] +pub struct ScmCredentials<'a>(AncillaryDataIter<'a, libc::sockcred>); + +#[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] impl<'a> Iterator for ScmCredentials<'a> { type Item = SocketCred; @@ -278,7 +352,7 @@ pub enum AncillaryError { #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub enum AncillaryData<'a> { ScmRights(ScmRights<'a>), - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] ScmCredentials(ScmCredentials<'a>), } @@ -300,8 +374,8 @@ impl<'a> AncillaryData<'a> { /// # Safety /// /// `data` must contain a valid control message and the control message must be type of - /// `SOL_SOCKET` and level of `SCM_CREDENTIALS` or `SCM_CREDENTIALS`. - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + /// `SOL_SOCKET` and level of `SCM_CREDENTIALS` or `SCM_CREDS`. + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] unsafe fn as_credentials(data: &'a [u8]) -> Self { let ancillary_data_iter = AncillaryDataIter::new(data); let scm_credentials = ScmCredentials(ancillary_data_iter); @@ -320,6 +394,8 @@ impl<'a> AncillaryData<'a> { libc::SCM_RIGHTS => Ok(AncillaryData::as_rights(data)), #[cfg(any(target_os = "android", target_os = "linux",))] libc::SCM_CREDENTIALS => Ok(AncillaryData::as_credentials(data)), + #[cfg(target_os = "netbsd")] + libc::SCM_CREDS => Ok(AncillaryData::as_credentials(data)), cmsg_type => { Err(AncillaryError::Unknown { cmsg_level: libc::SOL_SOCKET, cmsg_type }) } @@ -531,7 +607,7 @@ impl<'a> SocketAncillary<'a> { /// Technically, that means this operation adds a control message with the level `SOL_SOCKET` /// and type `SCM_CREDENTIALS` or `SCM_CREDS`. /// - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn add_creds(&mut self, creds: &[SocketCred]) -> bool { self.truncated = false; @@ -540,7 +616,10 @@ impl<'a> SocketAncillary<'a> { &mut self.length, creds, libc::SOL_SOCKET, + #[cfg(not(target_os = "netbsd"))] libc::SCM_CREDENTIALS, + #[cfg(target_os = "netbsd")] + libc::SCM_CREDS, ) } diff --git a/library/std/src/os/unix/net/datagram.rs b/library/std/src/os/unix/net/datagram.rs index 59c91e9a82e1a..872058b36e62f 100644 --- a/library/std/src/os/unix/net/datagram.rs +++ b/library/std/src/os/unix/net/datagram.rs @@ -865,7 +865,7 @@ impl UnixDatagram { /// Ok(()) /// } /// ``` - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn set_passcred(&self, passcred: bool) -> io::Result<()> { self.0.set_passcred(passcred) @@ -877,7 +877,7 @@ impl UnixDatagram { /// Get the socket option `SO_PASSCRED`. /// /// [`set_passcred`]: UnixDatagram::set_passcred - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn passcred(&self) -> io::Result { self.0.passcred() diff --git a/library/std/src/os/unix/net/stream.rs b/library/std/src/os/unix/net/stream.rs index 3943b4fed0949..cd1aa01fa0f19 100644 --- a/library/std/src/os/unix/net/stream.rs +++ b/library/std/src/os/unix/net/stream.rs @@ -415,7 +415,7 @@ impl UnixStream { /// Ok(()) /// } /// ``` - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn set_passcred(&self, passcred: bool) -> io::Result<()> { self.0.set_passcred(passcred) @@ -427,7 +427,7 @@ impl UnixStream { /// Get the socket option `SO_PASSCRED`. /// /// [`set_passcred`]: UnixStream::set_passcred - #[cfg(any(doc, target_os = "android", target_os = "linux",))] + #[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "netbsd",))] #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn passcred(&self) -> io::Result { self.0.passcred() diff --git a/library/std/src/sys/unix/net.rs b/library/std/src/sys/unix/net.rs index e6fd9a0c827e2..9bf9607a63e4d 100644 --- a/library/std/src/sys/unix/net.rs +++ b/library/std/src/sys/unix/net.rs @@ -419,6 +419,17 @@ impl Socket { Ok(passcred != 0) } + #[cfg(target_os = "netbsd")] + pub fn set_passcred(&self, passcred: bool) -> io::Result<()> { + setsockopt(self, 0 as libc::c_int, libc::LOCAL_CREDS, passcred as libc::c_int) + } + + #[cfg(target_os = "netbsd")] + pub fn passcred(&self) -> io::Result { + let passcred: libc::c_int = getsockopt(self, 0 as libc::c_int, libc::LOCAL_CREDS)?; + Ok(passcred != 0) + } + #[cfg(not(any(target_os = "solaris", target_os = "illumos")))] pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { let mut nonblocking = nonblocking as libc::c_int; From bec8dbdb602688d6da4f49b7fdd74226f0f9f04c Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 4 Apr 2022 17:37:59 -0700 Subject: [PATCH 04/14] diagnostics: give a special note for unsafe fn / Fn/FnOnce/FnMut Fixes #90073 --- .../src/traits/error_reporting/on_unimplemented.rs | 9 +++++++++ library/core/src/ops/function.rs | 12 ++++++++++++ src/test/ui/closures/coerce-unsafe-to-closure.stderr | 1 + .../unboxed-closures-unsafe-extern-fn.stderr | 3 +++ .../unboxed-closures-wrong-arg-type-extern-fn.stderr | 3 +++ 5 files changed, 28 insertions(+) diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs index d2b1fe2e0df9b..31b92d52bebc8 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs @@ -208,6 +208,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { flags.push((sym::_Self, Some("&[]".to_owned()))); } + if self_ty.is_fn() { + let fn_sig = self_ty.fn_sig(self.tcx); + let shortname = match fn_sig.unsafety() { + hir::Unsafety::Normal => "fn", + hir::Unsafety::Unsafe => "unsafe fn", + }; + flags.push((sym::_Self, Some(shortname.to_owned()))); + } + if let ty::Array(aty, len) = self_ty.kind() { flags.push((sym::_Self, Some("[]".to_owned()))); flags.push((sym::_Self, Some(format!("[{}]", aty)))); diff --git a/library/core/src/ops/function.rs b/library/core/src/ops/function.rs index e5c4798afcbff..a7b28471bfe12 100644 --- a/library/core/src/ops/function.rs +++ b/library/core/src/ops/function.rs @@ -59,6 +59,10 @@ Args = "()", note = "wrap the `{Self}` in a closure with no arguments: `|| {{ /* code */ }}`" ), + on( + _Self = "unsafe fn", + note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" + ), message = "expected a `{Fn}<{Args}>` closure, found `{Self}`", label = "expected an `Fn<{Args}>` closure, found `{Self}`" )] @@ -139,6 +143,10 @@ pub trait Fn: FnMut { Args = "()", note = "wrap the `{Self}` in a closure with no arguments: `|| {{ /* code */ }}`" ), + on( + _Self = "unsafe fn", + note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" + ), message = "expected a `{FnMut}<{Args}>` closure, found `{Self}`", label = "expected an `FnMut<{Args}>` closure, found `{Self}`" )] @@ -211,6 +219,10 @@ pub trait FnMut: FnOnce { Args = "()", note = "wrap the `{Self}` in a closure with no arguments: `|| {{ /* code */ }}`" ), + on( + _Self = "unsafe fn", + note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" + ), message = "expected a `{FnOnce}<{Args}>` closure, found `{Self}`", label = "expected an `FnOnce<{Args}>` closure, found `{Self}`" )] diff --git a/src/test/ui/closures/coerce-unsafe-to-closure.stderr b/src/test/ui/closures/coerce-unsafe-to-closure.stderr index 883348eb98c70..57043c335c0dd 100644 --- a/src/test/ui/closures/coerce-unsafe-to-closure.stderr +++ b/src/test/ui/closures/coerce-unsafe-to-closure.stderr @@ -7,6 +7,7 @@ LL | let x: Option<&[u8]> = Some("foo").map(std::mem::transmute); | required by a bound introduced by this call | = help: the trait `FnOnce<(&str,)>` is not implemented for `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `Option::::map` --> $SRC_DIR/core/src/option.rs:LL:COL | diff --git a/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr b/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr index c9a20232f3508..fcd668c191fdd 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr @@ -7,6 +7,7 @@ LL | let x = call_it(&square, 22); | required by a bound introduced by this call | = help: the trait `for<'r> Fn<(&'r isize,)>` is not implemented for `for<'r> unsafe fn(&'r isize) -> isize {square}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `call_it` --> $DIR/unboxed-closures-unsafe-extern-fn.rs:9:15 | @@ -22,6 +23,7 @@ LL | let y = call_it_mut(&mut square, 22); | required by a bound introduced by this call | = help: the trait `for<'r> FnMut<(&'r isize,)>` is not implemented for `for<'r> unsafe fn(&'r isize) -> isize {square}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `call_it_mut` --> $DIR/unboxed-closures-unsafe-extern-fn.rs:12:19 | @@ -37,6 +39,7 @@ LL | let z = call_it_once(square, 22); | required by a bound introduced by this call | = help: the trait `for<'r> FnOnce<(&'r isize,)>` is not implemented for `for<'r> unsafe fn(&'r isize) -> isize {square}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `call_it_once` --> $DIR/unboxed-closures-unsafe-extern-fn.rs:15:20 | diff --git a/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr b/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr index 64d57773d7081..576806e3956b0 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr @@ -7,6 +7,7 @@ LL | let x = call_it(&square, 22); | required by a bound introduced by this call | = help: the trait `for<'r> Fn<(&'r isize,)>` is not implemented for `unsafe fn(isize) -> isize {square}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `call_it` --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:10:15 | @@ -22,6 +23,7 @@ LL | let y = call_it_mut(&mut square, 22); | required by a bound introduced by this call | = help: the trait `for<'r> FnMut<(&'r isize,)>` is not implemented for `unsafe fn(isize) -> isize {square}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `call_it_mut` --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:13:19 | @@ -37,6 +39,7 @@ LL | let z = call_it_once(square, 22); | required by a bound introduced by this call | = help: the trait `for<'r> FnOnce<(&'r isize,)>` is not implemented for `unsafe fn(isize) -> isize {square}` + = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` note: required by a bound in `call_it_once` --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:16:20 | From dcf7ce8356ce9182d65b0719216ec08db877d5cc Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 4 Apr 2022 17:54:20 -0700 Subject: [PATCH 05/14] Fix bogus tidy errors --- library/core/src/ops/function.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/core/src/ops/function.rs b/library/core/src/ops/function.rs index a7b28471bfe12..19918e0dcea42 100644 --- a/library/core/src/ops/function.rs +++ b/library/core/src/ops/function.rs @@ -61,6 +61,7 @@ ), on( _Self = "unsafe fn", + // SAFETY: tidy is not smart enough to tell that the below unsafe block is a string note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" ), message = "expected a `{Fn}<{Args}>` closure, found `{Self}`", @@ -145,6 +146,7 @@ pub trait Fn: FnMut { ), on( _Self = "unsafe fn", + // SAFETY: tidy is not smart enough to tell that the below unsafe block is a string note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" ), message = "expected a `{FnMut}<{Args}>` closure, found `{Self}`", @@ -221,6 +223,7 @@ pub trait FnMut: FnOnce { ), on( _Self = "unsafe fn", + // SAFETY: tidy is not smart enough to tell that the below unsafe block is a string note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" ), message = "expected a `{FnOnce}<{Args}>` closure, found `{Self}`", From 505573e38e4fca72372023c20c1847e01b4bb67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= Date: Tue, 5 Apr 2022 14:18:10 +0300 Subject: [PATCH 06/14] :arrow_up: rust-analyzer --- src/tools/rust-analyzer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/rust-analyzer b/src/tools/rust-analyzer index bc08b8eff3f8e..46d7ee68f2628 160000 --- a/src/tools/rust-analyzer +++ b/src/tools/rust-analyzer @@ -1 +1 @@ -Subproject commit bc08b8eff3f8e4da7c448d7b7f6461938c817a60 +Subproject commit 46d7ee68f26285db26b2640f2c07d6332380c756 From 9ac8d2fe4ed0f5312bcd74c05f441d23536c1a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Rakic?= Date: Wed, 30 Mar 2022 15:14:25 +0200 Subject: [PATCH 07/14] track proc-macro expansions in the self-profiler Use the proc-macro descr to track their individual expansions with self-profiling events. This will help diagnose performance issues with slow proc-macros. --- compiler/rustc_expand/src/base.rs | 6 ++++++ compiler/rustc_expand/src/proc_macro.rs | 28 ++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_expand/src/base.rs b/compiler/rustc_expand/src/base.rs index 7f569af4abd65..9fa33062c4859 100644 --- a/compiler/rustc_expand/src/base.rs +++ b/compiler/rustc_expand/src/base.rs @@ -1047,6 +1047,12 @@ impl<'a> ExtCtxt<'a> { self.current_expansion.id.expn_data().call_site } + /// Returns the current expansion kind's description. + pub(crate) fn expansion_descr(&self) -> String { + let expn_data = self.current_expansion.id.expn_data(); + expn_data.kind.descr() + } + /// Equivalent of `Span::def_site` from the proc macro API, /// except that the location is taken from the span passed as an argument. pub fn with_def_site_ctxt(&self, span: Span) -> Span { diff --git a/compiler/rustc_expand/src/proc_macro.rs b/compiler/rustc_expand/src/proc_macro.rs index a5afb7aa4fa4e..b4bae8ce5fbeb 100644 --- a/compiler/rustc_expand/src/proc_macro.rs +++ b/compiler/rustc_expand/src/proc_macro.rs @@ -24,6 +24,8 @@ impl base::ProcMacro for BangProcMacro { span: Span, input: TokenStream, ) -> Result { + let _timer = + ecx.sess.prof.generic_activity_with_arg("expand_proc_macro", ecx.expansion_descr()); let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace; let server = proc_macro_server::Rustc::new(ecx); self.client.run(&EXEC_STRATEGY, server, input, proc_macro_backtrace).map_err(|e| { @@ -48,6 +50,8 @@ impl base::AttrProcMacro for AttrProcMacro { annotation: TokenStream, annotated: TokenStream, ) -> Result { + let _timer = + ecx.sess.prof.generic_activity_with_arg("expand_proc_macro", ecx.expansion_descr()); let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace; let server = proc_macro_server::Rustc::new(ecx); self.client @@ -97,17 +101,21 @@ impl MultiItemModifier for ProcMacroDerive { nt_to_tokenstream(&item, &ecx.sess.parse_sess, CanSynthesizeMissingTokens::No) }; - let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace; - let server = proc_macro_server::Rustc::new(ecx); - let stream = match self.client.run(&EXEC_STRATEGY, server, input, proc_macro_backtrace) { - Ok(stream) => stream, - Err(e) => { - let mut err = ecx.struct_span_err(span, "proc-macro derive panicked"); - if let Some(s) = e.as_str() { - err.help(&format!("message: {}", s)); + let stream = { + let _timer = + ecx.sess.prof.generic_activity_with_arg("expand_proc_macro", ecx.expansion_descr()); + let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace; + let server = proc_macro_server::Rustc::new(ecx); + match self.client.run(&EXEC_STRATEGY, server, input, proc_macro_backtrace) { + Ok(stream) => stream, + Err(e) => { + let mut err = ecx.struct_span_err(span, "proc-macro derive panicked"); + if let Some(s) = e.as_str() { + err.help(&format!("message: {}", s)); + } + err.emit(); + return ExpandResult::Ready(vec![]); } - err.emit(); - return ExpandResult::Ready(vec![]); } }; From 7faaf8f4aa60b954a7370ae04ba90a021fa80fef Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Tue, 5 Apr 2022 15:38:18 +0300 Subject: [PATCH 08/14] resolve: Fix resolution of empty paths passed from rustdoc --- compiler/rustc_resolve/src/lib.rs | 4 +++- src/test/rustdoc-ui/intra-doc/global-path.rs | 8 ++++++++ src/test/rustdoc-ui/intra-doc/global-path.stderr | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/test/rustdoc-ui/intra-doc/global-path.rs create mode 100644 src/test/rustdoc-ui/intra-doc/global-path.stderr diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index 3e67727782658..0c7d2f7b4e5ed 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -3298,7 +3298,9 @@ impl<'a> Resolver<'a> { PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => { Some(path_res.base_res()) } - PathResult::NonModule(..) | PathResult::Failed { .. } => None, + PathResult::Module(ModuleOrUniformRoot::ExternPrelude) + | PathResult::NonModule(..) + | PathResult::Failed { .. } => None, PathResult::Module(..) | PathResult::Indeterminate => unreachable!(), } } diff --git a/src/test/rustdoc-ui/intra-doc/global-path.rs b/src/test/rustdoc-ui/intra-doc/global-path.rs new file mode 100644 index 0000000000000..cc7a5fa1c7372 --- /dev/null +++ b/src/test/rustdoc-ui/intra-doc/global-path.rs @@ -0,0 +1,8 @@ +// Doc link path with empty prefix that resolves to "extern prelude" instead of a module. + +// check-pass +// edition:2018 + +/// [::Unresolved] +//~^ WARN unresolved link to `::Unresolved` +pub struct Item; diff --git a/src/test/rustdoc-ui/intra-doc/global-path.stderr b/src/test/rustdoc-ui/intra-doc/global-path.stderr new file mode 100644 index 0000000000000..02379cd6cdf69 --- /dev/null +++ b/src/test/rustdoc-ui/intra-doc/global-path.stderr @@ -0,0 +1,10 @@ +warning: unresolved link to `::Unresolved` + --> $DIR/global-path.rs:6:6 + | +LL | /// [::Unresolved] + | ^^^^^^^^^^^^ no item named `` in scope + | + = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default + +warning: 1 warning emitted + From 72e3e0e6f5fb72d5f947e07ef89455d71a6ff3ff Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Fri, 1 Apr 2022 19:51:50 -0400 Subject: [PATCH 09/14] Move some tests with compare-mode=nll output to revisions --- ...e-50716.stderr => issue-50716.base.stderr} | 4 +-- src/test/ui/nll/issue-50716.nll.stderr | 2 +- src/test/ui/nll/issue-50716.rs | 4 +++ ...e-52742.stderr => issue-52742.base.stderr} | 6 ++-- src/test/ui/nll/issue-52742.nll.stderr | 2 +- src/test/ui/nll/issue-52742.rs | 5 +++ ...e-55394.stderr => issue-55394.base.stderr} | 10 +++--- src/test/ui/nll/issue-55394.nll.stderr | 2 +- src/test/ui/nll/issue-55394.rs | 4 +++ ...e-55401.stderr => issue-55401.base.stderr} | 4 +-- src/test/ui/nll/issue-55401.nll.stderr | 2 +- src/test/ui/nll/issue-55401.rs | 4 +++ .../nll/{lub-if.stderr => lub-if.base.stderr} | 8 ++--- src/test/ui/nll/lub-if.nll.stderr | 4 +-- src/test/ui/nll/lub-if.rs | 12 +++++-- ...lub-match.stderr => lub-match.base.stderr} | 8 ++--- src/test/ui/nll/lub-match.nll.stderr | 4 +-- src/test/ui/nll/lub-match.rs | 12 +++++-- ...rr => type-alias-free-regions.base.stderr} | 20 +++++------ .../ui/nll/type-alias-free-regions.nll.stderr | 4 +-- src/test/ui/nll/type-alias-free-regions.rs | 4 +++ ...> constant-in-expr-inherent-1.base.stderr} | 2 +- .../constant-in-expr-inherent-1.nll.stderr | 2 +- .../constant-in-expr-inherent-1.rs | 4 +++ ...=> constant-in-expr-normalize.base.stderr} | 4 +-- .../constant-in-expr-normalize.nll.stderr | 2 +- .../constant-in-expr-normalize.rs | 4 +++ ...constant-in-expr-trait-item-1.base.stderr} | 4 +-- .../constant-in-expr-trait-item-1.nll.stderr | 2 +- .../constant-in-expr-trait-item-1.rs | 4 +++ ...constant-in-expr-trait-item-2.base.stderr} | 4 +-- .../constant-in-expr-trait-item-2.nll.stderr | 2 +- .../constant-in-expr-trait-item-2.rs | 4 +++ ...constant-in-expr-trait-item-3.base.stderr} | 8 ++--- .../constant-in-expr-trait-item-3.nll.stderr | 2 +- .../constant-in-expr-trait-item-3.rs | 4 +++ .../{rfc1623.stderr => rfc1623.base.stderr} | 2 +- src/test/ui/rfc1623.nll.stderr | 36 ++++++++++--------- src/test/ui/rfc1623.rs | 10 +++++- 39 files changed, 147 insertions(+), 78 deletions(-) rename src/test/ui/nll/{issue-50716.stderr => issue-50716.base.stderr} (88%) rename src/test/ui/nll/{issue-52742.stderr => issue-52742.base.stderr} (85%) rename src/test/ui/nll/{issue-55394.stderr => issue-55394.base.stderr} (83%) rename src/test/ui/nll/{issue-55401.stderr => issue-55401.base.stderr} (89%) rename src/test/ui/nll/{lub-if.stderr => lub-if.base.stderr} (88%) rename src/test/ui/nll/{lub-match.stderr => lub-match.base.stderr} (87%) rename src/test/ui/nll/{type-alias-free-regions.stderr => type-alias-free-regions.base.stderr} (79%) rename src/test/ui/nll/user-annotations/{constant-in-expr-inherent-1.stderr => constant-in-expr-inherent-1.base.stderr} (90%) rename src/test/ui/nll/user-annotations/{constant-in-expr-normalize.stderr => constant-in-expr-normalize.base.stderr} (83%) rename src/test/ui/nll/user-annotations/{constant-in-expr-trait-item-1.stderr => constant-in-expr-trait-item-1.base.stderr} (82%) rename src/test/ui/nll/user-annotations/{constant-in-expr-trait-item-2.stderr => constant-in-expr-trait-item-2.base.stderr} (82%) rename src/test/ui/nll/user-annotations/{constant-in-expr-trait-item-3.stderr => constant-in-expr-trait-item-3.base.stderr} (78%) rename src/test/ui/{rfc1623.stderr => rfc1623.base.stderr} (93%) diff --git a/src/test/ui/nll/issue-50716.stderr b/src/test/ui/nll/issue-50716.base.stderr similarity index 88% rename from src/test/ui/nll/issue-50716.stderr rename to src/test/ui/nll/issue-50716.base.stderr index be68d252f32f0..0dcf06481427d 100644 --- a/src/test/ui/nll/issue-50716.stderr +++ b/src/test/ui/nll/issue-50716.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/issue-50716.rs:14:9 + --> $DIR/issue-50716.rs:18:9 | LL | let _x = *s; | ^^ lifetime mismatch @@ -7,7 +7,7 @@ LL | let _x = *s; = note: expected type `<<&'a T as A>::X as Sized>` found type `<<&'static T as A>::X as Sized>` note: the lifetime `'a` as defined here... - --> $DIR/issue-50716.rs:9:8 + --> $DIR/issue-50716.rs:13:8 | LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>) | ^^ diff --git a/src/test/ui/nll/issue-50716.nll.stderr b/src/test/ui/nll/issue-50716.nll.stderr index 38dd1b5f6fe73..a8f4d694ba7d1 100644 --- a/src/test/ui/nll/issue-50716.nll.stderr +++ b/src/test/ui/nll/issue-50716.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/issue-50716.rs:14:14 + --> $DIR/issue-50716.rs:18:14 | LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>) | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/issue-50716.rs b/src/test/ui/nll/issue-50716.rs index c2fc345fa2ba2..bd44d3eff9fc8 100644 --- a/src/test/ui/nll/issue-50716.rs +++ b/src/test/ui/nll/issue-50716.rs @@ -2,6 +2,10 @@ // Regression test for the issue #50716: NLL ignores lifetimes bounds // derived from `Sized` requirements +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait A { type X: ?Sized; } diff --git a/src/test/ui/nll/issue-52742.stderr b/src/test/ui/nll/issue-52742.base.stderr similarity index 85% rename from src/test/ui/nll/issue-52742.stderr rename to src/test/ui/nll/issue-52742.base.stderr index 67bac14b6e4e1..259f378f70b5c 100644 --- a/src/test/ui/nll/issue-52742.stderr +++ b/src/test/ui/nll/issue-52742.base.stderr @@ -1,16 +1,16 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/issue-52742.rs:12:18 + --> $DIR/issue-52742.rs:17:18 | LL | self.y = b.z | ^^^ | note: ...the reference is valid for the lifetime `'_` as defined here... - --> $DIR/issue-52742.rs:10:10 + --> $DIR/issue-52742.rs:15:10 | LL | impl Foo<'_, '_> { | ^^ note: ...but the borrowed content is only valid for the anonymous lifetime defined here - --> $DIR/issue-52742.rs:11:31 + --> $DIR/issue-52742.rs:16:31 | LL | fn take_bar(&mut self, b: Bar<'_>) { | ^^^^^^^ diff --git a/src/test/ui/nll/issue-52742.nll.stderr b/src/test/ui/nll/issue-52742.nll.stderr index 0f6d6cd4fa180..6828418a78ec1 100644 --- a/src/test/ui/nll/issue-52742.nll.stderr +++ b/src/test/ui/nll/issue-52742.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/issue-52742.rs:12:9 + --> $DIR/issue-52742.rs:17:9 | LL | fn take_bar(&mut self, b: Bar<'_>) { | --------- -- let's call this `'1` diff --git a/src/test/ui/nll/issue-52742.rs b/src/test/ui/nll/issue-52742.rs index d3e201b8ae8e7..5ec5770c5c206 100644 --- a/src/test/ui/nll/issue-52742.rs +++ b/src/test/ui/nll/issue-52742.rs @@ -1,3 +1,8 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + + struct Foo<'a, 'b> { x: &'a u32, y: &'b u32, diff --git a/src/test/ui/nll/issue-55394.stderr b/src/test/ui/nll/issue-55394.base.stderr similarity index 83% rename from src/test/ui/nll/issue-55394.stderr rename to src/test/ui/nll/issue-55394.base.stderr index 197f8dfa2abe7..cc87954732c4e 100644 --- a/src/test/ui/nll/issue-55394.stderr +++ b/src/test/ui/nll/issue-55394.base.stderr @@ -1,26 +1,26 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'s` due to conflicting requirements - --> $DIR/issue-55394.rs:9:9 + --> $DIR/issue-55394.rs:13:9 | LL | Foo { bar } | ^^^ | note: first, the lifetime cannot outlive the anonymous lifetime defined here... - --> $DIR/issue-55394.rs:8:17 + --> $DIR/issue-55394.rs:12:17 | LL | fn new(bar: &mut Bar) -> Self { | ^^^^^^^^ note: ...so that reference does not outlive borrowed content - --> $DIR/issue-55394.rs:9:15 + --> $DIR/issue-55394.rs:13:15 | LL | Foo { bar } | ^^^ note: but, the lifetime must be valid for the lifetime `'_` as defined here... - --> $DIR/issue-55394.rs:7:10 + --> $DIR/issue-55394.rs:11:10 | LL | impl Foo<'_> { | ^^ note: ...so that the types are compatible - --> $DIR/issue-55394.rs:9:9 + --> $DIR/issue-55394.rs:13:9 | LL | Foo { bar } | ^^^^^^^^^^^ diff --git a/src/test/ui/nll/issue-55394.nll.stderr b/src/test/ui/nll/issue-55394.nll.stderr index 24b8c84b4a96a..c166c458c5013 100644 --- a/src/test/ui/nll/issue-55394.nll.stderr +++ b/src/test/ui/nll/issue-55394.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/issue-55394.rs:9:9 + --> $DIR/issue-55394.rs:13:9 | LL | fn new(bar: &mut Bar) -> Self { | - ---- return type is Foo<'2> diff --git a/src/test/ui/nll/issue-55394.rs b/src/test/ui/nll/issue-55394.rs index f813d1c915cf6..9c4fcdf641909 100644 --- a/src/test/ui/nll/issue-55394.rs +++ b/src/test/ui/nll/issue-55394.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + struct Bar; struct Foo<'s> { diff --git a/src/test/ui/nll/issue-55401.stderr b/src/test/ui/nll/issue-55401.base.stderr similarity index 89% rename from src/test/ui/nll/issue-55401.stderr rename to src/test/ui/nll/issue-55401.base.stderr index 55c51d532e779..d4e9f2b4154ef 100644 --- a/src/test/ui/nll/issue-55401.stderr +++ b/src/test/ui/nll/issue-55401.base.stderr @@ -1,12 +1,12 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/issue-55401.rs:3:5 + --> $DIR/issue-55401.rs:7:5 | LL | *y | ^^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/issue-55401.rs:1:47 + --> $DIR/issue-55401.rs:5:47 | LL | fn static_to_a_to_static_through_ref_in_tuple<'a>(x: &'a u32) -> &'static u32 { | ^^ diff --git a/src/test/ui/nll/issue-55401.nll.stderr b/src/test/ui/nll/issue-55401.nll.stderr index 4f797f26a1a7c..1318dc6765714 100644 --- a/src/test/ui/nll/issue-55401.nll.stderr +++ b/src/test/ui/nll/issue-55401.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/issue-55401.rs:3:5 + --> $DIR/issue-55401.rs:7:5 | LL | fn static_to_a_to_static_through_ref_in_tuple<'a>(x: &'a u32) -> &'static u32 { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/issue-55401.rs b/src/test/ui/nll/issue-55401.rs index fc45824e903c8..10f38c53dfdc7 100644 --- a/src/test/ui/nll/issue-55401.rs +++ b/src/test/ui/nll/issue-55401.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + fn static_to_a_to_static_through_ref_in_tuple<'a>(x: &'a u32) -> &'static u32 { let (ref y, _z): (&'a u32, u32) = (&22, 44); *y //~ ERROR diff --git a/src/test/ui/nll/lub-if.stderr b/src/test/ui/nll/lub-if.base.stderr similarity index 88% rename from src/test/ui/nll/lub-if.stderr rename to src/test/ui/nll/lub-if.base.stderr index a12c48582c79e..ea9f5d4b2b1aa 100644 --- a/src/test/ui/nll/lub-if.stderr +++ b/src/test/ui/nll/lub-if.base.stderr @@ -1,25 +1,25 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/lub-if.rs:28:9 + --> $DIR/lub-if.rs:32:9 | LL | s | ^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/lub-if.rs:23:17 + --> $DIR/lub-if.rs:27:17 | LL | pub fn opt_str2<'a>(maybestr: &'a Option) -> &'static str { | ^^ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/lub-if.rs:35:9 + --> $DIR/lub-if.rs:41:9 | LL | s | ^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/lub-if.rs:32:17 + --> $DIR/lub-if.rs:38:17 | LL | pub fn opt_str3<'a>(maybestr: &'a Option) -> &'static str { | ^^ diff --git a/src/test/ui/nll/lub-if.nll.stderr b/src/test/ui/nll/lub-if.nll.stderr index 832688f5162b3..2fd6e69628d47 100644 --- a/src/test/ui/nll/lub-if.nll.stderr +++ b/src/test/ui/nll/lub-if.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/lub-if.rs:28:9 + --> $DIR/lub-if.rs:32:9 | LL | pub fn opt_str2<'a>(maybestr: &'a Option) -> &'static str { | -- lifetime `'a` defined here @@ -8,7 +8,7 @@ LL | s | ^ returning this value requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/lub-if.rs:35:9 + --> $DIR/lub-if.rs:41:9 | LL | pub fn opt_str3<'a>(maybestr: &'a Option) -> &'static str { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/lub-if.rs b/src/test/ui/nll/lub-if.rs index 132b83810ead7..18561d63935e7 100644 --- a/src/test/ui/nll/lub-if.rs +++ b/src/test/ui/nll/lub-if.rs @@ -2,6 +2,10 @@ // of the various arms, particularly in the case where regions are // involved. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + pub fn opt_str0<'a>(maybestr: &'a Option) -> &'a str { if maybestr.is_none() { "(none)" @@ -25,14 +29,18 @@ pub fn opt_str2<'a>(maybestr: &'a Option) -> &'static str { "(none)" } else { let s: &'a str = maybestr.as_ref().unwrap(); - s //~ ERROR E0312 + s + //[base]~^ ERROR E0312 + //[nll]~^^ ERROR lifetime may not live long enough } } pub fn opt_str3<'a>(maybestr: &'a Option) -> &'static str { if maybestr.is_some() { let s: &'a str = maybestr.as_ref().unwrap(); - s //~ ERROR E0312 + s + //[base]~^ ERROR E0312 + //[nll]~^^ ERROR lifetime may not live long enough } else { "(none)" } diff --git a/src/test/ui/nll/lub-match.stderr b/src/test/ui/nll/lub-match.base.stderr similarity index 87% rename from src/test/ui/nll/lub-match.stderr rename to src/test/ui/nll/lub-match.base.stderr index 04d50f5ebf471..38952133160ed 100644 --- a/src/test/ui/nll/lub-match.stderr +++ b/src/test/ui/nll/lub-match.base.stderr @@ -1,25 +1,25 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/lub-match.rs:30:13 + --> $DIR/lub-match.rs:34:13 | LL | s | ^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/lub-match.rs:25:17 + --> $DIR/lub-match.rs:29:17 | LL | pub fn opt_str2<'a>(maybestr: &'a Option) -> &'static str { | ^^ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/lub-match.rs:39:13 + --> $DIR/lub-match.rs:45:13 | LL | s | ^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/lub-match.rs:35:17 + --> $DIR/lub-match.rs:41:17 | LL | pub fn opt_str3<'a>(maybestr: &'a Option) -> &'static str { | ^^ diff --git a/src/test/ui/nll/lub-match.nll.stderr b/src/test/ui/nll/lub-match.nll.stderr index 3a344a77d2c2d..c78d0cb641dc8 100644 --- a/src/test/ui/nll/lub-match.nll.stderr +++ b/src/test/ui/nll/lub-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/lub-match.rs:30:13 + --> $DIR/lub-match.rs:34:13 | LL | pub fn opt_str2<'a>(maybestr: &'a Option) -> &'static str { | -- lifetime `'a` defined here @@ -8,7 +8,7 @@ LL | s | ^ returning this value requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/lub-match.rs:39:13 + --> $DIR/lub-match.rs:45:13 | LL | pub fn opt_str3<'a>(maybestr: &'a Option) -> &'static str { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/lub-match.rs b/src/test/ui/nll/lub-match.rs index 1cd4a02a3ef55..084d8b95f5893 100644 --- a/src/test/ui/nll/lub-match.rs +++ b/src/test/ui/nll/lub-match.rs @@ -2,6 +2,10 @@ // of the various arms, particularly in the case where regions are // involved. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + pub fn opt_str0<'a>(maybestr: &'a Option) -> &'a str { match *maybestr { Some(ref s) => { @@ -27,7 +31,9 @@ pub fn opt_str2<'a>(maybestr: &'a Option) -> &'static str { None => "(none)", Some(ref s) => { let s: &'a str = s; - s //~ ERROR E0312 + s + //[base]~^ ERROR E0312 + //[nll]~^^ ERROR lifetime may not live long enough } } } @@ -36,7 +42,9 @@ pub fn opt_str3<'a>(maybestr: &'a Option) -> &'static str { match *maybestr { Some(ref s) => { let s: &'a str = s; - s //~ ERROR E0312 + s + //[base]~^ ERROR E0312 + //[nll]~^^ ERROR lifetime may not live long enough } None => "(none)", } diff --git a/src/test/ui/nll/type-alias-free-regions.stderr b/src/test/ui/nll/type-alias-free-regions.base.stderr similarity index 79% rename from src/test/ui/nll/type-alias-free-regions.stderr rename to src/test/ui/nll/type-alias-free-regions.base.stderr index 71f5f8fb17668..010535fec6dd4 100644 --- a/src/test/ui/nll/type-alias-free-regions.stderr +++ b/src/test/ui/nll/type-alias-free-regions.base.stderr @@ -1,28 +1,28 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements - --> $DIR/type-alias-free-regions.rs:17:9 + --> $DIR/type-alias-free-regions.rs:21:9 | LL | C { f: b } | ^ | note: first, the lifetime cannot outlive the anonymous lifetime defined here... - --> $DIR/type-alias-free-regions.rs:16:24 + --> $DIR/type-alias-free-regions.rs:20:24 | LL | fn from_box(b: Box) -> Self { | ^ note: ...so that the expression is assignable - --> $DIR/type-alias-free-regions.rs:17:16 + --> $DIR/type-alias-free-regions.rs:21:16 | LL | C { f: b } | ^ = note: expected `Box>` found `Box>` note: but, the lifetime must be valid for the lifetime `'a` as defined here... - --> $DIR/type-alias-free-regions.rs:15:6 + --> $DIR/type-alias-free-regions.rs:19:6 | LL | impl<'a> FromBox<'a> for C<'a> { | ^^ note: ...so that the types are compatible - --> $DIR/type-alias-free-regions.rs:17:9 + --> $DIR/type-alias-free-regions.rs:21:9 | LL | C { f: b } | ^^^^^^^^^^ @@ -30,30 +30,30 @@ LL | C { f: b } found `C<'_>` error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements - --> $DIR/type-alias-free-regions.rs:27:16 + --> $DIR/type-alias-free-regions.rs:31:16 | LL | C { f: Box::new(b.0) } | ^^^^^^^^^^^^^ | note: first, the lifetime cannot outlive the anonymous lifetime defined here... - --> $DIR/type-alias-free-regions.rs:26:23 + --> $DIR/type-alias-free-regions.rs:30:23 | LL | fn from_tuple(b: (B,)) -> Self { | ^ note: ...so that the expression is assignable - --> $DIR/type-alias-free-regions.rs:27:25 + --> $DIR/type-alias-free-regions.rs:31:25 | LL | C { f: Box::new(b.0) } | ^^^ = note: expected `Box<&isize>` found `Box<&isize>` note: but, the lifetime must be valid for the lifetime `'a` as defined here... - --> $DIR/type-alias-free-regions.rs:25:6 + --> $DIR/type-alias-free-regions.rs:29:6 | LL | impl<'a> FromTuple<'a> for C<'a> { | ^^ note: ...so that the types are compatible - --> $DIR/type-alias-free-regions.rs:27:9 + --> $DIR/type-alias-free-regions.rs:31:9 | LL | C { f: Box::new(b.0) } | ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/nll/type-alias-free-regions.nll.stderr b/src/test/ui/nll/type-alias-free-regions.nll.stderr index 45fd5a2f1d657..6b746602d7ffd 100644 --- a/src/test/ui/nll/type-alias-free-regions.nll.stderr +++ b/src/test/ui/nll/type-alias-free-regions.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/type-alias-free-regions.rs:17:9 + --> $DIR/type-alias-free-regions.rs:21:9 | LL | impl<'a> FromBox<'a> for C<'a> { | -- lifetime `'a` defined here @@ -9,7 +9,7 @@ LL | C { f: b } | ^^^^^^^^^^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1` error: lifetime may not live long enough - --> $DIR/type-alias-free-regions.rs:27:9 + --> $DIR/type-alias-free-regions.rs:31:9 | LL | impl<'a> FromTuple<'a> for C<'a> { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/type-alias-free-regions.rs b/src/test/ui/nll/type-alias-free-regions.rs index fd5566f35d514..59ef034493770 100644 --- a/src/test/ui/nll/type-alias-free-regions.rs +++ b/src/test/ui/nll/type-alias-free-regions.rs @@ -1,6 +1,10 @@ // Test that we don't assume that type aliases have the same type parameters // as the type they alias and then panic when we see this. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + type A<'a> = &'a isize; type B<'a> = Box>; diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.base.stderr similarity index 90% rename from src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr rename to src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.base.stderr index 4a6378b84f1e6..ba17994b43766 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.base.stderr @@ -1,5 +1,5 @@ error[E0759]: `fn` parameter has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement - --> $DIR/constant-in-expr-inherent-1.rs:8:5 + --> $DIR/constant-in-expr-inherent-1.rs:12:5 | LL | fn foo<'a>(_: &'a u32) -> &'static u32 { | ------- this data with lifetime `'a`... diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.nll.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.nll.stderr index c39301588acfa..0399d5f893d85 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.nll.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/constant-in-expr-inherent-1.rs:8:5 + --> $DIR/constant-in-expr-inherent-1.rs:12:5 | LL | fn foo<'a>(_: &'a u32) -> &'static u32 { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.rs b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.rs index e3a8a5f58dfda..0bd316aa84cfe 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.rs +++ b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + struct Foo<'a> { x: &'a u32 } impl<'a> Foo<'a> { diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.base.stderr similarity index 83% rename from src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr rename to src/test/ui/nll/user-annotations/constant-in-expr-normalize.base.stderr index d33c458421406..61efa879fc04b 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.base.stderr @@ -1,12 +1,12 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/constant-in-expr-normalize.rs:18:5 + --> $DIR/constant-in-expr-normalize.rs:22:5 | LL | <() as Foo<'a>>::C | ^^^^^^^^^^^^^^^^^^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/constant-in-expr-normalize.rs:17:8 + --> $DIR/constant-in-expr-normalize.rs:21:8 | LL | fn foo<'a>(_: &'a u32) -> &'static u32 { | ^^ diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.nll.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.nll.stderr index 541a2cfaf299a..4c1e6bee2aa0d 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.nll.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/constant-in-expr-normalize.rs:18:5 + --> $DIR/constant-in-expr-normalize.rs:22:5 | LL | fn foo<'a>(_: &'a u32) -> &'static u32 { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs index b7095430d8bd2..262f0ae318f8e 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs +++ b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Mirror { type Me; } diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.base.stderr similarity index 82% rename from src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr rename to src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.base.stderr index 3ec3a2af8cab3..93f7156e55757 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.base.stderr @@ -1,12 +1,12 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/constant-in-expr-trait-item-1.rs:10:5 + --> $DIR/constant-in-expr-trait-item-1.rs:14:5 | LL | <() as Foo<'a>>::C | ^^^^^^^^^^^^^^^^^^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/constant-in-expr-trait-item-1.rs:9:8 + --> $DIR/constant-in-expr-trait-item-1.rs:13:8 | LL | fn foo<'a>(_: &'a u32) -> &'static u32 { | ^^ diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.nll.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.nll.stderr index ea0fcb6d634cd..990d0ae385fc1 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.nll.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/constant-in-expr-trait-item-1.rs:10:5 + --> $DIR/constant-in-expr-trait-item-1.rs:14:5 | LL | fn foo<'a>(_: &'a u32) -> &'static u32 { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.rs b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.rs index e0400b2cc0267..512edb501c4ea 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.rs +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Foo<'a> { const C: &'a u32; } diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.base.stderr similarity index 82% rename from src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr rename to src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.base.stderr index b36bc3bdd9cdb..f43ade38937d3 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.base.stderr @@ -1,12 +1,12 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/constant-in-expr-trait-item-2.rs:10:5 + --> $DIR/constant-in-expr-trait-item-2.rs:14:5 | LL | >::C | ^^^^^^^^^^^^^^^^^ | = note: ...the reference is valid for the static lifetime... note: ...but the borrowed content is only valid for the lifetime `'a` as defined here - --> $DIR/constant-in-expr-trait-item-2.rs:9:8 + --> $DIR/constant-in-expr-trait-item-2.rs:13:8 | LL | fn foo<'a, T: Foo<'a>>() -> &'static u32 { | ^^ diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.nll.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.nll.stderr index ff549f1d88bd4..8c0430f1e092c 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.nll.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/constant-in-expr-trait-item-2.rs:10:5 + --> $DIR/constant-in-expr-trait-item-2.rs:14:5 | LL | fn foo<'a, T: Foo<'a>>() -> &'static u32 { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.rs b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.rs index 73c4e577b05c0..b3dfbd984ebbf 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.rs +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Foo<'a> { const C: &'a u32; } diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.base.stderr similarity index 78% rename from src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr rename to src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.base.stderr index 806492b71f449..e9393aa05ab39 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.base.stderr @@ -1,16 +1,16 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements - --> $DIR/constant-in-expr-trait-item-3.rs:10:5 + --> $DIR/constant-in-expr-trait-item-3.rs:14:5 | LL | T::C | ^^^^ | note: first, the lifetime cannot outlive the lifetime `'a` as defined here... - --> $DIR/constant-in-expr-trait-item-3.rs:9:8 + --> $DIR/constant-in-expr-trait-item-3.rs:13:8 | LL | fn foo<'a, T: Foo<'a>>() -> &'static u32 { | ^^ note: ...so that the types are compatible - --> $DIR/constant-in-expr-trait-item-3.rs:10:5 + --> $DIR/constant-in-expr-trait-item-3.rs:14:5 | LL | T::C | ^^^^ @@ -18,7 +18,7 @@ LL | T::C found `Foo<'a>` = note: but, the lifetime must be valid for the static lifetime... note: ...so that reference does not outlive borrowed content - --> $DIR/constant-in-expr-trait-item-3.rs:10:5 + --> $DIR/constant-in-expr-trait-item-3.rs:14:5 | LL | T::C | ^^^^ diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.nll.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.nll.stderr index 7f160d8e398b9..cbcaf042f0539 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.nll.stderr +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/constant-in-expr-trait-item-3.rs:10:5 + --> $DIR/constant-in-expr-trait-item-3.rs:14:5 | LL | fn foo<'a, T: Foo<'a>>() -> &'static u32 { | -- lifetime `'a` defined here diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.rs b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.rs index 567e31ef93632..6e78d94c2f63a 100644 --- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.rs +++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Foo<'a> { const C: &'a u32; } diff --git a/src/test/ui/rfc1623.stderr b/src/test/ui/rfc1623.base.stderr similarity index 93% rename from src/test/ui/rfc1623.stderr rename to src/test/ui/rfc1623.base.stderr index 16829b5caa0b6..6d389a1317a9f 100644 --- a/src/test/ui/rfc1623.stderr +++ b/src/test/ui/rfc1623.base.stderr @@ -1,5 +1,5 @@ error: implementation of `FnOnce` is not general enough - --> $DIR/rfc1623.rs:28:8 + --> $DIR/rfc1623.rs:36:8 | LL | f: &id, | ^^^ implementation of `FnOnce` is not general enough diff --git a/src/test/ui/rfc1623.nll.stderr b/src/test/ui/rfc1623.nll.stderr index 86513b6064d2d..f85b6ff8ff75b 100644 --- a/src/test/ui/rfc1623.nll.stderr +++ b/src/test/ui/rfc1623.nll.stderr @@ -1,11 +1,12 @@ error[E0308]: mismatched types - --> $DIR/rfc1623.rs:25:35 + --> $DIR/rfc1623.rs:29:35 | LL | static SOME_STRUCT: &SomeStruct = &SomeStruct { | ___________________________________^ -LL | | foo: &Foo { bools: &[false, true] }, -LL | | bar: &Bar { bools: &[true, true] }, -LL | | f: &id, +LL | | +LL | | +LL | | +... | LL | | LL | | }; | |_^ one type is more general than the other @@ -14,13 +15,14 @@ LL | | }; found type `Fn<(&Foo<'_>,)>` error[E0308]: mismatched types - --> $DIR/rfc1623.rs:25:35 + --> $DIR/rfc1623.rs:29:35 | LL | static SOME_STRUCT: &SomeStruct = &SomeStruct { | ___________________________________^ -LL | | foo: &Foo { bools: &[false, true] }, -LL | | bar: &Bar { bools: &[true, true] }, -LL | | f: &id, +LL | | +LL | | +LL | | +... | LL | | LL | | }; | |_^ one type is more general than the other @@ -29,13 +31,14 @@ LL | | }; found type `Fn<(&Foo<'_>,)>` error: implementation of `FnOnce` is not general enough - --> $DIR/rfc1623.rs:25:35 + --> $DIR/rfc1623.rs:29:35 | LL | static SOME_STRUCT: &SomeStruct = &SomeStruct { | ___________________________________^ -LL | | foo: &Foo { bools: &[false, true] }, -LL | | bar: &Bar { bools: &[true, true] }, -LL | | f: &id, +LL | | +LL | | +LL | | +... | LL | | LL | | }; | |_^ implementation of `FnOnce` is not general enough @@ -44,13 +47,14 @@ LL | | }; = note: ...but it actually implements `FnOnce<(&'2 Foo<'_>,)>`, for some specific lifetime `'2` error: implementation of `FnOnce` is not general enough - --> $DIR/rfc1623.rs:25:35 + --> $DIR/rfc1623.rs:29:35 | LL | static SOME_STRUCT: &SomeStruct = &SomeStruct { | ___________________________________^ -LL | | foo: &Foo { bools: &[false, true] }, -LL | | bar: &Bar { bools: &[true, true] }, -LL | | f: &id, +LL | | +LL | | +LL | | +... | LL | | LL | | }; | |_^ implementation of `FnOnce` is not general enough diff --git a/src/test/ui/rfc1623.rs b/src/test/ui/rfc1623.rs index 32e00f9cb76c3..0e9d214032425 100644 --- a/src/test/ui/rfc1623.rs +++ b/src/test/ui/rfc1623.rs @@ -1,3 +1,7 @@ +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + #![allow(dead_code)] fn non_elidable<'a, 'b>(a: &'a u8, b: &'b u8) -> &'a u8 { @@ -23,10 +27,14 @@ fn id(t: T) -> T { } static SOME_STRUCT: &SomeStruct = &SomeStruct { + //[nll]~^ ERROR mismatched types + //[nll]~| ERROR mismatched types + //[nll]~| ERROR implementation of `FnOnce` is not general enough + //[nll]~| ERROR implementation of `FnOnce` is not general enough foo: &Foo { bools: &[false, true] }, bar: &Bar { bools: &[true, true] }, f: &id, - //~^ ERROR implementation of `FnOnce` is not general enough + //[base]~^ ERROR implementation of `FnOnce` is not general enough }; // very simple test for a 'static static with default lifetime From 1c1d01eb495fb663f64766a5e7e1e23b9a2590e7 Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:12:17 -0400 Subject: [PATCH 10/14] More nll revisions --- ...=> variance-associated-types2.base.stderr} | 4 +- .../variance-associated-types2.nll.stderr | 2 +- .../ui/variance/variance-associated-types2.rs | 7 +- ...ariance-btree-invariant-types.base.stderr} | 64 ++++++++--------- .../variance-btree-invariant-types.nll.stderr | 32 ++++----- .../variance-btree-invariant-types.rs | 68 ++++++++++++++----- ...=> variance-cell-is-invariant.base.stderr} | 2 +- .../variance-cell-is-invariant.nll.stderr | 2 +- .../ui/variance/variance-cell-is-invariant.rs | 8 ++- ...ance-contravariant-arg-object.base.stderr} | 12 ++-- ...riance-contravariant-arg-object.nll.stderr | 4 +- .../variance-contravariant-arg-object.rs | 12 +++- ...contravariant-arg-trait-match.base.stderr} | 12 ++-- ...e-contravariant-arg-trait-match.nll.stderr | 4 +- .../variance-contravariant-arg-trait-match.rs | 12 +++- ...ontravariant-self-trait-match.base.stderr} | 12 ++-- ...-contravariant-self-trait-match.nll.stderr | 4 +- ...variance-contravariant-self-trait-match.rs | 12 +++- ...variance-covariant-arg-object.base.stderr} | 12 ++-- .../variance-covariant-arg-object.nll.stderr | 4 +- .../variance/variance-covariant-arg-object.rs | 12 +++- ...nce-covariant-arg-trait-match.base.stderr} | 12 ++-- ...iance-covariant-arg-trait-match.nll.stderr | 4 +- .../variance-covariant-arg-trait-match.rs | 12 +++- ...ce-covariant-self-trait-match.base.stderr} | 12 ++-- ...ance-covariant-self-trait-match.nll.stderr | 4 +- .../variance-covariant-self-trait-match.rs | 12 +++- ...variance-invariant-arg-object.base.stderr} | 12 ++-- .../variance-invariant-arg-object.nll.stderr | 4 +- .../variance/variance-invariant-arg-object.rs | 12 +++- ...nce-invariant-arg-trait-match.base.stderr} | 12 ++-- ...iance-invariant-arg-trait-match.nll.stderr | 4 +- .../variance-invariant-arg-trait-match.rs | 12 +++- ...ce-invariant-self-trait-match.base.stderr} | 12 ++-- ...ance-invariant-self-trait-match.nll.stderr | 4 +- .../variance-invariant-self-trait-match.rs | 12 +++- ...rr => variance-trait-matching.base.stderr} | 2 +- .../variance-trait-matching.nll.stderr | 2 +- .../ui/variance/variance-trait-matching.rs | 4 ++ ...ce-use-contravariant-struct-1.base.stderr} | 6 +- ...ance-use-contravariant-struct-1.nll.stderr | 2 +- .../variance-use-contravariant-struct-1.rs | 8 ++- ...riance-use-covariant-struct-1.base.stderr} | 6 +- ...variance-use-covariant-struct-1.nll.stderr | 2 +- .../variance-use-covariant-struct-1.rs | 8 ++- ...riance-use-invariant-struct-1.base.stderr} | 12 ++-- ...variance-use-invariant-struct-1.nll.stderr | 4 +- .../variance-use-invariant-struct-1.rs | 12 +++- ...od.stderr => wf-static-method.base.stderr} | 48 ++++++------- src/test/ui/wf/wf-static-method.nll.stderr | 12 ++-- src/test/ui/wf/wf-static-method.rs | 26 +++++-- ...-2.stderr => where-for-self-2.base.stderr} | 2 +- .../where-clauses/where-for-self-2.nll.stderr | 2 +- src/test/ui/where-clauses/where-for-self-2.rs | 4 ++ 54 files changed, 380 insertions(+), 223 deletions(-) rename src/test/ui/variance/{variance-associated-types2.stderr => variance-associated-types2.base.stderr} (85%) rename src/test/ui/variance/{variance-btree-invariant-types.stderr => variance-btree-invariant-types.base.stderr} (84%) rename src/test/ui/variance/{variance-cell-is-invariant.stderr => variance-cell-is-invariant.base.stderr} (92%) rename src/test/ui/variance/{variance-contravariant-arg-object.stderr => variance-contravariant-arg-object.base.stderr} (78%) rename src/test/ui/variance/{variance-contravariant-arg-trait-match.stderr => variance-contravariant-arg-trait-match.base.stderr} (75%) rename src/test/ui/variance/{variance-contravariant-self-trait-match.stderr => variance-contravariant-self-trait-match.base.stderr} (75%) rename src/test/ui/variance/{variance-invariant-arg-object.stderr => variance-covariant-arg-object.base.stderr} (79%) rename src/test/ui/variance/{variance-invariant-arg-trait-match.stderr => variance-covariant-arg-trait-match.base.stderr} (76%) rename src/test/ui/variance/{variance-invariant-self-trait-match.stderr => variance-covariant-self-trait-match.base.stderr} (76%) rename src/test/ui/variance/{variance-covariant-arg-object.stderr => variance-invariant-arg-object.base.stderr} (79%) rename src/test/ui/variance/{variance-covariant-arg-trait-match.stderr => variance-invariant-arg-trait-match.base.stderr} (76%) rename src/test/ui/variance/{variance-covariant-self-trait-match.stderr => variance-invariant-self-trait-match.base.stderr} (76%) rename src/test/ui/variance/{variance-trait-matching.stderr => variance-trait-matching.base.stderr} (89%) rename src/test/ui/variance/{variance-use-contravariant-struct-1.stderr => variance-use-contravariant-struct-1.base.stderr} (76%) rename src/test/ui/variance/{variance-use-covariant-struct-1.stderr => variance-use-covariant-struct-1.base.stderr} (78%) rename src/test/ui/variance/{variance-use-invariant-struct-1.stderr => variance-use-invariant-struct-1.base.stderr} (76%) rename src/test/ui/wf/{wf-static-method.stderr => wf-static-method.base.stderr} (81%) rename src/test/ui/where-clauses/{where-for-self-2.stderr => where-for-self-2.base.stderr} (90%) diff --git a/src/test/ui/variance/variance-associated-types2.stderr b/src/test/ui/variance/variance-associated-types2.base.stderr similarity index 85% rename from src/test/ui/variance/variance-associated-types2.stderr rename to src/test/ui/variance/variance-associated-types2.base.stderr index af4f2a7c2a066..c8ace0848719b 100644 --- a/src/test/ui/variance/variance-associated-types2.stderr +++ b/src/test/ui/variance/variance-associated-types2.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-associated-types2.rs:13:42 + --> $DIR/variance-associated-types2.rs:17:42 | LL | let _: Box> = make(); | ^^^^^^ lifetime mismatch @@ -7,7 +7,7 @@ LL | let _: Box> = make(); = note: expected trait object `dyn Foo` found trait object `dyn Foo` note: the lifetime `'a` as defined here... - --> $DIR/variance-associated-types2.rs:12:9 + --> $DIR/variance-associated-types2.rs:16:9 | LL | fn take<'a>(_: &'a u32) { | ^^ diff --git a/src/test/ui/variance/variance-associated-types2.nll.stderr b/src/test/ui/variance/variance-associated-types2.nll.stderr index 35871c1236fae..b74c400969237 100644 --- a/src/test/ui/variance/variance-associated-types2.nll.stderr +++ b/src/test/ui/variance/variance-associated-types2.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-associated-types2.rs:13:12 + --> $DIR/variance-associated-types2.rs:17:12 | LL | fn take<'a>(_: &'a u32) { | -- lifetime `'a` defined here diff --git a/src/test/ui/variance/variance-associated-types2.rs b/src/test/ui/variance/variance-associated-types2.rs index 6a095fce7abfa..e3c8e6d7ca242 100644 --- a/src/test/ui/variance/variance-associated-types2.rs +++ b/src/test/ui/variance/variance-associated-types2.rs @@ -1,6 +1,10 @@ // Test that dyn Foo is invariant with respect to T. // Failure to enforce invariance here can be weaponized, see #71550 for details. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Foo { type Bar; } @@ -11,7 +15,8 @@ fn make() -> Box> { fn take<'a>(_: &'a u32) { let _: Box> = make(); - //~^ ERROR mismatched types [E0308] + //[base]~^ ERROR mismatched types [E0308] + //[nll]~^^ ERROR lifetime may not live long enough } fn main() {} diff --git a/src/test/ui/variance/variance-btree-invariant-types.stderr b/src/test/ui/variance/variance-btree-invariant-types.base.stderr similarity index 84% rename from src/test/ui/variance/variance-btree-invariant-types.stderr rename to src/test/ui/variance/variance-btree-invariant-types.base.stderr index df519e25641c3..5b78f4252b3dd 100644 --- a/src/test/ui/variance/variance-btree-invariant-types.stderr +++ b/src/test/ui/variance/variance-btree-invariant-types.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:4:5 + --> $DIR/variance-btree-invariant-types.rs:8:5 | LL | v | ^ lifetime mismatch @@ -7,14 +7,14 @@ LL | v = note: expected struct `std::collections::btree_map::IterMut<'_, &'new (), _>` found struct `std::collections::btree_map::IterMut<'_, &'static (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:3:21 + --> $DIR/variance-btree-invariant-types.rs:7:21 | LL | fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:7:5 + --> $DIR/variance-btree-invariant-types.rs:13:5 | LL | v | ^ lifetime mismatch @@ -22,14 +22,14 @@ LL | v = note: expected struct `std::collections::btree_map::IterMut<'_, _, &'new ()>` found struct `std::collections::btree_map::IterMut<'_, _, &'static ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:6:21 + --> $DIR/variance-btree-invariant-types.rs:12:21 | LL | fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:10:5 + --> $DIR/variance-btree-invariant-types.rs:18:5 | LL | v | ^ lifetime mismatch @@ -37,14 +37,14 @@ LL | v = note: expected struct `std::collections::btree_map::IterMut<'_, &'static (), _>` found struct `std::collections::btree_map::IterMut<'_, &'new (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:9:24 + --> $DIR/variance-btree-invariant-types.rs:17:24 | LL | fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:13:5 + --> $DIR/variance-btree-invariant-types.rs:23:5 | LL | v | ^ lifetime mismatch @@ -52,14 +52,14 @@ LL | v = note: expected struct `std::collections::btree_map::IterMut<'_, _, &'static ()>` found struct `std::collections::btree_map::IterMut<'_, _, &'new ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:12:24 + --> $DIR/variance-btree-invariant-types.rs:22:24 | LL | fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:17:5 + --> $DIR/variance-btree-invariant-types.rs:29:5 | LL | v | ^ lifetime mismatch @@ -67,14 +67,14 @@ LL | v = note: expected struct `RangeMut<'_, &'new (), _>` found struct `RangeMut<'_, &'static (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:16:22 + --> $DIR/variance-btree-invariant-types.rs:28:22 | LL | fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:20:5 + --> $DIR/variance-btree-invariant-types.rs:34:5 | LL | v | ^ lifetime mismatch @@ -82,14 +82,14 @@ LL | v = note: expected struct `RangeMut<'_, _, &'new ()>` found struct `RangeMut<'_, _, &'static ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:19:22 + --> $DIR/variance-btree-invariant-types.rs:33:22 | LL | fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:23:5 + --> $DIR/variance-btree-invariant-types.rs:39:5 | LL | v | ^ lifetime mismatch @@ -97,14 +97,14 @@ LL | v = note: expected struct `RangeMut<'_, &'static (), _>` found struct `RangeMut<'_, &'new (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:22:25 + --> $DIR/variance-btree-invariant-types.rs:38:25 | LL | fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:26:5 + --> $DIR/variance-btree-invariant-types.rs:44:5 | LL | v | ^ lifetime mismatch @@ -112,14 +112,14 @@ LL | v = note: expected struct `RangeMut<'_, _, &'static ()>` found struct `RangeMut<'_, _, &'new ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:25:25 + --> $DIR/variance-btree-invariant-types.rs:43:25 | LL | fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> { | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:31:5 + --> $DIR/variance-btree-invariant-types.rs:51:5 | LL | v | ^ lifetime mismatch @@ -127,14 +127,14 @@ LL | v = note: expected struct `std::collections::btree_map::OccupiedEntry<'_, &'new (), _>` found struct `std::collections::btree_map::OccupiedEntry<'_, &'static (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:29:20 + --> $DIR/variance-btree-invariant-types.rs:49:20 | LL | fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:35:5 + --> $DIR/variance-btree-invariant-types.rs:57:5 | LL | v | ^ lifetime mismatch @@ -142,14 +142,14 @@ LL | v = note: expected struct `std::collections::btree_map::OccupiedEntry<'_, _, &'new ()>` found struct `std::collections::btree_map::OccupiedEntry<'_, _, &'static ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:33:20 + --> $DIR/variance-btree-invariant-types.rs:55:20 | LL | fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:39:5 + --> $DIR/variance-btree-invariant-types.rs:63:5 | LL | v | ^ lifetime mismatch @@ -157,14 +157,14 @@ LL | v = note: expected struct `std::collections::btree_map::OccupiedEntry<'_, &'static (), _>` found struct `std::collections::btree_map::OccupiedEntry<'_, &'new (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:37:23 + --> $DIR/variance-btree-invariant-types.rs:61:23 | LL | fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:43:5 + --> $DIR/variance-btree-invariant-types.rs:69:5 | LL | v | ^ lifetime mismatch @@ -172,14 +172,14 @@ LL | v = note: expected struct `std::collections::btree_map::OccupiedEntry<'_, _, &'static ()>` found struct `std::collections::btree_map::OccupiedEntry<'_, _, &'new ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:41:23 + --> $DIR/variance-btree-invariant-types.rs:67:23 | LL | fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:48:5 + --> $DIR/variance-btree-invariant-types.rs:76:5 | LL | v | ^ lifetime mismatch @@ -187,14 +187,14 @@ LL | v = note: expected struct `std::collections::btree_map::VacantEntry<'_, &'new (), _>` found struct `std::collections::btree_map::VacantEntry<'_, &'static (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:46:20 + --> $DIR/variance-btree-invariant-types.rs:74:20 | LL | fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:52:5 + --> $DIR/variance-btree-invariant-types.rs:82:5 | LL | v | ^ lifetime mismatch @@ -202,14 +202,14 @@ LL | v = note: expected struct `std::collections::btree_map::VacantEntry<'_, _, &'new ()>` found struct `std::collections::btree_map::VacantEntry<'_, _, &'static ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:50:20 + --> $DIR/variance-btree-invariant-types.rs:80:20 | LL | fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:56:5 + --> $DIR/variance-btree-invariant-types.rs:88:5 | LL | v | ^ lifetime mismatch @@ -217,14 +217,14 @@ LL | v = note: expected struct `std::collections::btree_map::VacantEntry<'_, &'static (), _>` found struct `std::collections::btree_map::VacantEntry<'_, &'new (), _>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:54:23 + --> $DIR/variance-btree-invariant-types.rs:86:23 | LL | fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>) | ^^^^ = note: ...does not necessarily outlive the static lifetime error[E0308]: mismatched types - --> $DIR/variance-btree-invariant-types.rs:60:5 + --> $DIR/variance-btree-invariant-types.rs:94:5 | LL | v | ^ lifetime mismatch @@ -232,7 +232,7 @@ LL | v = note: expected struct `std::collections::btree_map::VacantEntry<'_, _, &'static ()>` found struct `std::collections::btree_map::VacantEntry<'_, _, &'new ()>` note: the lifetime `'new` as defined here... - --> $DIR/variance-btree-invariant-types.rs:58:23 + --> $DIR/variance-btree-invariant-types.rs:92:23 | LL | fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>) | ^^^^ diff --git a/src/test/ui/variance/variance-btree-invariant-types.nll.stderr b/src/test/ui/variance/variance-btree-invariant-types.nll.stderr index 867d9f8238a96..f24c2a8f7cdc5 100644 --- a/src/test/ui/variance/variance-btree-invariant-types.nll.stderr +++ b/src/test/ui/variance/variance-btree-invariant-types.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:4:5 + --> $DIR/variance-btree-invariant-types.rs:8:5 | LL | fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> { | ---- lifetime `'new` defined here @@ -11,7 +11,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:7:5 + --> $DIR/variance-btree-invariant-types.rs:13:5 | LL | fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> { | ---- lifetime `'new` defined here @@ -23,7 +23,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:10:5 + --> $DIR/variance-btree-invariant-types.rs:18:5 | LL | fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> { | ---- lifetime `'new` defined here @@ -35,7 +35,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:13:5 + --> $DIR/variance-btree-invariant-types.rs:23:5 | LL | fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> { | ---- lifetime `'new` defined here @@ -47,7 +47,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:17:5 + --> $DIR/variance-btree-invariant-types.rs:29:5 | LL | fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> { | ---- lifetime `'new` defined here @@ -59,7 +59,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:20:5 + --> $DIR/variance-btree-invariant-types.rs:34:5 | LL | fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> { | ---- lifetime `'new` defined here @@ -71,7 +71,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:23:5 + --> $DIR/variance-btree-invariant-types.rs:39:5 | LL | fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> { | ---- lifetime `'new` defined here @@ -83,7 +83,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:26:5 + --> $DIR/variance-btree-invariant-types.rs:44:5 | LL | fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> { | ---- lifetime `'new` defined here @@ -95,7 +95,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:31:5 + --> $DIR/variance-btree-invariant-types.rs:51:5 | LL | fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>) | ---- lifetime `'new` defined here @@ -108,7 +108,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:35:5 + --> $DIR/variance-btree-invariant-types.rs:57:5 | LL | fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>) | ---- lifetime `'new` defined here @@ -121,7 +121,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:39:5 + --> $DIR/variance-btree-invariant-types.rs:63:5 | LL | fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>) | ---- lifetime `'new` defined here @@ -134,7 +134,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:43:5 + --> $DIR/variance-btree-invariant-types.rs:69:5 | LL | fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>) | ---- lifetime `'new` defined here @@ -147,7 +147,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:48:5 + --> $DIR/variance-btree-invariant-types.rs:76:5 | LL | fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>) | ---- lifetime `'new` defined here @@ -160,7 +160,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:52:5 + --> $DIR/variance-btree-invariant-types.rs:82:5 | LL | fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>) | ---- lifetime `'new` defined here @@ -173,7 +173,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:56:5 + --> $DIR/variance-btree-invariant-types.rs:88:5 | LL | fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>) | ---- lifetime `'new` defined here @@ -186,7 +186,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-btree-invariant-types.rs:60:5 + --> $DIR/variance-btree-invariant-types.rs:94:5 | LL | fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>) | ---- lifetime `'new` defined here diff --git a/src/test/ui/variance/variance-btree-invariant-types.rs b/src/test/ui/variance/variance-btree-invariant-types.rs index 4549622f24ac3..7ddf6b294a5a1 100644 --- a/src/test/ui/variance/variance-btree-invariant-types.rs +++ b/src/test/ui/variance/variance-btree-invariant-types.rs @@ -1,63 +1,99 @@ use std::collections::btree_map::{IterMut, OccupiedEntry, RangeMut, VacantEntry}; +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>) -> OccupiedEntry<'a, &'new (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>) -> OccupiedEntry<'a, (), &'new ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>) -> OccupiedEntry<'a, &'static (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>) -> OccupiedEntry<'a, (), &'static ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>) -> VacantEntry<'a, &'new (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>) -> VacantEntry<'a, (), &'new ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>) -> VacantEntry<'a, &'static (), ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>) -> VacantEntry<'a, (), &'static ()> { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ lifetime may not live long enough } diff --git a/src/test/ui/variance/variance-cell-is-invariant.stderr b/src/test/ui/variance/variance-cell-is-invariant.base.stderr similarity index 92% rename from src/test/ui/variance/variance-cell-is-invariant.stderr rename to src/test/ui/variance/variance-cell-is-invariant.base.stderr index 6fcd6460fe30a..e3180b6d98476 100644 --- a/src/test/ui/variance/variance-cell-is-invariant.stderr +++ b/src/test/ui/variance/variance-cell-is-invariant.base.stderr @@ -1,5 +1,5 @@ error[E0623]: lifetime mismatch - --> $DIR/variance-cell-is-invariant.rs:14:25 + --> $DIR/variance-cell-is-invariant.rs:18:25 | LL | fn use_<'short,'long>(c: Foo<'short>, | ----------- these two types are declared with different lifetimes... diff --git a/src/test/ui/variance/variance-cell-is-invariant.nll.stderr b/src/test/ui/variance/variance-cell-is-invariant.nll.stderr index d6a85680141dc..82ef94a19b23f 100644 --- a/src/test/ui/variance/variance-cell-is-invariant.nll.stderr +++ b/src/test/ui/variance/variance-cell-is-invariant.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-cell-is-invariant.rs:14:12 + --> $DIR/variance-cell-is-invariant.rs:18:12 | LL | fn use_<'short,'long>(c: Foo<'short>, | ------ ----- lifetime `'long` defined here diff --git a/src/test/ui/variance/variance-cell-is-invariant.rs b/src/test/ui/variance/variance-cell-is-invariant.rs index ff9ad66fb0bc2..b8b73147d0eea 100644 --- a/src/test/ui/variance/variance-cell-is-invariant.rs +++ b/src/test/ui/variance/variance-cell-is-invariant.rs @@ -1,6 +1,10 @@ // Test that Cell is considered invariant with respect to its // type. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + use std::cell::Cell; struct Foo<'a> { @@ -11,7 +15,9 @@ fn use_<'short,'long>(c: Foo<'short>, s: &'short isize, l: &'long isize, _where:Option<&'short &'long ()>) { - let _: Foo<'long> = c; //~ ERROR E0623 + let _: Foo<'long> = c; + //[base]~^ ERROR E0623 + //[nll]~^^ ERROR lifetime may not live long enough } fn main() { diff --git a/src/test/ui/variance/variance-contravariant-arg-object.stderr b/src/test/ui/variance/variance-contravariant-arg-object.base.stderr similarity index 78% rename from src/test/ui/variance/variance-contravariant-arg-object.stderr rename to src/test/ui/variance/variance-contravariant-arg-object.base.stderr index 16583fa793109..19b8b9d5aa05c 100644 --- a/src/test/ui/variance/variance-contravariant-arg-object.stderr +++ b/src/test/ui/variance/variance-contravariant-arg-object.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-contravariant-arg-object.rs:14:5 + --> $DIR/variance-contravariant-arg-object.rs:18:5 | LL | v | ^ lifetime mismatch @@ -7,18 +7,18 @@ LL | v = note: expected trait object `dyn Get<&'min i32>` found trait object `dyn Get<&'max i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-contravariant-arg-object.rs:10:21 + --> $DIR/variance-contravariant-arg-object.rs:14:21 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-contravariant-arg-object.rs:10:27 + --> $DIR/variance-contravariant-arg-object.rs:14:27 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-contravariant-arg-object.rs:22:5 + --> $DIR/variance-contravariant-arg-object.rs:28:5 | LL | v | ^ lifetime mismatch @@ -26,12 +26,12 @@ LL | v = note: expected trait object `dyn Get<&'max i32>` found trait object `dyn Get<&'min i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-contravariant-arg-object.rs:17:21 + --> $DIR/variance-contravariant-arg-object.rs:23:21 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-contravariant-arg-object.rs:17:27 + --> $DIR/variance-contravariant-arg-object.rs:23:27 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ^^^^ diff --git a/src/test/ui/variance/variance-contravariant-arg-object.nll.stderr b/src/test/ui/variance/variance-contravariant-arg-object.nll.stderr index 3315eaaf1c006..4071a41703e28 100644 --- a/src/test/ui/variance/variance-contravariant-arg-object.nll.stderr +++ b/src/test/ui/variance/variance-contravariant-arg-object.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-contravariant-arg-object.rs:14:5 + --> $DIR/variance-contravariant-arg-object.rs:18:5 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | v = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-contravariant-arg-object.rs:22:5 + --> $DIR/variance-contravariant-arg-object.rs:28:5 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-contravariant-arg-object.rs b/src/test/ui/variance/variance-contravariant-arg-object.rs index 947f4cd8b8f4d..dab42c35218bf 100644 --- a/src/test/ui/variance/variance-contravariant-arg-object.rs +++ b/src/test/ui/variance/variance-contravariant-arg-object.rs @@ -3,6 +3,10 @@ // Test that even when `T` is only used in contravariant position, it // is treated as invariant. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get : 'static { fn get(&self, t: T); } @@ -11,7 +15,9 @@ fn get_min_from_max<'min, 'max>(v: Box>) -> Box> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>(v: Box>) @@ -19,7 +25,9 @@ fn get_max_from_min<'min, 'max, G>(v: Box>) where 'max : 'min { // Previously OK: - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn main() { } diff --git a/src/test/ui/variance/variance-contravariant-arg-trait-match.stderr b/src/test/ui/variance/variance-contravariant-arg-trait-match.base.stderr similarity index 75% rename from src/test/ui/variance/variance-contravariant-arg-trait-match.stderr rename to src/test/ui/variance/variance-contravariant-arg-trait-match.base.stderr index 370e57f73df10..56cf84590107c 100644 --- a/src/test/ui/variance/variance-contravariant-arg-trait-match.stderr +++ b/src/test/ui/variance/variance-contravariant-arg-trait-match.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-contravariant-arg-trait-match.rs:13:5 + --> $DIR/variance-contravariant-arg-trait-match.rs:17:5 | LL | impls_get::() | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | impls_get::() = note: expected type `Get<&'min i32>` found type `Get<&'max i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-contravariant-arg-trait-match.rs:10:21 + --> $DIR/variance-contravariant-arg-trait-match.rs:14:21 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-contravariant-arg-trait-match.rs:10:27 + --> $DIR/variance-contravariant-arg-trait-match.rs:14:27 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-contravariant-arg-trait-match.rs:21:5 + --> $DIR/variance-contravariant-arg-trait-match.rs:27:5 | LL | impls_get::() | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | impls_get::() = note: expected type `Get<&'max i32>` found type `Get<&'min i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-contravariant-arg-trait-match.rs:16:21 + --> $DIR/variance-contravariant-arg-trait-match.rs:22:21 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-contravariant-arg-trait-match.rs:16:27 + --> $DIR/variance-contravariant-arg-trait-match.rs:22:27 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ diff --git a/src/test/ui/variance/variance-contravariant-arg-trait-match.nll.stderr b/src/test/ui/variance/variance-contravariant-arg-trait-match.nll.stderr index 6f136750ee13d..6ca8f5ed4cce6 100644 --- a/src/test/ui/variance/variance-contravariant-arg-trait-match.nll.stderr +++ b/src/test/ui/variance/variance-contravariant-arg-trait-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-contravariant-arg-trait-match.rs:13:5 + --> $DIR/variance-contravariant-arg-trait-match.rs:17:5 | LL | fn get_min_from_max<'min, 'max, G>() | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | impls_get::() = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-contravariant-arg-trait-match.rs:21:5 + --> $DIR/variance-contravariant-arg-trait-match.rs:27:5 | LL | fn get_max_from_min<'min, 'max, G>() | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-contravariant-arg-trait-match.rs b/src/test/ui/variance/variance-contravariant-arg-trait-match.rs index 904d93124c988..11513d5411cfb 100644 --- a/src/test/ui/variance/variance-contravariant-arg-trait-match.rs +++ b/src/test/ui/variance/variance-contravariant-arg-trait-match.rs @@ -3,6 +3,10 @@ // Test that even when `T` is only used in contravariant position, it // is treated as invariant. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get { fn get(&self, t: T); } @@ -10,7 +14,9 @@ trait Get { fn get_min_from_max<'min, 'max, G>() where 'max : 'min, G : Get<&'max i32> { - impls_get::() //~ ERROR mismatched types + impls_get::() + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>() @@ -18,7 +24,9 @@ fn get_max_from_min<'min, 'max, G>() { // Previously OK, but now an error because traits are invariant: - impls_get::() //~ ERROR mismatched types + impls_get::() + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn impls_get() where G : Get { } diff --git a/src/test/ui/variance/variance-contravariant-self-trait-match.stderr b/src/test/ui/variance/variance-contravariant-self-trait-match.base.stderr similarity index 75% rename from src/test/ui/variance/variance-contravariant-self-trait-match.stderr rename to src/test/ui/variance/variance-contravariant-self-trait-match.base.stderr index ab14faaa50728..2ccab2ee5f089 100644 --- a/src/test/ui/variance/variance-contravariant-self-trait-match.stderr +++ b/src/test/ui/variance/variance-contravariant-self-trait-match.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-contravariant-self-trait-match.rs:13:5 + --> $DIR/variance-contravariant-self-trait-match.rs:17:5 | LL | impls_get::<&'min G>(); | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | impls_get::<&'min G>(); = note: expected type `<&'min G as Get>` found type `<&'max G as Get>` note: the lifetime `'min` as defined here... - --> $DIR/variance-contravariant-self-trait-match.rs:10:21 + --> $DIR/variance-contravariant-self-trait-match.rs:14:21 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-contravariant-self-trait-match.rs:10:27 + --> $DIR/variance-contravariant-self-trait-match.rs:14:27 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-contravariant-self-trait-match.rs:22:5 + --> $DIR/variance-contravariant-self-trait-match.rs:28:5 | LL | impls_get::<&'max G>(); | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | impls_get::<&'max G>(); = note: expected type `<&'max G as Get>` found type `<&'min G as Get>` note: the lifetime `'min` as defined here... - --> $DIR/variance-contravariant-self-trait-match.rs:16:21 + --> $DIR/variance-contravariant-self-trait-match.rs:22:21 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-contravariant-self-trait-match.rs:16:27 + --> $DIR/variance-contravariant-self-trait-match.rs:22:27 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ diff --git a/src/test/ui/variance/variance-contravariant-self-trait-match.nll.stderr b/src/test/ui/variance/variance-contravariant-self-trait-match.nll.stderr index fe08ce0b84d21..d2c549b1f715d 100644 --- a/src/test/ui/variance/variance-contravariant-self-trait-match.nll.stderr +++ b/src/test/ui/variance/variance-contravariant-self-trait-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-contravariant-self-trait-match.rs:13:5 + --> $DIR/variance-contravariant-self-trait-match.rs:17:5 | LL | fn get_min_from_max<'min, 'max, G>() | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | impls_get::<&'min G>(); = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-contravariant-self-trait-match.rs:22:5 + --> $DIR/variance-contravariant-self-trait-match.rs:28:5 | LL | fn get_max_from_min<'min, 'max, G>() | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-contravariant-self-trait-match.rs b/src/test/ui/variance/variance-contravariant-self-trait-match.rs index e17375841b81c..f8d7c68fafe73 100644 --- a/src/test/ui/variance/variance-contravariant-self-trait-match.rs +++ b/src/test/ui/variance/variance-contravariant-self-trait-match.rs @@ -3,6 +3,10 @@ // Test that even when `Self` is only used in contravariant position, it // is treated as invariant. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get { fn get(&self); } @@ -10,7 +14,9 @@ trait Get { fn get_min_from_max<'min, 'max, G>() where 'max : 'min, G : 'max, &'max G : Get { - impls_get::<&'min G>(); //~ ERROR mismatched types + impls_get::<&'min G>(); + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>() @@ -19,7 +25,9 @@ fn get_max_from_min<'min, 'max, G>() // Previously OK, but now error because traits are invariant with // respect to all inputs. - impls_get::<&'max G>(); //~ ERROR mismatched types + impls_get::<&'max G>(); + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn impls_get() where G : Get { } diff --git a/src/test/ui/variance/variance-invariant-arg-object.stderr b/src/test/ui/variance/variance-covariant-arg-object.base.stderr similarity index 79% rename from src/test/ui/variance/variance-invariant-arg-object.stderr rename to src/test/ui/variance/variance-covariant-arg-object.base.stderr index 6c1b07e6677e3..3a97875fe0ec0 100644 --- a/src/test/ui/variance/variance-invariant-arg-object.stderr +++ b/src/test/ui/variance/variance-covariant-arg-object.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-invariant-arg-object.rs:11:5 + --> $DIR/variance-covariant-arg-object.rs:19:5 | LL | v | ^ lifetime mismatch @@ -7,18 +7,18 @@ LL | v = note: expected trait object `dyn Get<&'min i32>` found trait object `dyn Get<&'max i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-invariant-arg-object.rs:7:21 + --> $DIR/variance-covariant-arg-object.rs:14:21 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-invariant-arg-object.rs:7:27 + --> $DIR/variance-covariant-arg-object.rs:14:27 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-invariant-arg-object.rs:18:5 + --> $DIR/variance-covariant-arg-object.rs:28:5 | LL | v | ^ lifetime mismatch @@ -26,12 +26,12 @@ LL | v = note: expected trait object `dyn Get<&'max i32>` found trait object `dyn Get<&'min i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-invariant-arg-object.rs:14:21 + --> $DIR/variance-covariant-arg-object.rs:24:21 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-invariant-arg-object.rs:14:27 + --> $DIR/variance-covariant-arg-object.rs:24:27 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ^^^^ diff --git a/src/test/ui/variance/variance-covariant-arg-object.nll.stderr b/src/test/ui/variance/variance-covariant-arg-object.nll.stderr index b116b8e263fd2..1b2ec61825f8f 100644 --- a/src/test/ui/variance/variance-covariant-arg-object.nll.stderr +++ b/src/test/ui/variance/variance-covariant-arg-object.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-covariant-arg-object.rs:15:5 + --> $DIR/variance-covariant-arg-object.rs:19:5 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | v = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-covariant-arg-object.rs:22:5 + --> $DIR/variance-covariant-arg-object.rs:28:5 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-covariant-arg-object.rs b/src/test/ui/variance/variance-covariant-arg-object.rs index 7cbf65ae3d924..20f74a3987e12 100644 --- a/src/test/ui/variance/variance-covariant-arg-object.rs +++ b/src/test/ui/variance/variance-covariant-arg-object.rs @@ -3,6 +3,10 @@ // Test that even when `T` is only used in covariant position, it // is treated as invariant. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get : 'static { fn get(&self) -> T; } @@ -12,14 +16,18 @@ fn get_min_from_max<'min, 'max>(v: Box>) where 'max : 'min { // Previously OK, now an error as traits are invariant. - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>(v: Box>) -> Box> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn main() { } diff --git a/src/test/ui/variance/variance-invariant-arg-trait-match.stderr b/src/test/ui/variance/variance-covariant-arg-trait-match.base.stderr similarity index 76% rename from src/test/ui/variance/variance-invariant-arg-trait-match.stderr rename to src/test/ui/variance/variance-covariant-arg-trait-match.base.stderr index 0328496546eb7..1749a871230cf 100644 --- a/src/test/ui/variance/variance-invariant-arg-trait-match.stderr +++ b/src/test/ui/variance/variance-covariant-arg-trait-match.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-invariant-arg-trait-match.rs:10:5 + --> $DIR/variance-covariant-arg-trait-match.rs:18:5 | LL | impls_get::() | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | impls_get::() = note: expected type `Get<&'min i32>` found type `Get<&'max i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-invariant-arg-trait-match.rs:7:21 + --> $DIR/variance-covariant-arg-trait-match.rs:14:21 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-invariant-arg-trait-match.rs:7:27 + --> $DIR/variance-covariant-arg-trait-match.rs:14:27 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-invariant-arg-trait-match.rs:16:5 + --> $DIR/variance-covariant-arg-trait-match.rs:26:5 | LL | impls_get::() | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | impls_get::() = note: expected type `Get<&'max i32>` found type `Get<&'min i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-invariant-arg-trait-match.rs:13:21 + --> $DIR/variance-covariant-arg-trait-match.rs:23:21 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-invariant-arg-trait-match.rs:13:27 + --> $DIR/variance-covariant-arg-trait-match.rs:23:27 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ diff --git a/src/test/ui/variance/variance-covariant-arg-trait-match.nll.stderr b/src/test/ui/variance/variance-covariant-arg-trait-match.nll.stderr index a982a29d499c4..870af48b3e92a 100644 --- a/src/test/ui/variance/variance-covariant-arg-trait-match.nll.stderr +++ b/src/test/ui/variance/variance-covariant-arg-trait-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-covariant-arg-trait-match.rs:14:5 + --> $DIR/variance-covariant-arg-trait-match.rs:18:5 | LL | fn get_min_from_max<'min, 'max, G>() | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | impls_get::() = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-covariant-arg-trait-match.rs:20:5 + --> $DIR/variance-covariant-arg-trait-match.rs:26:5 | LL | fn get_max_from_min<'min, 'max, G>() | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-covariant-arg-trait-match.rs b/src/test/ui/variance/variance-covariant-arg-trait-match.rs index 2d4f0ea158273..d3d66d3fc4ba1 100644 --- a/src/test/ui/variance/variance-covariant-arg-trait-match.rs +++ b/src/test/ui/variance/variance-covariant-arg-trait-match.rs @@ -3,6 +3,10 @@ // Test that even when `T` is only used in covariant position, it // is treated as invariant. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get { fn get(&self) -> T; } @@ -11,13 +15,17 @@ fn get_min_from_max<'min, 'max, G>() where 'max : 'min, G : Get<&'max i32> { // Previously OK, now an error as traits are invariant. - impls_get::() //~ ERROR mismatched types + impls_get::() + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>() where 'max : 'min, G : Get<&'min i32> { - impls_get::() //~ ERROR mismatched types + impls_get::() + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn impls_get() where G : Get { } diff --git a/src/test/ui/variance/variance-invariant-self-trait-match.stderr b/src/test/ui/variance/variance-covariant-self-trait-match.base.stderr similarity index 76% rename from src/test/ui/variance/variance-invariant-self-trait-match.stderr rename to src/test/ui/variance/variance-covariant-self-trait-match.base.stderr index c553581b564a0..94afc010e2134 100644 --- a/src/test/ui/variance/variance-invariant-self-trait-match.stderr +++ b/src/test/ui/variance/variance-covariant-self-trait-match.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-invariant-self-trait-match.rs:10:5 + --> $DIR/variance-covariant-self-trait-match.rs:18:5 | LL | impls_get::<&'min G>(); | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | impls_get::<&'min G>(); = note: expected type `<&'min G as Get>` found type `<&'max G as Get>` note: the lifetime `'min` as defined here... - --> $DIR/variance-invariant-self-trait-match.rs:7:21 + --> $DIR/variance-covariant-self-trait-match.rs:14:21 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-invariant-self-trait-match.rs:7:27 + --> $DIR/variance-covariant-self-trait-match.rs:14:27 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-invariant-self-trait-match.rs:16:5 + --> $DIR/variance-covariant-self-trait-match.rs:26:5 | LL | impls_get::<&'max G>(); | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | impls_get::<&'max G>(); = note: expected type `<&'max G as Get>` found type `<&'min G as Get>` note: the lifetime `'min` as defined here... - --> $DIR/variance-invariant-self-trait-match.rs:13:21 + --> $DIR/variance-covariant-self-trait-match.rs:23:21 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-invariant-self-trait-match.rs:13:27 + --> $DIR/variance-covariant-self-trait-match.rs:23:27 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ diff --git a/src/test/ui/variance/variance-covariant-self-trait-match.nll.stderr b/src/test/ui/variance/variance-covariant-self-trait-match.nll.stderr index 81b25e38ec6d8..14da2d2a552db 100644 --- a/src/test/ui/variance/variance-covariant-self-trait-match.nll.stderr +++ b/src/test/ui/variance/variance-covariant-self-trait-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-covariant-self-trait-match.rs:14:5 + --> $DIR/variance-covariant-self-trait-match.rs:18:5 | LL | fn get_min_from_max<'min, 'max, G>() | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | impls_get::<&'min G>(); = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-covariant-self-trait-match.rs:20:5 + --> $DIR/variance-covariant-self-trait-match.rs:26:5 | LL | fn get_max_from_min<'min, 'max, G>() | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-covariant-self-trait-match.rs b/src/test/ui/variance/variance-covariant-self-trait-match.rs index e86a5fc630bd5..ece450173ca8d 100644 --- a/src/test/ui/variance/variance-covariant-self-trait-match.rs +++ b/src/test/ui/variance/variance-covariant-self-trait-match.rs @@ -3,6 +3,10 @@ // Test that even when `Self` is only used in covariant position, it // is treated as invariant. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get { fn get() -> Self; } @@ -11,13 +15,17 @@ fn get_min_from_max<'min, 'max, G>() where 'max : 'min, G : 'max, &'max G : Get { // Previously OK, now an error as traits are invariant. - impls_get::<&'min G>(); //~ ERROR mismatched types + impls_get::<&'min G>(); + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>() where 'max : 'min, G : 'max, &'min G : Get { - impls_get::<&'max G>(); //~ ERROR mismatched types + impls_get::<&'max G>(); + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn impls_get() where G : Get { } diff --git a/src/test/ui/variance/variance-covariant-arg-object.stderr b/src/test/ui/variance/variance-invariant-arg-object.base.stderr similarity index 79% rename from src/test/ui/variance/variance-covariant-arg-object.stderr rename to src/test/ui/variance/variance-invariant-arg-object.base.stderr index d590a4dc2d9d5..ec9271e902fed 100644 --- a/src/test/ui/variance/variance-covariant-arg-object.stderr +++ b/src/test/ui/variance/variance-invariant-arg-object.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-covariant-arg-object.rs:15:5 + --> $DIR/variance-invariant-arg-object.rs:15:5 | LL | v | ^ lifetime mismatch @@ -7,18 +7,18 @@ LL | v = note: expected trait object `dyn Get<&'min i32>` found trait object `dyn Get<&'max i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-covariant-arg-object.rs:10:21 + --> $DIR/variance-invariant-arg-object.rs:11:21 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-covariant-arg-object.rs:10:27 + --> $DIR/variance-invariant-arg-object.rs:11:27 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-covariant-arg-object.rs:22:5 + --> $DIR/variance-invariant-arg-object.rs:24:5 | LL | v | ^ lifetime mismatch @@ -26,12 +26,12 @@ LL | v = note: expected trait object `dyn Get<&'max i32>` found trait object `dyn Get<&'min i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-covariant-arg-object.rs:18:21 + --> $DIR/variance-invariant-arg-object.rs:20:21 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-covariant-arg-object.rs:18:27 + --> $DIR/variance-invariant-arg-object.rs:20:27 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ^^^^ diff --git a/src/test/ui/variance/variance-invariant-arg-object.nll.stderr b/src/test/ui/variance/variance-invariant-arg-object.nll.stderr index 303c7f3388a74..47364f4265663 100644 --- a/src/test/ui/variance/variance-invariant-arg-object.nll.stderr +++ b/src/test/ui/variance/variance-invariant-arg-object.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-invariant-arg-object.rs:11:5 + --> $DIR/variance-invariant-arg-object.rs:15:5 | LL | fn get_min_from_max<'min, 'max>(v: Box>) | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | v = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-invariant-arg-object.rs:18:5 + --> $DIR/variance-invariant-arg-object.rs:24:5 | LL | fn get_max_from_min<'min, 'max, G>(v: Box>) | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-invariant-arg-object.rs b/src/test/ui/variance/variance-invariant-arg-object.rs index 886d263c45768..cc8820fbac69e 100644 --- a/src/test/ui/variance/variance-invariant-arg-object.rs +++ b/src/test/ui/variance/variance-invariant-arg-object.rs @@ -1,5 +1,9 @@ #![allow(dead_code)] +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get : 'static { fn get(&self, t: T) -> T; } @@ -8,14 +12,18 @@ fn get_min_from_max<'min, 'max>(v: Box>) -> Box> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>(v: Box>) -> Box> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn main() { } diff --git a/src/test/ui/variance/variance-covariant-arg-trait-match.stderr b/src/test/ui/variance/variance-invariant-arg-trait-match.base.stderr similarity index 76% rename from src/test/ui/variance/variance-covariant-arg-trait-match.stderr rename to src/test/ui/variance/variance-invariant-arg-trait-match.base.stderr index eb1766b096c07..fe28468215399 100644 --- a/src/test/ui/variance/variance-covariant-arg-trait-match.stderr +++ b/src/test/ui/variance/variance-invariant-arg-trait-match.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-covariant-arg-trait-match.rs:14:5 + --> $DIR/variance-invariant-arg-trait-match.rs:14:5 | LL | impls_get::() | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | impls_get::() = note: expected type `Get<&'min i32>` found type `Get<&'max i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-covariant-arg-trait-match.rs:10:21 + --> $DIR/variance-invariant-arg-trait-match.rs:11:21 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-covariant-arg-trait-match.rs:10:27 + --> $DIR/variance-invariant-arg-trait-match.rs:11:27 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-covariant-arg-trait-match.rs:20:5 + --> $DIR/variance-invariant-arg-trait-match.rs:22:5 | LL | impls_get::() | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | impls_get::() = note: expected type `Get<&'max i32>` found type `Get<&'min i32>` note: the lifetime `'min` as defined here... - --> $DIR/variance-covariant-arg-trait-match.rs:17:21 + --> $DIR/variance-invariant-arg-trait-match.rs:19:21 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-covariant-arg-trait-match.rs:17:27 + --> $DIR/variance-invariant-arg-trait-match.rs:19:27 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ diff --git a/src/test/ui/variance/variance-invariant-arg-trait-match.nll.stderr b/src/test/ui/variance/variance-invariant-arg-trait-match.nll.stderr index 2909e81fcbf76..74d2745cbbea8 100644 --- a/src/test/ui/variance/variance-invariant-arg-trait-match.nll.stderr +++ b/src/test/ui/variance/variance-invariant-arg-trait-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-invariant-arg-trait-match.rs:10:5 + --> $DIR/variance-invariant-arg-trait-match.rs:14:5 | LL | fn get_min_from_max<'min, 'max, G>() | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | impls_get::() = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-invariant-arg-trait-match.rs:16:5 + --> $DIR/variance-invariant-arg-trait-match.rs:22:5 | LL | fn get_max_from_min<'min, 'max, G>() | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-invariant-arg-trait-match.rs b/src/test/ui/variance/variance-invariant-arg-trait-match.rs index 97d0fdd98e460..498dd574bb381 100644 --- a/src/test/ui/variance/variance-invariant-arg-trait-match.rs +++ b/src/test/ui/variance/variance-invariant-arg-trait-match.rs @@ -1,5 +1,9 @@ #![allow(dead_code)] +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get { fn get(&self, t: T) -> T; } @@ -7,13 +11,17 @@ trait Get { fn get_min_from_max<'min, 'max, G>() where 'max : 'min, G : Get<&'max i32> { - impls_get::() //~ ERROR mismatched types + impls_get::() + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>() where 'max : 'min, G : Get<&'min i32> { - impls_get::() //~ ERROR mismatched types + impls_get::() + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn impls_get() where G : Get { } diff --git a/src/test/ui/variance/variance-covariant-self-trait-match.stderr b/src/test/ui/variance/variance-invariant-self-trait-match.base.stderr similarity index 76% rename from src/test/ui/variance/variance-covariant-self-trait-match.stderr rename to src/test/ui/variance/variance-invariant-self-trait-match.base.stderr index b0bcb2e8422e4..a2589f0ceee9b 100644 --- a/src/test/ui/variance/variance-covariant-self-trait-match.stderr +++ b/src/test/ui/variance/variance-invariant-self-trait-match.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-covariant-self-trait-match.rs:14:5 + --> $DIR/variance-invariant-self-trait-match.rs:14:5 | LL | impls_get::<&'min G>(); | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | impls_get::<&'min G>(); = note: expected type `<&'min G as Get>` found type `<&'max G as Get>` note: the lifetime `'min` as defined here... - --> $DIR/variance-covariant-self-trait-match.rs:10:21 + --> $DIR/variance-invariant-self-trait-match.rs:11:21 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-covariant-self-trait-match.rs:10:27 + --> $DIR/variance-invariant-self-trait-match.rs:11:27 | LL | fn get_min_from_max<'min, 'max, G>() | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-covariant-self-trait-match.rs:20:5 + --> $DIR/variance-invariant-self-trait-match.rs:22:5 | LL | impls_get::<&'max G>(); | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | impls_get::<&'max G>(); = note: expected type `<&'max G as Get>` found type `<&'min G as Get>` note: the lifetime `'min` as defined here... - --> $DIR/variance-covariant-self-trait-match.rs:17:21 + --> $DIR/variance-invariant-self-trait-match.rs:19:21 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-covariant-self-trait-match.rs:17:27 + --> $DIR/variance-invariant-self-trait-match.rs:19:27 | LL | fn get_max_from_min<'min, 'max, G>() | ^^^^ diff --git a/src/test/ui/variance/variance-invariant-self-trait-match.nll.stderr b/src/test/ui/variance/variance-invariant-self-trait-match.nll.stderr index 01b2c8803ae72..9d16e89450d78 100644 --- a/src/test/ui/variance/variance-invariant-self-trait-match.nll.stderr +++ b/src/test/ui/variance/variance-invariant-self-trait-match.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-invariant-self-trait-match.rs:10:5 + --> $DIR/variance-invariant-self-trait-match.rs:14:5 | LL | fn get_min_from_max<'min, 'max, G>() | ---- ---- lifetime `'max` defined here @@ -12,7 +12,7 @@ LL | impls_get::<&'min G>(); = help: consider adding the following bound: `'min: 'max` error: lifetime may not live long enough - --> $DIR/variance-invariant-self-trait-match.rs:16:5 + --> $DIR/variance-invariant-self-trait-match.rs:22:5 | LL | fn get_max_from_min<'min, 'max, G>() | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-invariant-self-trait-match.rs b/src/test/ui/variance/variance-invariant-self-trait-match.rs index 678eefa634bbd..0f3176b14b44d 100644 --- a/src/test/ui/variance/variance-invariant-self-trait-match.rs +++ b/src/test/ui/variance/variance-invariant-self-trait-match.rs @@ -1,5 +1,9 @@ #![allow(dead_code)] +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Get { fn get(&self) -> Self; } @@ -7,13 +11,17 @@ trait Get { fn get_min_from_max<'min, 'max, G>() where 'max : 'min, &'max G : Get, G : 'max { - impls_get::<&'min G>(); //~ ERROR mismatched types + impls_get::<&'min G>(); + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn get_max_from_min<'min, 'max, G>() where 'max : 'min, &'min G : Get, G : 'min { - impls_get::<&'max G>(); //~ ERROR mismatched types + impls_get::<&'max G>(); + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn impls_get() where G : Get { } diff --git a/src/test/ui/variance/variance-trait-matching.stderr b/src/test/ui/variance/variance-trait-matching.base.stderr similarity index 89% rename from src/test/ui/variance/variance-trait-matching.stderr rename to src/test/ui/variance/variance-trait-matching.base.stderr index 514153103bea3..8872620e38aef 100644 --- a/src/test/ui/variance/variance-trait-matching.stderr +++ b/src/test/ui/variance/variance-trait-matching.base.stderr @@ -1,5 +1,5 @@ error[E0621]: explicit lifetime required in the type of `get` - --> $DIR/variance-trait-matching.rs:24:5 + --> $DIR/variance-trait-matching.rs:28:5 | LL | fn get<'a, G>(get: &G) -> i32 | -- help: add explicit lifetime `'a` to the type of `get`: `&'a G` diff --git a/src/test/ui/variance/variance-trait-matching.nll.stderr b/src/test/ui/variance/variance-trait-matching.nll.stderr index 3308cc6d25016..52c5eed3167cd 100644 --- a/src/test/ui/variance/variance-trait-matching.nll.stderr +++ b/src/test/ui/variance/variance-trait-matching.nll.stderr @@ -1,5 +1,5 @@ error[E0621]: explicit lifetime required in the type of `get` - --> $DIR/variance-trait-matching.rs:24:5 + --> $DIR/variance-trait-matching.rs:28:5 | LL | fn get<'a, G>(get: &G) -> i32 | -- help: add explicit lifetime `'a` to the type of `get`: `&'a G` diff --git a/src/test/ui/variance/variance-trait-matching.rs b/src/test/ui/variance/variance-trait-matching.rs index b4efee7d6040f..993db93533e27 100644 --- a/src/test/ui/variance/variance-trait-matching.rs +++ b/src/test/ui/variance/variance-trait-matching.rs @@ -1,5 +1,9 @@ #![allow(dead_code)] +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + // Get is covariant in T trait Get { fn get(&self) -> T; diff --git a/src/test/ui/variance/variance-use-contravariant-struct-1.stderr b/src/test/ui/variance/variance-use-contravariant-struct-1.base.stderr similarity index 76% rename from src/test/ui/variance/variance-use-contravariant-struct-1.stderr rename to src/test/ui/variance/variance-use-contravariant-struct-1.base.stderr index ec0cb22cdb6ba..a354aa52b5c7e 100644 --- a/src/test/ui/variance/variance-use-contravariant-struct-1.stderr +++ b/src/test/ui/variance/variance-use-contravariant-struct-1.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-use-contravariant-struct-1.rs:12:5 + --> $DIR/variance-use-contravariant-struct-1.rs:14:5 | LL | v | ^ lifetime mismatch @@ -7,12 +7,12 @@ LL | v = note: expected struct `SomeStruct<&'min ()>` found struct `SomeStruct<&'max ()>` note: the lifetime `'min` as defined here... - --> $DIR/variance-use-contravariant-struct-1.rs:8:8 + --> $DIR/variance-use-contravariant-struct-1.rs:10:8 | LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-use-contravariant-struct-1.rs:8:13 + --> $DIR/variance-use-contravariant-struct-1.rs:10:13 | LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) | ^^^^ diff --git a/src/test/ui/variance/variance-use-contravariant-struct-1.nll.stderr b/src/test/ui/variance/variance-use-contravariant-struct-1.nll.stderr index 837c70ca31367..9549a8c08af61 100644 --- a/src/test/ui/variance/variance-use-contravariant-struct-1.nll.stderr +++ b/src/test/ui/variance/variance-use-contravariant-struct-1.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-use-contravariant-struct-1.rs:12:5 + --> $DIR/variance-use-contravariant-struct-1.rs:14:5 | LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-use-contravariant-struct-1.rs b/src/test/ui/variance/variance-use-contravariant-struct-1.rs index 8a02ef4ec85fd..b55f5e76775ef 100644 --- a/src/test/ui/variance/variance-use-contravariant-struct-1.rs +++ b/src/test/ui/variance/variance-use-contravariant-struct-1.rs @@ -1,7 +1,9 @@ // Test various uses of structs with distint variances to make sure // they permit lifetimes to be approximated as expected. - +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir struct SomeStruct(fn(T)); @@ -9,7 +11,9 @@ fn foo<'min,'max>(v: SomeStruct<&'max ()>) -> SomeStruct<&'min ()> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } diff --git a/src/test/ui/variance/variance-use-covariant-struct-1.stderr b/src/test/ui/variance/variance-use-covariant-struct-1.base.stderr similarity index 78% rename from src/test/ui/variance/variance-use-covariant-struct-1.stderr rename to src/test/ui/variance/variance-use-covariant-struct-1.base.stderr index 0c0071cf9e16f..542d44c27093d 100644 --- a/src/test/ui/variance/variance-use-covariant-struct-1.stderr +++ b/src/test/ui/variance/variance-use-covariant-struct-1.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-use-covariant-struct-1.rs:10:5 + --> $DIR/variance-use-covariant-struct-1.rs:14:5 | LL | v | ^ lifetime mismatch @@ -7,12 +7,12 @@ LL | v = note: expected struct `SomeStruct<&'max ()>` found struct `SomeStruct<&'min ()>` note: the lifetime `'min` as defined here... - --> $DIR/variance-use-covariant-struct-1.rs:6:8 + --> $DIR/variance-use-covariant-struct-1.rs:10:8 | LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-use-covariant-struct-1.rs:6:13 + --> $DIR/variance-use-covariant-struct-1.rs:10:13 | LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>) | ^^^^ diff --git a/src/test/ui/variance/variance-use-covariant-struct-1.nll.stderr b/src/test/ui/variance/variance-use-covariant-struct-1.nll.stderr index bab858c5acb37..2fac827a0fb1f 100644 --- a/src/test/ui/variance/variance-use-covariant-struct-1.nll.stderr +++ b/src/test/ui/variance/variance-use-covariant-struct-1.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-use-covariant-struct-1.rs:10:5 + --> $DIR/variance-use-covariant-struct-1.rs:14:5 | LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>) | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-use-covariant-struct-1.rs b/src/test/ui/variance/variance-use-covariant-struct-1.rs index e19a35bdfacfe..3e3e76d9792c2 100644 --- a/src/test/ui/variance/variance-use-covariant-struct-1.rs +++ b/src/test/ui/variance/variance-use-covariant-struct-1.rs @@ -1,13 +1,19 @@ // Test that a covariant struct does not permit the lifetime of a // reference to be enlarged. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + struct SomeStruct(T); fn foo<'min,'max>(v: SomeStruct<&'min ()>) -> SomeStruct<&'max ()> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn main() { } diff --git a/src/test/ui/variance/variance-use-invariant-struct-1.stderr b/src/test/ui/variance/variance-use-invariant-struct-1.base.stderr similarity index 76% rename from src/test/ui/variance/variance-use-invariant-struct-1.stderr rename to src/test/ui/variance/variance-use-invariant-struct-1.base.stderr index 76e4bd76b998f..02b4e91f781e5 100644 --- a/src/test/ui/variance/variance-use-invariant-struct-1.stderr +++ b/src/test/ui/variance/variance-use-invariant-struct-1.base.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/variance-use-invariant-struct-1.rs:12:5 + --> $DIR/variance-use-invariant-struct-1.rs:14:5 | LL | v | ^ lifetime mismatch @@ -7,18 +7,18 @@ LL | v = note: expected struct `SomeStruct<&'min ()>` found struct `SomeStruct<&'max ()>` note: the lifetime `'min` as defined here... - --> $DIR/variance-use-invariant-struct-1.rs:8:8 + --> $DIR/variance-use-invariant-struct-1.rs:10:8 | LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-use-invariant-struct-1.rs:8:13 + --> $DIR/variance-use-invariant-struct-1.rs:10:13 | LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) | ^^^^ error[E0308]: mismatched types - --> $DIR/variance-use-invariant-struct-1.rs:19:5 + --> $DIR/variance-use-invariant-struct-1.rs:23:5 | LL | v | ^ lifetime mismatch @@ -26,12 +26,12 @@ LL | v = note: expected struct `SomeStruct<&'max ()>` found struct `SomeStruct<&'min ()>` note: the lifetime `'min` as defined here... - --> $DIR/variance-use-invariant-struct-1.rs:15:8 + --> $DIR/variance-use-invariant-struct-1.rs:19:8 | LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>) | ^^^^ note: ...does not necessarily outlive the lifetime `'max` as defined here - --> $DIR/variance-use-invariant-struct-1.rs:15:13 + --> $DIR/variance-use-invariant-struct-1.rs:19:13 | LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>) | ^^^^ diff --git a/src/test/ui/variance/variance-use-invariant-struct-1.nll.stderr b/src/test/ui/variance/variance-use-invariant-struct-1.nll.stderr index f1df2a88b6bab..429919c8de1bc 100644 --- a/src/test/ui/variance/variance-use-invariant-struct-1.nll.stderr +++ b/src/test/ui/variance/variance-use-invariant-struct-1.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/variance-use-invariant-struct-1.rs:12:5 + --> $DIR/variance-use-invariant-struct-1.rs:14:5 | LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) | ---- ---- lifetime `'max` defined here @@ -15,7 +15,7 @@ LL | v = help: see for more information about variance error: lifetime may not live long enough - --> $DIR/variance-use-invariant-struct-1.rs:19:5 + --> $DIR/variance-use-invariant-struct-1.rs:23:5 | LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>) | ---- ---- lifetime `'max` defined here diff --git a/src/test/ui/variance/variance-use-invariant-struct-1.rs b/src/test/ui/variance/variance-use-invariant-struct-1.rs index 4772a9fb87829..7be03514e01a9 100644 --- a/src/test/ui/variance/variance-use-invariant-struct-1.rs +++ b/src/test/ui/variance/variance-use-invariant-struct-1.rs @@ -1,7 +1,9 @@ // Test various uses of structs with distint variances to make sure // they permit lifetimes to be approximated as expected. - +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir struct SomeStruct(*mut T); @@ -9,14 +11,18 @@ fn foo<'min,'max>(v: SomeStruct<&'max ()>) -> SomeStruct<&'min ()> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } fn bar<'min,'max>(v: SomeStruct<&'min ()>) -> SomeStruct<&'max ()> where 'max : 'min { - v //~ ERROR mismatched types + v + //[base]~^ ERROR mismatched types + //[nll]~^^ ERROR lifetime may not live long enough } diff --git a/src/test/ui/wf/wf-static-method.stderr b/src/test/ui/wf/wf-static-method.base.stderr similarity index 81% rename from src/test/ui/wf/wf-static-method.stderr rename to src/test/ui/wf/wf-static-method.base.stderr index c663931c5d605..186ab2790a398 100644 --- a/src/test/ui/wf/wf-static-method.stderr +++ b/src/test/ui/wf/wf-static-method.base.stderr @@ -1,131 +1,131 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/wf-static-method.rs:17:9 + --> $DIR/wf-static-method.rs:21:9 | LL | u | ^ | note: ...the reference is valid for the lifetime `'a` as defined here... - --> $DIR/wf-static-method.rs:14:6 + --> $DIR/wf-static-method.rs:18:6 | LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { | ^^ note: ...but the borrowed content is only valid for the lifetime `'b` as defined here - --> $DIR/wf-static-method.rs:14:10 + --> $DIR/wf-static-method.rs:18:10 | LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { | ^^ error[E0478]: lifetime bound not satisfied - --> $DIR/wf-static-method.rs:26:18 + --> $DIR/wf-static-method.rs:32:18 | LL | let me = Self::make_me(); | ^^^^ | note: lifetime parameter instantiated with the lifetime `'b` as defined here - --> $DIR/wf-static-method.rs:23:10 + --> $DIR/wf-static-method.rs:29:10 | LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { | ^^ note: but lifetime parameter must outlive the lifetime `'a` as defined here - --> $DIR/wf-static-method.rs:23:6 + --> $DIR/wf-static-method.rs:29:6 | LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { | ^^ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/wf-static-method.rs:33:9 + --> $DIR/wf-static-method.rs:41:9 | LL | u | ^ | note: ...the reference is valid for the lifetime `'a` as defined here... - --> $DIR/wf-static-method.rs:31:6 + --> $DIR/wf-static-method.rs:39:6 | LL | impl<'a, 'b> Evil<'a, 'b> { | ^^ note: ...but the borrowed content is only valid for the lifetime `'b` as defined here - --> $DIR/wf-static-method.rs:31:10 + --> $DIR/wf-static-method.rs:39:10 | LL | impl<'a, 'b> Evil<'a, 'b> { | ^^ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements - --> $DIR/wf-static-method.rs:41:5 + --> $DIR/wf-static-method.rs:51:5 | LL | <()>::static_evil(b) | ^^^^^^^^^^^^^^^^^ | note: first, the lifetime cannot outlive the lifetime `'b` as defined here... - --> $DIR/wf-static-method.rs:40:13 + --> $DIR/wf-static-method.rs:50:13 | LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { | ^^ note: ...so that reference does not outlive borrowed content - --> $DIR/wf-static-method.rs:41:23 + --> $DIR/wf-static-method.rs:51:23 | LL | <()>::static_evil(b) | ^ note: but, the lifetime must be valid for the lifetime `'a` as defined here... - --> $DIR/wf-static-method.rs:40:9 + --> $DIR/wf-static-method.rs:50:9 | LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { | ^^ note: ...so that reference does not outlive borrowed content - --> $DIR/wf-static-method.rs:41:5 + --> $DIR/wf-static-method.rs:51:5 | LL | <()>::static_evil(b) | ^^^^^^^^^^^^^^^^^^^^ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements - --> $DIR/wf-static-method.rs:45:5 + --> $DIR/wf-static-method.rs:57:5 | LL | ::static_evil(b) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: first, the lifetime cannot outlive the lifetime `'b` as defined here... - --> $DIR/wf-static-method.rs:44:22 + --> $DIR/wf-static-method.rs:56:22 | LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { | ^^ note: ...so that reference does not outlive borrowed content - --> $DIR/wf-static-method.rs:45:33 + --> $DIR/wf-static-method.rs:57:33 | LL | ::static_evil(b) | ^ note: but, the lifetime must be valid for the lifetime `'a` as defined here... - --> $DIR/wf-static-method.rs:44:18 + --> $DIR/wf-static-method.rs:56:18 | LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { | ^^ note: ...so that reference does not outlive borrowed content - --> $DIR/wf-static-method.rs:45:5 + --> $DIR/wf-static-method.rs:57:5 | LL | ::static_evil(b) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements - --> $DIR/wf-static-method.rs:50:5 + --> $DIR/wf-static-method.rs:63:5 | LL | ::inherent_evil(b) | ^^^^^^^^^^^^^^^^^^^^^ | note: first, the lifetime cannot outlive the lifetime `'b` as defined here... - --> $DIR/wf-static-method.rs:49:22 + --> $DIR/wf-static-method.rs:62:22 | LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { | ^^ note: ...so that reference does not outlive borrowed content - --> $DIR/wf-static-method.rs:50:27 + --> $DIR/wf-static-method.rs:63:27 | LL | ::inherent_evil(b) | ^ note: but, the lifetime must be valid for the lifetime `'a` as defined here... - --> $DIR/wf-static-method.rs:49:18 + --> $DIR/wf-static-method.rs:62:18 | LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { | ^^ note: ...so that reference does not outlive borrowed content - --> $DIR/wf-static-method.rs:50:5 + --> $DIR/wf-static-method.rs:63:5 | LL | ::inherent_evil(b) | ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/wf/wf-static-method.nll.stderr b/src/test/ui/wf/wf-static-method.nll.stderr index 265043111956a..7556d8e694d5a 100644 --- a/src/test/ui/wf/wf-static-method.nll.stderr +++ b/src/test/ui/wf/wf-static-method.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/wf-static-method.rs:17:9 + --> $DIR/wf-static-method.rs:21:9 | LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { | -- -- lifetime `'b` defined here @@ -12,7 +12,7 @@ LL | u = help: consider adding the following bound: `'b: 'a` error: lifetime may not live long enough - --> $DIR/wf-static-method.rs:26:18 + --> $DIR/wf-static-method.rs:32:18 | LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { | -- -- lifetime `'b` defined here @@ -25,7 +25,7 @@ LL | let me = Self::make_me(); = help: consider adding the following bound: `'b: 'a` error: lifetime may not live long enough - --> $DIR/wf-static-method.rs:33:9 + --> $DIR/wf-static-method.rs:41:9 | LL | impl<'a, 'b> Evil<'a, 'b> { | -- -- lifetime `'b` defined here @@ -38,7 +38,7 @@ LL | u = help: consider adding the following bound: `'b: 'a` error: lifetime may not live long enough - --> $DIR/wf-static-method.rs:41:5 + --> $DIR/wf-static-method.rs:51:5 | LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { | -- -- lifetime `'b` defined here @@ -50,7 +50,7 @@ LL | <()>::static_evil(b) = help: consider adding the following bound: `'b: 'a` error: lifetime may not live long enough - --> $DIR/wf-static-method.rs:45:5 + --> $DIR/wf-static-method.rs:57:5 | LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { | -- -- lifetime `'b` defined here @@ -62,7 +62,7 @@ LL | ::static_evil(b) = help: consider adding the following bound: `'b: 'a` error: lifetime may not live long enough - --> $DIR/wf-static-method.rs:50:5 + --> $DIR/wf-static-method.rs:63:5 | LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { | -- -- lifetime `'b` defined here diff --git a/src/test/ui/wf/wf-static-method.rs b/src/test/ui/wf/wf-static-method.rs index 6e805d61265ac..83557ce667bf6 100644 --- a/src/test/ui/wf/wf-static-method.rs +++ b/src/test/ui/wf/wf-static-method.rs @@ -4,6 +4,10 @@ // static inherent methods isn't quite working - need to // fix that before removing the check. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + trait Foo<'a, 'b, T>: Sized { fn make_me() -> Self { loop {} } fn static_evil(u: &'b u32) -> &'a u32; @@ -14,7 +18,9 @@ struct Evil<'a, 'b: 'a>(Option<&'a &'b ()>); impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { fn make_me() -> Self { } fn static_evil(u: &'b u32) -> &'a u32 { - u //~ ERROR E0312 + u + //[base]~^ ERROR E0312 + //[nll]~^^ ERROR lifetime may not live long enough } } @@ -23,14 +29,18 @@ struct IndirectEvil<'a, 'b: 'a>(Option<&'a &'b ()>); impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { fn make_me() -> Self { IndirectEvil(None) } fn static_evil(u: &'b u32) -> &'a u32 { - let me = Self::make_me(); //~ ERROR lifetime bound not satisfied + let me = Self::make_me(); + //[base]~^ ERROR lifetime bound not satisfied + //[nll]~^^ ERROR lifetime may not live long enough loop {} // (`me` could be used for the lifetime transmute). } } impl<'a, 'b> Evil<'a, 'b> { fn inherent_evil(u: &'b u32) -> &'a u32 { - u //~ ERROR E0312 + u + //[base]~^ ERROR E0312 + //[nll]~^^ ERROR lifetime may not live long enough } } @@ -38,17 +48,21 @@ impl<'a, 'b> Evil<'a, 'b> { // *check* that they hold. fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { - <()>::static_evil(b) //~ ERROR cannot infer an appropriate lifetime + <()>::static_evil(b) + //[base]~^ ERROR cannot infer an appropriate lifetime + //[nll]~^^ ERROR lifetime may not live long enough } fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { ::static_evil(b) - //~^ ERROR cannot infer an appropriate lifetime + //[base]~^ ERROR cannot infer an appropriate lifetime + //[nll]~^^ ERROR lifetime may not live long enough } fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { ::inherent_evil(b) - //~^ ERROR cannot infer an appropriate lifetime + //[base]~^ ERROR cannot infer an appropriate lifetime + //[nll]~^^ ERROR lifetime may not live long enough } diff --git a/src/test/ui/where-clauses/where-for-self-2.stderr b/src/test/ui/where-clauses/where-for-self-2.base.stderr similarity index 90% rename from src/test/ui/where-clauses/where-for-self-2.stderr rename to src/test/ui/where-clauses/where-for-self-2.base.stderr index 6da46e20c09c0..c09610cd69682 100644 --- a/src/test/ui/where-clauses/where-for-self-2.stderr +++ b/src/test/ui/where-clauses/where-for-self-2.base.stderr @@ -1,5 +1,5 @@ error: implementation of `Bar` is not general enough - --> $DIR/where-for-self-2.rs:23:5 + --> $DIR/where-for-self-2.rs:27:5 | LL | foo(&X); | ^^^ implementation of `Bar` is not general enough diff --git a/src/test/ui/where-clauses/where-for-self-2.nll.stderr b/src/test/ui/where-clauses/where-for-self-2.nll.stderr index f65db78fc8993..92d1b2121a6b2 100644 --- a/src/test/ui/where-clauses/where-for-self-2.nll.stderr +++ b/src/test/ui/where-clauses/where-for-self-2.nll.stderr @@ -1,5 +1,5 @@ error: implementation of `Bar` is not general enough - --> $DIR/where-for-self-2.rs:23:5 + --> $DIR/where-for-self-2.rs:27:5 | LL | foo(&X); | ^^^^^^^ implementation of `Bar` is not general enough diff --git a/src/test/ui/where-clauses/where-for-self-2.rs b/src/test/ui/where-clauses/where-for-self-2.rs index 37c6954fd52ee..4e4e0ec912ea1 100644 --- a/src/test/ui/where-clauses/where-for-self-2.rs +++ b/src/test/ui/where-clauses/where-for-self-2.rs @@ -3,6 +3,10 @@ // specific lifetime is not enough to satisfy the `for<'a> ...` constraint, which // should require *all* lifetimes. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + static X: &'static u32 = &42; trait Bar { From a2946ae29976d8343932e54bd5758c7535d93b91 Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:29:27 -0400 Subject: [PATCH 11/14] underscore-lifetime nll revisions --- ...underscore.stderr => dyn-trait-underscore.base.stderr} | 4 ++-- .../underscore-lifetime/dyn-trait-underscore.nll.stderr | 2 +- src/test/ui/underscore-lifetime/dyn-trait-underscore.rs | 8 +++++++- ...rr => underscore-lifetime-elison-mismatch.base.stderr} | 2 +- .../underscore-lifetime-elison-mismatch.nll.stderr | 2 +- .../underscore-lifetime-elison-mismatch.rs | 8 +++++++- 6 files changed, 19 insertions(+), 7 deletions(-) rename src/test/ui/underscore-lifetime/{dyn-trait-underscore.stderr => dyn-trait-underscore.base.stderr} (93%) rename src/test/ui/underscore-lifetime/{underscore-lifetime-elison-mismatch.stderr => underscore-lifetime-elison-mismatch.base.stderr} (92%) diff --git a/src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr b/src/test/ui/underscore-lifetime/dyn-trait-underscore.base.stderr similarity index 93% rename from src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr rename to src/test/ui/underscore-lifetime/dyn-trait-underscore.base.stderr index f4285a0f98e7c..07357795010b5 100644 --- a/src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr +++ b/src/test/ui/underscore-lifetime/dyn-trait-underscore.base.stderr @@ -1,5 +1,5 @@ error[E0759]: `items` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement - --> $DIR/dyn-trait-underscore.rs:8:20 + --> $DIR/dyn-trait-underscore.rs:12:20 | LL | fn a(items: &[T]) -> Box> { | ---- this data with an anonymous lifetime `'_`... @@ -10,7 +10,7 @@ LL | Box::new(items.iter()) | ...is used and required to live as long as `'static` here | note: `'static` lifetime requirement introduced by the return type - --> $DIR/dyn-trait-underscore.rs:6:29 + --> $DIR/dyn-trait-underscore.rs:10:29 | LL | fn a(items: &[T]) -> Box> { | ^^^^^^^^^^^^^^^^^^^^^ `'static` requirement introduced here diff --git a/src/test/ui/underscore-lifetime/dyn-trait-underscore.nll.stderr b/src/test/ui/underscore-lifetime/dyn-trait-underscore.nll.stderr index 8ed48bda26e85..53d45f6a8f22b 100644 --- a/src/test/ui/underscore-lifetime/dyn-trait-underscore.nll.stderr +++ b/src/test/ui/underscore-lifetime/dyn-trait-underscore.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/dyn-trait-underscore.rs:8:5 + --> $DIR/dyn-trait-underscore.rs:12:5 | LL | fn a(items: &[T]) -> Box> { | - let's call the lifetime of this reference `'1` diff --git a/src/test/ui/underscore-lifetime/dyn-trait-underscore.rs b/src/test/ui/underscore-lifetime/dyn-trait-underscore.rs index e951adf030f5c..7110d43221082 100644 --- a/src/test/ui/underscore-lifetime/dyn-trait-underscore.rs +++ b/src/test/ui/underscore-lifetime/dyn-trait-underscore.rs @@ -3,9 +3,15 @@ // // cc #48468 +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + fn a(items: &[T]) -> Box> { // ^^^^^^^^^^^^^^^^^^^^^ bound *here* defaults to `'static` - Box::new(items.iter()) //~ ERROR E0759 + Box::new(items.iter()) + //[base]~^ ERROR E0759 + //[nll]~^^ ERROR lifetime may not live long enough } fn b(items: &[T]) -> Box + '_> { diff --git a/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.stderr b/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.base.stderr similarity index 92% rename from src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.stderr rename to src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.base.stderr index 8976da01e739b..2581911f5ce23 100644 --- a/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.stderr +++ b/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.base.stderr @@ -1,5 +1,5 @@ error[E0623]: lifetime mismatch - --> $DIR/underscore-lifetime-elison-mismatch.rs:1:49 + --> $DIR/underscore-lifetime-elison-mismatch.rs:5:49 | LL | fn foo(x: &mut Vec<&'_ u8>, y: &'_ u8) { x.push(y); } | ------ ------ ^ ...but data from `y` flows into `x` here diff --git a/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.nll.stderr b/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.nll.stderr index e1d57b8ba1eda..8e10242cb1331 100644 --- a/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.nll.stderr +++ b/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/underscore-lifetime-elison-mismatch.rs:1:42 + --> $DIR/underscore-lifetime-elison-mismatch.rs:5:42 | LL | fn foo(x: &mut Vec<&'_ u8>, y: &'_ u8) { x.push(y); } | - - ^^^^^^^^^ argument requires that `'1` must outlive `'2` diff --git a/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.rs b/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.rs index f465a804283a7..6d495138da9e3 100644 --- a/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.rs +++ b/src/test/ui/underscore-lifetime/underscore-lifetime-elison-mismatch.rs @@ -1,3 +1,9 @@ -fn foo(x: &mut Vec<&'_ u8>, y: &'_ u8) { x.push(y); } //~ ERROR lifetime mismatch +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + +fn foo(x: &mut Vec<&'_ u8>, y: &'_ u8) { x.push(y); } +//[base]~^ ERROR lifetime mismatch +//[nll]~^^ ERROR lifetime may not live long enough fn main() {} From f881bf7c0a2c1020e36fd5f35be5ecb5af278966 Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Sat, 2 Apr 2022 11:08:16 -0400 Subject: [PATCH 12/14] unboxed-closures and type-alias-impl-trait nll revisions --- ...generic_type_does_not_live_long_enough.base.stderr} | 8 ++++---- .../generic_type_does_not_live_long_enough.nll.stderr | 8 ++++---- .../generic_type_does_not_live_long_enough.rs | 4 ++++ ...lias.stderr => issue-57611-trait-alias.base.stderr} | 2 +- .../issue-57611-trait-alias.nll.stderr | 6 +++--- .../type-alias-impl-trait/issue-57611-trait-alias.rs | 6 +++++- .../{issue-30906.stderr => issue-30906.base.stderr} | 2 +- src/test/ui/unboxed-closures/issue-30906.nll.stderr | 2 +- src/test/ui/unboxed-closures/issue-30906.rs | 4 ++++ ...fer-argument-types-two-region-pointers.base.stderr} | 10 +++++++--- ...infer-argument-types-two-region-pointers.nll.stderr | 2 +- ...losures-infer-argument-types-two-region-pointers.rs | 8 +++++++- 12 files changed, 42 insertions(+), 20 deletions(-) rename src/test/ui/type-alias-impl-trait/{generic_type_does_not_live_long_enough.stderr => generic_type_does_not_live_long_enough.base.stderr} (77%) rename src/test/ui/type-alias-impl-trait/{issue-57611-trait-alias.stderr => issue-57611-trait-alias.base.stderr} (90%) rename src/test/ui/unboxed-closures/{issue-30906.stderr => issue-30906.base.stderr} (92%) rename src/test/ui/unboxed-closures/{unboxed-closures-infer-argument-types-two-region-pointers.stderr => unboxed-closures-infer-argument-types-two-region-pointers.base.stderr} (92%) diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.base.stderr similarity index 77% rename from src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr rename to src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.base.stderr index 15ec2eed3da4b..a3b410c2cfb8c 100644 --- a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.base.stderr @@ -1,23 +1,23 @@ error: at least one trait must be specified - --> $DIR/generic_type_does_not_live_long_enough.rs:10:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:14:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ error: non-defining opaque type use in defining scope - --> $DIR/generic_type_does_not_live_long_enough.rs:6:18 + --> $DIR/generic_type_does_not_live_long_enough.rs:10:18 | LL | let z: i32 = x; | ^ | note: used non-generic type `&'static i32` for generic parameter - --> $DIR/generic_type_does_not_live_long_enough.rs:10:19 + --> $DIR/generic_type_does_not_live_long_enough.rs:14:19 | LL | type WrongGeneric = impl 'static; | ^ error[E0310]: the parameter type `T` may not live long enough - --> $DIR/generic_type_does_not_live_long_enough.rs:14:5 + --> $DIR/generic_type_does_not_live_long_enough.rs:18:5 | LL | fn wrong_generic(t: T) -> WrongGeneric { | - help: consider adding an explicit lifetime bound...: `T: 'static` diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr index dc85db66d32ba..db771d211322c 100644 --- a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr @@ -1,23 +1,23 @@ error: at least one trait must be specified - --> $DIR/generic_type_does_not_live_long_enough.rs:10:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:14:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ error: non-defining opaque type use in defining scope - --> $DIR/generic_type_does_not_live_long_enough.rs:6:18 + --> $DIR/generic_type_does_not_live_long_enough.rs:10:18 | LL | let z: i32 = x; | ^ | note: used non-generic type `&'static i32` for generic parameter - --> $DIR/generic_type_does_not_live_long_enough.rs:10:19 + --> $DIR/generic_type_does_not_live_long_enough.rs:14:19 | LL | type WrongGeneric = impl 'static; | ^ error[E0310]: the parameter type `T` may not live long enough - --> $DIR/generic_type_does_not_live_long_enough.rs:14:5 + --> $DIR/generic_type_does_not_live_long_enough.rs:18:5 | LL | t | ^ diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs index cb90776472b5d..2ad7e615e19cc 100644 --- a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs @@ -1,5 +1,9 @@ #![feature(type_alias_impl_trait)] +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + fn main() { let y = 42; let x = wrong_generic(&y); diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.base.stderr similarity index 90% rename from src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr rename to src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.base.stderr index 45329ea292dcf..be77b60ca8ff3 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.base.stderr @@ -1,5 +1,5 @@ error: implementation of `FnOnce` is not general enough - --> $DIR/issue-57611-trait-alias.rs:20:9 + --> $DIR/issue-57611-trait-alias.rs:25:9 | LL | |x| x | ^^^^^ implementation of `FnOnce` is not general enough diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr index 91daa65d6563a..f5b91567ff531 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:20:9 + --> $DIR/issue-57611-trait-alias.rs:25:9 | LL | |x| x | ^^^^^ one type is more general than the other @@ -7,13 +7,13 @@ LL | |x| x = note: expected type `for<'r> Fn<(&'r X,)>` found type `Fn<(&X,)>` note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:20:9 + --> $DIR/issue-57611-trait-alias.rs:25:9 | LL | |x| x | ^^^^^ error: implementation of `FnOnce` is not general enough - --> $DIR/issue-57611-trait-alias.rs:20:9 + --> $DIR/issue-57611-trait-alias.rs:25:9 | LL | |x| x | ^^^^^ implementation of `FnOnce` is not general enough diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs index 7c6e764248479..e95ddab75bee4 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs @@ -1,6 +1,11 @@ // Regression test for issue #57611 // Ensures that we don't ICE // FIXME: This should compile, but it currently doesn't +// known-bug + +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir #![feature(trait_alias)] #![feature(type_alias_impl_trait)] @@ -18,7 +23,6 @@ impl Foo for X { fn bar(&self) -> Self::Bar { |x| x - //~^ ERROR implementation of `FnOnce` is not general enough } } diff --git a/src/test/ui/unboxed-closures/issue-30906.stderr b/src/test/ui/unboxed-closures/issue-30906.base.stderr similarity index 92% rename from src/test/ui/unboxed-closures/issue-30906.stderr rename to src/test/ui/unboxed-closures/issue-30906.base.stderr index 35b1e454c02b4..5d555a9c5e450 100644 --- a/src/test/ui/unboxed-closures/issue-30906.stderr +++ b/src/test/ui/unboxed-closures/issue-30906.base.stderr @@ -1,5 +1,5 @@ error: implementation of `FnOnce` is not general enough - --> $DIR/issue-30906.rs:18:5 + --> $DIR/issue-30906.rs:22:5 | LL | test(Compose(f, |_| {})); | ^^^^ implementation of `FnOnce` is not general enough diff --git a/src/test/ui/unboxed-closures/issue-30906.nll.stderr b/src/test/ui/unboxed-closures/issue-30906.nll.stderr index 147a20974732d..333e8e178217f 100644 --- a/src/test/ui/unboxed-closures/issue-30906.nll.stderr +++ b/src/test/ui/unboxed-closures/issue-30906.nll.stderr @@ -1,5 +1,5 @@ error: implementation of `FnOnce` is not general enough - --> $DIR/issue-30906.rs:18:5 + --> $DIR/issue-30906.rs:22:5 | LL | test(Compose(f, |_| {})); | ^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough diff --git a/src/test/ui/unboxed-closures/issue-30906.rs b/src/test/ui/unboxed-closures/issue-30906.rs index e2d219e470384..1fd3a7f97dea3 100644 --- a/src/test/ui/unboxed-closures/issue-30906.rs +++ b/src/test/ui/unboxed-closures/issue-30906.rs @@ -1,5 +1,9 @@ #![feature(fn_traits, unboxed_closures)] +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + fn test FnOnce<(&'x str,)>>(_: F) {} struct Compose(F, G); diff --git a/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.stderr b/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.base.stderr similarity index 92% rename from src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.stderr rename to src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.base.stderr index d7813338f68cb..ebd14c6429820 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.base.stderr @@ -1,23 +1,27 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content... - --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:17:15 + --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:21:15 | LL | x.set(y); | ^ | note: ...the reference is valid for the anonymous lifetime #2 defined here... - --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:16:14 + --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:20:14 | LL | doit(0, &|x, y| { | ______________^ LL | | x.set(y); +LL | | +LL | | LL | | }); | |_____^ note: ...but the borrowed content is only valid for the anonymous lifetime #3 defined here - --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:16:14 + --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:20:14 | LL | doit(0, &|x, y| { | ______________^ LL | | x.set(y); +LL | | +LL | | LL | | }); | |_____^ diff --git a/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.nll.stderr b/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.nll.stderr index e97157b83980c..aeeee6e5003e8 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.nll.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.nll.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:17:9 + --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:21:9 | LL | doit(0, &|x, y| { | - - has type `&'1 i32` diff --git a/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.rs b/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.rs index a1364b93fa4cd..288349e44561e 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.rs +++ b/src/test/ui/unboxed-closures/unboxed-closures-infer-argument-types-two-region-pointers.rs @@ -3,6 +3,10 @@ // That a closure whose expected argument types include two distinct // bound regions. +// revisions: base nll +// ignore-compare-mode-nll +//[nll] compile-flags: -Z borrowck=mir + use std::cell::Cell; fn doit(val: T, f: &F) @@ -14,6 +18,8 @@ fn doit(val: T, f: &F) pub fn main() { doit(0, &|x, y| { - x.set(y); //~ ERROR E0312 + x.set(y); + //[base]~^ ERROR E0312 + //[nll]~^^ lifetime may not live long enough }); } From d12689c022d56d63c03a73925054c95d060e34c4 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sat, 2 Apr 2022 00:23:52 -0700 Subject: [PATCH 13/14] Explain why `&T` is cloned when `T` is not `Clone` --- compiler/rustc_typeck/src/check/demand.rs | 2 +- .../src/check/fn_ctxt/suggestions.rs | 59 +++++++++++++++++-- src/test/ui/typeck/explain_clone_autoref.rs | 13 ++++ .../ui/typeck/explain_clone_autoref.stderr | 18 ++++++ 4 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 src/test/ui/typeck/explain_clone_autoref.rs create mode 100644 src/test/ui/typeck/explain_clone_autoref.stderr diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index 00bc16452b9b9..83e535b3c3247 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -40,6 +40,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { self.suggest_boxing_when_appropriate(err, expr, expected, expr_ty); self.suggest_missing_parentheses(err, expr); self.suggest_block_to_brackets_peeling_refs(err, expr, expr_ty, expected); + self.note_type_is_not_clone(err, expected, expr_ty, expr); self.note_need_for_fn_pointer(err, expected, expr_ty); self.note_internal_mutation_in_method(err, expr, expected, expr_ty); self.report_closure_inferred_return_type(err, expected); @@ -630,7 +631,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { Applicability::MachineApplicable, true, )); - } } _ => {} diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs b/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs index 1ccdbb0aa500b..93a0900c7e80d 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs @@ -2,8 +2,6 @@ use super::FnCtxt; use crate::astconv::AstConv; use rustc_ast::util::parser::ExprPrecedence; -use rustc_span::{self, Span}; - use rustc_errors::{Applicability, Diagnostic, MultiSpan}; use rustc_hir as hir; use rustc_hir::def::{CtorOf, DefKind}; @@ -13,12 +11,14 @@ use rustc_hir::{ WherePredicate, }; use rustc_infer::infer::{self, TyCtxtInferExt}; - +use rustc_infer::traits; use rustc_middle::lint::in_external_macro; -use rustc_middle::ty::{self, Binder, Ty}; +use rustc_middle::ty::subst::GenericArgKind; +use rustc_middle::ty::{self, Binder, ToPredicate, Ty}; use rustc_span::symbol::{kw, sym}; +use rustc_span::Span; +use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt; -use rustc_middle::ty::subst::GenericArgKind; use std::iter; impl<'a, 'tcx> FnCtxt<'a, 'tcx> { @@ -846,4 +846,53 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let node = self.tcx.hir().get(id); matches!(node, Node::Stmt(Stmt { kind: StmtKind::Local(..), .. })) } + + /// Suggest that `&T` was cloned instead of `T` because `T` does not implement `Clone`, + /// which is a side-effect of autoref. + pub(crate) fn note_type_is_not_clone( + &self, + diag: &mut Diagnostic, + expected_ty: Ty<'tcx>, + found_ty: Ty<'tcx>, + expr: &hir::Expr<'_>, + ) { + let hir::ExprKind::MethodCall(segment, &[ref callee_expr], _) = expr.kind else { return; }; + let Some(clone_trait_did) = self.tcx.lang_items().clone_trait() else { return; }; + let ty::Ref(_, pointee_ty, _) = found_ty.kind() else { return }; + let results = self.typeck_results.borrow(); + // First, look for a `Clone::clone` call + if segment.ident.name == sym::clone + && results.type_dependent_def_id(expr.hir_id).map_or( + false, + |did| { + self.tcx.associated_item(did).container + == ty::AssocItemContainer::TraitContainer(clone_trait_did) + }, + ) + // If that clone call hasn't already dereferenced the self type (i.e. don't give this + // diagnostic in cases where we have `(&&T).clone()` and we expect `T`). + && !results.expr_adjustments(callee_expr).iter().any(|adj| matches!(adj.kind, ty::adjustment::Adjust::Deref(..))) + // Check that we're in fact trying to clone into the expected type + && self.can_coerce(*pointee_ty, expected_ty) + // And the expected type doesn't implement `Clone` + && !self.predicate_must_hold_considering_regions(&traits::Obligation { + cause: traits::ObligationCause::dummy(), + param_env: self.param_env, + recursion_depth: 0, + predicate: ty::Binder::dummy(ty::TraitRef { + def_id: clone_trait_did, + substs: self.tcx.mk_substs([expected_ty.into()].iter()), + }) + .without_const() + .to_predicate(self.tcx), + }) + { + diag.span_note( + callee_expr.span, + &format!( + "`{expected_ty}` does not implement `Clone`, so `{found_ty}` was cloned instead" + ), + ); + } + } } diff --git a/src/test/ui/typeck/explain_clone_autoref.rs b/src/test/ui/typeck/explain_clone_autoref.rs new file mode 100644 index 0000000000000..9279e4c3901db --- /dev/null +++ b/src/test/ui/typeck/explain_clone_autoref.rs @@ -0,0 +1,13 @@ +struct NotClone; + +fn main() { + clone_thing(&NotClone); +} + +fn clone_thing(nc: &NotClone) -> NotClone { + //~^ NOTE expected `NotClone` because of return type + nc.clone() + //~^ ERROR mismatched type + //~| NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead + //~| NOTE expected struct `NotClone`, found `&NotClone` +} diff --git a/src/test/ui/typeck/explain_clone_autoref.stderr b/src/test/ui/typeck/explain_clone_autoref.stderr new file mode 100644 index 0000000000000..faac680ea1931 --- /dev/null +++ b/src/test/ui/typeck/explain_clone_autoref.stderr @@ -0,0 +1,18 @@ +error[E0308]: mismatched types + --> $DIR/explain_clone_autoref.rs:9:5 + | +LL | fn clone_thing(nc: &NotClone) -> NotClone { + | -------- expected `NotClone` because of return type +LL | +LL | nc.clone() + | ^^^^^^^^^^ expected struct `NotClone`, found `&NotClone` + | +note: `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead + --> $DIR/explain_clone_autoref.rs:9:5 + | +LL | nc.clone() + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. From 6d18fbbc3f1fee9e717ae5f55bd2970d96e2b5cb Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 5 Apr 2022 11:13:48 -0700 Subject: [PATCH 14/14] diagnostics: tweak error message to give more rationale to unsafe Fn --- library/core/src/ops/function.rs | 9 ++++++--- src/test/ui/closures/coerce-unsafe-to-closure.stderr | 4 ++-- .../rfcs/rfc-2396-target_feature-11/fn-traits.stderr | 6 +++--- .../unboxed-closures-unsafe-extern-fn.stderr | 12 ++++++------ .../unboxed-closures-wrong-arg-type-extern-fn.stderr | 12 ++++++------ 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/library/core/src/ops/function.rs b/library/core/src/ops/function.rs index 19918e0dcea42..ae879078739d3 100644 --- a/library/core/src/ops/function.rs +++ b/library/core/src/ops/function.rs @@ -61,8 +61,9 @@ ), on( _Self = "unsafe fn", + note = "unsafe function cannot be called generically without an unsafe block", // SAFETY: tidy is not smart enough to tell that the below unsafe block is a string - note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" + label = "call the function in a closure: `|| unsafe {{ /* code */ }}`" ), message = "expected a `{Fn}<{Args}>` closure, found `{Self}`", label = "expected an `Fn<{Args}>` closure, found `{Self}`" @@ -146,8 +147,9 @@ pub trait Fn: FnMut { ), on( _Self = "unsafe fn", + note = "unsafe function cannot be called generically without an unsafe block", // SAFETY: tidy is not smart enough to tell that the below unsafe block is a string - note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" + label = "call the function in a closure: `|| unsafe {{ /* code */ }}`" ), message = "expected a `{FnMut}<{Args}>` closure, found `{Self}`", label = "expected an `FnMut<{Args}>` closure, found `{Self}`" @@ -223,8 +225,9 @@ pub trait FnMut: FnOnce { ), on( _Self = "unsafe fn", + note = "unsafe function cannot be called generically without an unsafe block", // SAFETY: tidy is not smart enough to tell that the below unsafe block is a string - note = "unsafe functions must be wrapped in closures: `|| unsafe {{ /* code */ }}`" + label = "call the function in a closure: `|| unsafe {{ /* code */ }}`" ), message = "expected a `{FnOnce}<{Args}>` closure, found `{Self}`", label = "expected an `FnOnce<{Args}>` closure, found `{Self}`" diff --git a/src/test/ui/closures/coerce-unsafe-to-closure.stderr b/src/test/ui/closures/coerce-unsafe-to-closure.stderr index 57043c335c0dd..bd095c2d83d8a 100644 --- a/src/test/ui/closures/coerce-unsafe-to-closure.stderr +++ b/src/test/ui/closures/coerce-unsafe-to-closure.stderr @@ -2,12 +2,12 @@ error[E0277]: expected a `FnOnce<(&str,)>` closure, found `unsafe extern "rust-i --> $DIR/coerce-unsafe-to-closure.rs:2:44 | LL | let x: Option<&[u8]> = Some("foo").map(std::mem::transmute); - | --- ^^^^^^^^^^^^^^^^^^^ expected an `FnOnce<(&str,)>` closure, found `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}` + | --- ^^^^^^^^^^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `FnOnce<(&str,)>` is not implemented for `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `Option::::map` --> $SRC_DIR/core/src/option.rs:LL:COL | diff --git a/src/test/ui/rfcs/rfc-2396-target_feature-11/fn-traits.stderr b/src/test/ui/rfcs/rfc-2396-target_feature-11/fn-traits.stderr index ea22d1c89b1cc..94a90a5685489 100644 --- a/src/test/ui/rfcs/rfc-2396-target_feature-11/fn-traits.stderr +++ b/src/test/ui/rfcs/rfc-2396-target_feature-11/fn-traits.stderr @@ -53,7 +53,7 @@ error[E0277]: expected a `Fn<()>` closure, found `unsafe fn() {foo_unsafe}` --> $DIR/fn-traits.rs:28:10 | LL | call(foo_unsafe); - | ---- ^^^^^^^^^^ expected an `Fn<()>` closure, found `unsafe fn() {foo_unsafe}` + | ---- ^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | @@ -70,7 +70,7 @@ error[E0277]: expected a `FnMut<()>` closure, found `unsafe fn() {foo_unsafe}` --> $DIR/fn-traits.rs:30:14 | LL | call_mut(foo_unsafe); - | -------- ^^^^^^^^^^ expected an `FnMut<()>` closure, found `unsafe fn() {foo_unsafe}` + | -------- ^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | @@ -87,7 +87,7 @@ error[E0277]: expected a `FnOnce<()>` closure, found `unsafe fn() {foo_unsafe}` --> $DIR/fn-traits.rs:32:15 | LL | call_once(foo_unsafe); - | --------- ^^^^^^^^^^ expected an `FnOnce<()>` closure, found `unsafe fn() {foo_unsafe}` + | --------- ^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | diff --git a/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr b/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr index fcd668c191fdd..18e133957ba37 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-unsafe-extern-fn.stderr @@ -2,12 +2,12 @@ error[E0277]: expected a `Fn<(&isize,)>` closure, found `for<'r> unsafe fn(&'r i --> $DIR/unboxed-closures-unsafe-extern-fn.rs:20:21 | LL | let x = call_it(&square, 22); - | ------- ^^^^^^^ expected an `Fn<(&isize,)>` closure, found `for<'r> unsafe fn(&'r isize) -> isize {square}` + | ------- ^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `for<'r> Fn<(&'r isize,)>` is not implemented for `for<'r> unsafe fn(&'r isize) -> isize {square}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `call_it` --> $DIR/unboxed-closures-unsafe-extern-fn.rs:9:15 | @@ -18,12 +18,12 @@ error[E0277]: expected a `FnMut<(&isize,)>` closure, found `for<'r> unsafe fn(&' --> $DIR/unboxed-closures-unsafe-extern-fn.rs:25:25 | LL | let y = call_it_mut(&mut square, 22); - | ----------- ^^^^^^^^^^^ expected an `FnMut<(&isize,)>` closure, found `for<'r> unsafe fn(&'r isize) -> isize {square}` + | ----------- ^^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `for<'r> FnMut<(&'r isize,)>` is not implemented for `for<'r> unsafe fn(&'r isize) -> isize {square}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `call_it_mut` --> $DIR/unboxed-closures-unsafe-extern-fn.rs:12:19 | @@ -34,12 +34,12 @@ error[E0277]: expected a `FnOnce<(&isize,)>` closure, found `for<'r> unsafe fn(& --> $DIR/unboxed-closures-unsafe-extern-fn.rs:30:26 | LL | let z = call_it_once(square, 22); - | ------------ ^^^^^^ expected an `FnOnce<(&isize,)>` closure, found `for<'r> unsafe fn(&'r isize) -> isize {square}` + | ------------ ^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `for<'r> FnOnce<(&'r isize,)>` is not implemented for `for<'r> unsafe fn(&'r isize) -> isize {square}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `call_it_once` --> $DIR/unboxed-closures-unsafe-extern-fn.rs:15:20 | diff --git a/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr b/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr index 576806e3956b0..c826af3c4c38f 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-wrong-arg-type-extern-fn.stderr @@ -2,12 +2,12 @@ error[E0277]: expected a `Fn<(&isize,)>` closure, found `unsafe fn(isize) -> isi --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:21:21 | LL | let x = call_it(&square, 22); - | ------- ^^^^^^^ expected an `Fn<(&isize,)>` closure, found `unsafe fn(isize) -> isize {square}` + | ------- ^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `for<'r> Fn<(&'r isize,)>` is not implemented for `unsafe fn(isize) -> isize {square}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `call_it` --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:10:15 | @@ -18,12 +18,12 @@ error[E0277]: expected a `FnMut<(&isize,)>` closure, found `unsafe fn(isize) -> --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:26:25 | LL | let y = call_it_mut(&mut square, 22); - | ----------- ^^^^^^^^^^^ expected an `FnMut<(&isize,)>` closure, found `unsafe fn(isize) -> isize {square}` + | ----------- ^^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `for<'r> FnMut<(&'r isize,)>` is not implemented for `unsafe fn(isize) -> isize {square}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `call_it_mut` --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:13:19 | @@ -34,12 +34,12 @@ error[E0277]: expected a `FnOnce<(&isize,)>` closure, found `unsafe fn(isize) -> --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:31:26 | LL | let z = call_it_once(square, 22); - | ------------ ^^^^^^ expected an `FnOnce<(&isize,)>` closure, found `unsafe fn(isize) -> isize {square}` + | ------------ ^^^^^^ call the function in a closure: `|| unsafe { /* code */ }` | | | required by a bound introduced by this call | = help: the trait `for<'r> FnOnce<(&'r isize,)>` is not implemented for `unsafe fn(isize) -> isize {square}` - = note: unsafe functions must be wrapped in closures: `|| unsafe { /* code */ }` + = note: unsafe function cannot be called generically without an unsafe block note: required by a bound in `call_it_once` --> $DIR/unboxed-closures-wrong-arg-type-extern-fn.rs:16:20 |