From 5c11392b14c3ed55b8166d3b790eeeb470764630 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 1 Dec 2018 16:33:05 -0800 Subject: [PATCH 01/86] Redo the docs for Vec::set_len Inspired by the recent conversation on IRLO. --- src/liballoc/vec.rs | 80 ++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index f7a0bbdceafc9..4ff38247dae24 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -748,28 +748,64 @@ impl Vec { self } - /// Sets the length of a vector. + /// Forces the length of a vector to a particular value. /// - /// This will explicitly set the size of the vector, without actually - /// modifying its buffers, so it is up to the caller to ensure that the - /// vector is actually the specified size. + /// This is a low-level operation that maintains none of the normal + /// invariants of the type. Normally changing the length of a `Vec` + /// is done using one of the safe operations instead, such as + /// [`truncate`], [`resize`], [`extend`], or [`clear`]. /// - /// # Examples + /// [`truncate`]: #method.truncate + /// [`resize`]: #method.resize + /// [`extend`]: #method.extend-1 + /// [`clear`]: #method.clear /// - /// ``` - /// use std::ptr; + /// # Safety /// - /// let mut vec = vec!['r', 'u', 's', 't']; + /// - `new_len` must be less than or equal to `capacity()`. + /// - All elements between past the previous end up to the `new_len` + /// must be initialized. /// - /// unsafe { - /// ptr::drop_in_place(&mut vec[3]); - /// vec.set_len(3); + /// # Examples + /// + /// This method can be useful for situations in which the `Vec` is + /// serving as a buffer for other code, particularly over FFI: + /// + /// ```no_run + /// # #![allow(dead_code)] + /// # // This is just a minimal skeleton for the doc example; + /// # // don't use this as a starting point for a real library. + /// # pub struct StreamWrapper { strm: *mut std::ffi::c_void } + /// # const Z_OK: i32 = 0; + /// # extern "C" { + /// # fn deflateGetDictionary( + /// # strm: *mut std::ffi::c_void, + /// # dictionary: *mut u8, + /// # dictLength: *mut usize, + /// # ) -> i32; + /// # } + /// # impl StreamWrapper { + /// pub fn get_dictionary(&self) -> Option> { + /// // Per the docs, "32768 bytes is always enough". + /// let mut dict = Vec::with_capacity(32_768); + /// let mut dict_length = 0; + /// unsafe { + /// // Make the FFI call... + /// let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length); + /// if r == Z_OK { + /// // ...and update the length to what was initialized. + /// dict.set_len(dict_length); + /// Some(dict) + /// } else { + /// None + /// } + /// } /// } - /// assert_eq!(vec, ['r', 'u', 's']); + /// # } /// ``` /// - /// In this example, there is a memory leak since the memory locations - /// owned by the inner vectors were not freed prior to the `set_len` call: + /// While the following example is sound, there is a memory leak since + /// the inner vectors were not freed prior to the `set_len` call: /// /// ``` /// let mut vec = vec![vec![1, 0, 0], @@ -780,21 +816,11 @@ impl Vec { /// } /// ``` /// - /// In this example, the vector gets expanded from zero to four items - /// without any memory allocations occurring, resulting in vector - /// values of unallocated memory: - /// - /// ``` - /// let mut vec: Vec = Vec::new(); - /// - /// unsafe { - /// vec.set_len(4); - /// } - /// ``` + /// (Instead, one would normally use [`clear`] in this situation.) #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub unsafe fn set_len(&mut self, len: usize) { - self.len = len; + pub unsafe fn set_len(&mut self, new_len: usize) { + self.len = new_len; } /// Removes an element from the vector and returns it. From ac642aba074969860f9fb53fb9e2d52f0e0203cb Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Tue, 11 Dec 2018 22:17:35 -0800 Subject: [PATCH 02/86] Update the comment some more following CR feedback --- src/liballoc/vec.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index 4ff38247dae24..b987b94500fc4 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -748,10 +748,10 @@ impl Vec { self } - /// Forces the length of a vector to a particular value. + /// Forces the length of the vector to `new_len`. /// /// This is a low-level operation that maintains none of the normal - /// invariants of the type. Normally changing the length of a `Vec` + /// invariants of the type. Normally changing the length of a vector /// is done using one of the safe operations instead, such as /// [`truncate`], [`resize`], [`extend`], or [`clear`]. /// @@ -762,14 +762,15 @@ impl Vec { /// /// # Safety /// - /// - `new_len` must be less than or equal to `capacity()`. - /// - All elements between past the previous end up to the `new_len` - /// must be initialized. + /// - `new_len` must be less than or equal to [`capacity()`]. + /// - The elements at `old_len..new_len` must be initialized. + /// + /// [`capacity()`]: #method.capacity /// /// # Examples /// - /// This method can be useful for situations in which the `Vec` is - /// serving as a buffer for other code, particularly over FFI: + /// This method can be useful for situations in which the vector + /// is serving as a buffer for other code, particularly over FFI: /// /// ```no_run /// # #![allow(dead_code)] @@ -786,7 +787,7 @@ impl Vec { /// # } /// # impl StreamWrapper { /// pub fn get_dictionary(&self) -> Option> { - /// // Per the docs, "32768 bytes is always enough". + /// // Per the FFI method's docs, "32768 bytes is always enough". /// let mut dict = Vec::with_capacity(32_768); /// let mut dict_length = 0; /// unsafe { @@ -816,7 +817,8 @@ impl Vec { /// } /// ``` /// - /// (Instead, one would normally use [`clear`] in this situation.) + /// Normally, here, one would use [`clear`] instead to correctly drop + /// the contents and thus not leak memory. #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn set_len(&mut self, new_len: usize) { From 0eacf2cb240606343284a2d38b0f54b6028b134d Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 21 Dec 2018 15:08:33 +0100 Subject: [PATCH 03/86] Sidestep ICE in `FieldPlacement::count` by not calling it when count will not fit in host's usize. --- src/librustc/ty/layout.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index f4506c8e81976..2bc352d1d9923 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -1852,7 +1852,11 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> { return Ok(None); } } - if let FieldPlacement::Array { .. } = layout.fields { + if let FieldPlacement::Array { count: original_64_bit_count, .. } = layout.fields { + // rust-lang/rust#57038: avoid ICE within FieldPlacement::count when count too big + if original_64_bit_count > usize::max_value() as u64 { + return Err(LayoutError::SizeOverflow(layout.ty)); + } if layout.fields.count() > 0 { return self.find_niche(layout.field(self, 0)?); } else { From 7e7c337aef6e87f6152771351eaed32b31d666f7 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 24 Dec 2018 18:53:28 +0100 Subject: [PATCH 04/86] stabilize const_int_wrapping. --- src/libcore/lib.rs | 1 - src/libcore/num/mod.rs | 20 ++++++------- .../transform/qualify_min_const_fn.rs | 29 ++++++++++++++----- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 5ea765d3585a2..a613c1afd09ba 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -114,7 +114,6 @@ #![feature(const_str_as_bytes)] #![feature(const_str_len)] #![feature(const_int_rotate)] -#![feature(const_int_wrapping)] #![feature(const_int_sign)] #![feature(const_int_conversion)] #![feature(const_transmute)] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 97bf582df5a8c..58ea651aa83f2 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -994,7 +994,7 @@ assert_eq!(", stringify!($SelfT), "::max_value().wrapping_add(2), ", stringify!( $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_add(self, rhs: Self) -> Self { unsafe { @@ -1018,7 +1018,7 @@ stringify!($SelfT), "::max_value());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_sub(self, rhs: Self) -> Self { unsafe { @@ -1041,7 +1041,7 @@ assert_eq!(11i8.wrapping_mul(12), -124);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_mul(self, rhs: Self) -> Self { unsafe { @@ -1205,7 +1205,7 @@ assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(128), -1);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_shl(self, rhs: u32) -> Self { unsafe { @@ -1233,7 +1233,7 @@ assert_eq!((-128i16).wrapping_shr(64), -128);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_shr(self, rhs: u32) -> Self { unsafe { @@ -2884,7 +2884,7 @@ assert_eq!(200", stringify!($SelfT), ".wrapping_add(", stringify!($SelfT), "::ma $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_add(self, rhs: Self) -> Self { unsafe { @@ -2907,7 +2907,7 @@ assert_eq!(100", stringify!($SelfT), ".wrapping_sub(", stringify!($SelfT), "::ma $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_sub(self, rhs: Self) -> Self { unsafe { @@ -2931,7 +2931,7 @@ $EndFeature, " /// assert_eq!(25u8.wrapping_mul(12), 44); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_mul(self, rhs: Self) -> Self { unsafe { @@ -3081,7 +3081,7 @@ Basic usage: assert_eq!(1", stringify!($SelfT), ".wrapping_shl(128), 1);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_shl(self, rhs: u32) -> Self { unsafe { @@ -3111,7 +3111,7 @@ Basic usage: assert_eq!(128", stringify!($SelfT), ".wrapping_shr(128), 128);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_int_wrapping")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_shr(self, rhs: u32) -> Self { unsafe { diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index c1c5b18915aed..f271fbaa55b84 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -342,15 +342,11 @@ fn check_terminator( // some intrinsics are waved through if called inside the // standard library. Users never need to call them directly match tcx.fn_sig(def_id).abi() { - abi::Abi::RustIntrinsic => match &tcx.item_name(def_id).as_str()[..] { - | "size_of" - | "min_align_of" - | "needs_drop" - => {}, - _ => return Err(( + abi::Abi::RustIntrinsic => if !is_intrinsic_whitelisted(tcx, def_id) { + return Err(( span, "can only call a curated list of intrinsics in `min_const_fn`".into(), - )), + )) }, abi::Abi::Rust if tcx.is_min_const_fn(def_id) => {}, abi::Abi::Rust => return Err(( @@ -390,3 +386,22 @@ fn check_terminator( }, } } + +/// Returns true if the `def_id` refers to an intrisic which we've whitelisted. +/// +/// Adding more intrinsics requires sign-off from @rust-lang/lang. +fn is_intrinsic_whitelisted(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool { + match &tcx.item_name(def_id).as_str()[..] { + | "size_of" + | "min_align_of" + | "needs_drop" + // Arithmetic: + | "overflowing_add" // ~> wrapping_add + | "overflowing_sub" // ~> wrapping_sub + | "overflowing_mul" // ~> wrapping_mul + | "unchecked_shl" // ~> wrapping_shl + | "unchecked_shr" // ~> wrapping_shr + => true, + _ => false, + } +} From e258489eae1d5e0b8a624e1729fb64fbcb6e29ee Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 24 Dec 2018 19:24:48 +0100 Subject: [PATCH 05/86] stabilize const_int_rotate --- src/libcore/lib.rs | 2 +- src/libcore/num/mod.rs | 8 ++++---- src/librustc_mir/transform/qualify_min_const_fn.rs | 12 +++++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index a613c1afd09ba..dc4a5fbed7c9d 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -113,7 +113,7 @@ #![feature(const_slice_len)] #![feature(const_str_as_bytes)] #![feature(const_str_len)] -#![feature(const_int_rotate)] +#![cfg_attr(stage0, feature(const_int_rotate))] #![feature(const_int_sign)] #![feature(const_int_conversion)] #![feature(const_transmute)] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 58ea651aa83f2..6f32451299bbd 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -357,7 +357,7 @@ let m = ", $rot_result, "; assert_eq!(n.rotate_left(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_rotate")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_rotate"))] #[inline] pub const fn rotate_left(self, n: u32) -> Self { (self as $UnsignedT).rotate_left(n) as Self @@ -382,7 +382,7 @@ let m = ", $rot_op, "; assert_eq!(n.rotate_right(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_rotate")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_rotate"))] #[inline] pub const fn rotate_right(self, n: u32) -> Self { (self as $UnsignedT).rotate_right(n) as Self @@ -2310,7 +2310,7 @@ let m = ", $rot_result, "; assert_eq!(n.rotate_left(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_rotate")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_rotate"))] #[inline] pub const fn rotate_left(self, n: u32) -> Self { unsafe { intrinsics::rotate_left(self, n as $SelfT) } @@ -2335,7 +2335,7 @@ let m = ", $rot_op, "; assert_eq!(n.rotate_right(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_rotate")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_rotate"))] #[inline] pub const fn rotate_right(self, n: u32) -> Self { unsafe { intrinsics::rotate_right(self, n as $SelfT) } diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index f271fbaa55b84..43013129541f1 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -396,11 +396,13 @@ fn is_intrinsic_whitelisted(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool | "min_align_of" | "needs_drop" // Arithmetic: - | "overflowing_add" // ~> wrapping_add - | "overflowing_sub" // ~> wrapping_sub - | "overflowing_mul" // ~> wrapping_mul - | "unchecked_shl" // ~> wrapping_shl - | "unchecked_shr" // ~> wrapping_shr + | "overflowing_add" // ~> .wrapping_add + | "overflowing_sub" // ~> .wrapping_sub + | "overflowing_mul" // ~> .wrapping_mul + | "unchecked_shl" // ~> .wrapping_shl + | "unchecked_shr" // ~> .wrapping_shr + | "rotate_left" // ~> .rotate_left + | "rotate_right" // ~> .rotate_right => true, _ => false, } From eb0597ae830595a12de16172ec8fca7232f871fb Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 24 Dec 2018 19:35:50 +0100 Subject: [PATCH 06/86] stabilize const_int_sign --- src/libcore/lib.rs | 1 - src/libcore/num/mod.rs | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index dc4a5fbed7c9d..4b115a178d8be 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -114,7 +114,6 @@ #![feature(const_str_as_bytes)] #![feature(const_str_len)] #![cfg_attr(stage0, feature(const_int_rotate))] -#![feature(const_int_sign)] #![feature(const_int_conversion)] #![feature(const_transmute)] #![feature(reverse_bits)] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 6f32451299bbd..23db318800508 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -1886,7 +1886,6 @@ assert!(!(-10", stringify!($SelfT), ").is_positive());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_sign")] #[inline] pub const fn is_positive(self) -> bool { self > 0 } } @@ -1905,7 +1904,6 @@ assert!(!10", stringify!($SelfT), ".is_negative());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_sign")] #[inline] pub const fn is_negative(self) -> bool { self < 0 } } From d85ec4a9fccbdfefd1e246bd0f791716dac6aaca Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 24 Dec 2018 21:32:12 +0100 Subject: [PATCH 07/86] const stabilizations: adjust run-pass tests. --- src/test/run-pass/const-int-rotate.rs | 2 -- src/test/run-pass/const-int-sign.rs | 2 -- src/test/run-pass/const-int-wrapping.rs | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/test/run-pass/const-int-rotate.rs b/src/test/run-pass/const-int-rotate.rs index 68c77f27a3193..c014e97ef19b8 100644 --- a/src/test/run-pass/const-int-rotate.rs +++ b/src/test/run-pass/const-int-rotate.rs @@ -1,5 +1,3 @@ -#![feature(const_int_rotate)] - const LEFT: u32 = 0x10000b3u32.rotate_left(8); const RIGHT: u32 = 0xb301u32.rotate_right(8); diff --git a/src/test/run-pass/const-int-sign.rs b/src/test/run-pass/const-int-sign.rs index ae55c1a9b0e39..9d656a0203069 100644 --- a/src/test/run-pass/const-int-sign.rs +++ b/src/test/run-pass/const-int-sign.rs @@ -1,5 +1,3 @@ -#![feature(const_int_sign)] - const NEGATIVE_A: bool = (-10i32).is_negative(); const NEGATIVE_B: bool = 10i32.is_negative(); const POSITIVE_A: bool= (-10i32).is_positive(); diff --git a/src/test/run-pass/const-int-wrapping.rs b/src/test/run-pass/const-int-wrapping.rs index 504a654c0db65..5ab712015dfc3 100644 --- a/src/test/run-pass/const-int-wrapping.rs +++ b/src/test/run-pass/const-int-wrapping.rs @@ -1,5 +1,3 @@ -#![feature(const_int_wrapping)] - const ADD_A: u32 = 200u32.wrapping_add(55); const ADD_B: u32 = 200u32.wrapping_add(u32::max_value()); From 35d77fc1764d2e3e509ef5eeb4e00a6442321dc7 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 29 Dec 2018 12:56:14 +0100 Subject: [PATCH 08/86] unchecked_{shl,shr}: extend const tests. --- src/test/ui/consts/const-int-unchecked.rs | 117 ++++++- src/test/ui/consts/const-int-unchecked.stderr | 326 +++++++++++++++++- 2 files changed, 428 insertions(+), 15 deletions(-) diff --git a/src/test/ui/consts/const-int-unchecked.rs b/src/test/ui/consts/const-int-unchecked.rs index aeac6c37dcbab..8ee029b6cc390 100644 --- a/src/test/ui/consts/const-int-unchecked.rs +++ b/src/test/ui/consts/const-int-unchecked.rs @@ -2,10 +2,119 @@ use std::intrinsics; -const SHR: u8 = unsafe { intrinsics::unchecked_shr(5_u8, 8) }; +// The documentation of `unchecked_shl` states that it: +// +// Performs an unchecked left shift, resulting in undefined behavior when +// y < 0 or y >= N, where N is the width of T in bits. +// +// So we check this for a few `y`. + +// unsigned types: + +const SHL_U8: u8 = unsafe { intrinsics::unchecked_shl(5_u8, 8) }; +//~^ ERROR any use of this value will cause an error +const SHL_U16: u16 = unsafe { intrinsics::unchecked_shl(5_u16, 16) }; +//~^ ERROR any use of this value will cause an error +const SHL_U32: u32 = unsafe { intrinsics::unchecked_shl(5_u32, 32) }; +//~^ ERROR any use of this value will cause an error +const SHL_U64: u64 = unsafe { intrinsics::unchecked_shl(5_u64, 64) }; +//~^ ERROR any use of this value will cause an error +const SHL_U128: u128 = unsafe { intrinsics::unchecked_shl(5_u128, 128) }; +//~^ ERROR any use of this value will cause an error + +// signed types: + +const SHL_I8: i8 = unsafe { intrinsics::unchecked_shl(5_i8, 8) }; +//~^ ERROR any use of this value will cause an error +const SHL_I16: i16 = unsafe { intrinsics::unchecked_shl(5_16, 16) }; +//~^ ERROR any use of this value will cause an error +const SHL_I32: i32 = unsafe { intrinsics::unchecked_shl(5_i32, 32) }; +//~^ ERROR any use of this value will cause an error +const SHL_I64: i64 = unsafe { intrinsics::unchecked_shl(5_i64, 64) }; +//~^ ERROR any use of this value will cause an error +const SHL_I128: i128 = unsafe { intrinsics::unchecked_shl(5_i128, 128) }; +//~^ ERROR any use of this value will cause an error + +// and make sure we capture y < 0: + +const SHL_I8_NEG: i8 = unsafe { intrinsics::unchecked_shl(5_i8, -1) }; +//~^ ERROR any use of this value will cause an error +const SHL_I16_NEG: i16 = unsafe { intrinsics::unchecked_shl(5_16, -1) }; +//~^ ERROR any use of this value will cause an error +const SHL_I32_NEG: i32 = unsafe { intrinsics::unchecked_shl(5_i32, -1) }; +//~^ ERROR any use of this value will cause an error +const SHL_I64_NEG: i64 = unsafe { intrinsics::unchecked_shl(5_i64, -1) }; +//~^ ERROR any use of this value will cause an error +const SHL_I128_NEG: i128 = unsafe { intrinsics::unchecked_shl(5_i128, -1) }; +//~^ ERROR any use of this value will cause an error + +// and that there's no special relation to the value -1 by picking some +// negative values at random: + +const SHL_I8_NEG_RANDOM: i8 = unsafe { intrinsics::unchecked_shl(5_i8, -6) }; +//~^ ERROR any use of this value will cause an error +const SHL_I16_NEG_RANDOM: i16 = unsafe { intrinsics::unchecked_shl(5_16, -13) }; +//~^ ERROR any use of this value will cause an error +const SHL_I32_NEG_RANDOM: i32 = unsafe { intrinsics::unchecked_shl(5_i32, -25) }; +//~^ ERROR any use of this value will cause an error +const SHL_I64_NEG_RANDOM: i64 = unsafe { intrinsics::unchecked_shl(5_i64, -30) }; +//~^ ERROR any use of this value will cause an error +const SHL_I128_NEG_RANDOM: i128 = unsafe { intrinsics::unchecked_shl(5_i128, -93) }; +//~^ ERROR any use of this value will cause an error + +// Repeat it all over for `unchecked_shr` + +// unsigned types: + +const SHR_U8: u8 = unsafe { intrinsics::unchecked_shr(5_u8, 8) }; +//~^ ERROR any use of this value will cause an error +const SHR_U16: u16 = unsafe { intrinsics::unchecked_shr(5_u16, 16) }; +//~^ ERROR any use of this value will cause an error +const SHR_U32: u32 = unsafe { intrinsics::unchecked_shr(5_u32, 32) }; +//~^ ERROR any use of this value will cause an error +const SHR_U64: u64 = unsafe { intrinsics::unchecked_shr(5_u64, 64) }; +//~^ ERROR any use of this value will cause an error +const SHR_U128: u128 = unsafe { intrinsics::unchecked_shr(5_u128, 128) }; +//~^ ERROR any use of this value will cause an error + +// signed types: + +const SHR_I8: i8 = unsafe { intrinsics::unchecked_shr(5_i8, 8) }; +//~^ ERROR any use of this value will cause an error +const SHR_I16: i16 = unsafe { intrinsics::unchecked_shr(5_16, 16) }; +//~^ ERROR any use of this value will cause an error +const SHR_I32: i32 = unsafe { intrinsics::unchecked_shr(5_i32, 32) }; +//~^ ERROR any use of this value will cause an error +const SHR_I64: i64 = unsafe { intrinsics::unchecked_shr(5_i64, 64) }; +//~^ ERROR any use of this value will cause an error +const SHR_I128: i128 = unsafe { intrinsics::unchecked_shr(5_i128, 128) }; +//~^ ERROR any use of this value will cause an error + +// and make sure we capture y < 0: + +const SHR_I8_NEG: i8 = unsafe { intrinsics::unchecked_shr(5_i8, -1) }; +//~^ ERROR any use of this value will cause an error +const SHR_I16_NEG: i16 = unsafe { intrinsics::unchecked_shr(5_16, -1) }; +//~^ ERROR any use of this value will cause an error +const SHR_I32_NEG: i32 = unsafe { intrinsics::unchecked_shr(5_i32, -1) }; +//~^ ERROR any use of this value will cause an error +const SHR_I64_NEG: i64 = unsafe { intrinsics::unchecked_shr(5_i64, -1) }; +//~^ ERROR any use of this value will cause an error +const SHR_I128_NEG: i128 = unsafe { intrinsics::unchecked_shr(5_i128, -1) }; +//~^ ERROR any use of this value will cause an error + +// and that there's no special relation to the value -1 by picking some +// negative values at random: + +const SHR_I8_NEG_RANDOM: i8 = unsafe { intrinsics::unchecked_shr(5_i8, -6) }; +//~^ ERROR any use of this value will cause an error +const SHR_I16_NEG_RANDOM: i16 = unsafe { intrinsics::unchecked_shr(5_16, -13) }; +//~^ ERROR any use of this value will cause an error +const SHR_I32_NEG_RANDOM: i32 = unsafe { intrinsics::unchecked_shr(5_i32, -25) }; +//~^ ERROR any use of this value will cause an error +const SHR_I64_NEG_RANDOM: i64 = unsafe { intrinsics::unchecked_shr(5_i64, -30) }; //~^ ERROR any use of this value will cause an error -const SHL: u8 = unsafe { intrinsics::unchecked_shl(5_u8, 8) }; +const SHR_I128_NEG_RANDOM: i128 = unsafe { intrinsics::unchecked_shr(5_i128, -93) }; //~^ ERROR any use of this value will cause an error -fn main() { -} +fn main() {} diff --git a/src/test/ui/consts/const-int-unchecked.stderr b/src/test/ui/consts/const-int-unchecked.stderr index dd28cc4d533e9..4382d9174b757 100644 --- a/src/test/ui/consts/const-int-unchecked.stderr +++ b/src/test/ui/consts/const-int-unchecked.stderr @@ -1,20 +1,324 @@ error: any use of this value will cause an error - --> $DIR/const-int-unchecked.rs:5:1 + --> $DIR/const-int-unchecked.rs:14:1 | -LL | const SHR: u8 = unsafe { intrinsics::unchecked_shr(5_u8, 8) }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^----------------------------------^^^ - | | - | Overflowing shift by 8 in unchecked_shr +LL | const SHL_U8: u8 = unsafe { intrinsics::unchecked_shl(5_u8, 8) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------------------------^^^ + | | + | Overflowing shift by 8 in unchecked_shl | = note: #[deny(const_err)] on by default error: any use of this value will cause an error - --> $DIR/const-int-unchecked.rs:7:1 + --> $DIR/const-int-unchecked.rs:16:1 | -LL | const SHL: u8 = unsafe { intrinsics::unchecked_shl(5_u8, 8) }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^----------------------------------^^^ - | | - | Overflowing shift by 8 in unchecked_shl +LL | const SHL_U16: u16 = unsafe { intrinsics::unchecked_shl(5_u16, 16) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 16 in unchecked_shl -error: aborting due to 2 previous errors +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:18:1 + | +LL | const SHL_U32: u32 = unsafe { intrinsics::unchecked_shl(5_u32, 32) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 32 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:20:1 + | +LL | const SHL_U64: u64 = unsafe { intrinsics::unchecked_shl(5_u64, 64) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 64 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:22:1 + | +LL | const SHL_U128: u128 = unsafe { intrinsics::unchecked_shl(5_u128, 128) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------^^^ + | | + | Overflowing shift by 128 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:27:1 + | +LL | const SHL_I8: i8 = unsafe { intrinsics::unchecked_shl(5_i8, 8) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------------------------^^^ + | | + | Overflowing shift by 8 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:29:1 + | +LL | const SHL_I16: i16 = unsafe { intrinsics::unchecked_shl(5_16, 16) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 16 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:31:1 + | +LL | const SHL_I32: i32 = unsafe { intrinsics::unchecked_shl(5_i32, 32) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 32 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:33:1 + | +LL | const SHL_I64: i64 = unsafe { intrinsics::unchecked_shl(5_i64, 64) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 64 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:35:1 + | +LL | const SHL_I128: i128 = unsafe { intrinsics::unchecked_shl(5_i128, 128) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------^^^ + | | + | Overflowing shift by 128 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:40:1 + | +LL | const SHL_I8_NEG: i8 = unsafe { intrinsics::unchecked_shl(5_i8, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 255 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:42:1 + | +LL | const SHL_I16_NEG: i16 = unsafe { intrinsics::unchecked_shl(5_16, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 65535 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:44:1 + | +LL | const SHL_I32_NEG: i32 = unsafe { intrinsics::unchecked_shl(5_i32, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 4294967295 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:46:1 + | +LL | const SHL_I64_NEG: i64 = unsafe { intrinsics::unchecked_shl(5_i64, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 18446744073709551615 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:48:1 + | +LL | const SHL_I128_NEG: i128 = unsafe { intrinsics::unchecked_shl(5_i128, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------------------------------------^^^ + | | + | Overflowing shift by 340282366920938463463374607431768211455 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:54:1 + | +LL | const SHL_I8_NEG_RANDOM: i8 = unsafe { intrinsics::unchecked_shl(5_i8, -6) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 250 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:56:1 + | +LL | const SHL_I16_NEG_RANDOM: i16 = unsafe { intrinsics::unchecked_shl(5_16, -13) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 65523 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:58:1 + | +LL | const SHL_I32_NEG_RANDOM: i32 = unsafe { intrinsics::unchecked_shl(5_i32, -25) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------------------------------------^^^ + | | + | Overflowing shift by 4294967271 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:60:1 + | +LL | const SHL_I64_NEG_RANDOM: i64 = unsafe { intrinsics::unchecked_shl(5_i64, -30) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------------------------------------^^^ + | | + | Overflowing shift by 18446744073709551586 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:62:1 + | +LL | const SHL_I128_NEG_RANDOM: i128 = unsafe { intrinsics::unchecked_shl(5_i128, -93) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------^^^ + | | + | Overflowing shift by 340282366920938463463374607431768211363 in unchecked_shl + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:69:1 + | +LL | const SHR_U8: u8 = unsafe { intrinsics::unchecked_shr(5_u8, 8) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------------------------^^^ + | | + | Overflowing shift by 8 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:71:1 + | +LL | const SHR_U16: u16 = unsafe { intrinsics::unchecked_shr(5_u16, 16) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 16 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:73:1 + | +LL | const SHR_U32: u32 = unsafe { intrinsics::unchecked_shr(5_u32, 32) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 32 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:75:1 + | +LL | const SHR_U64: u64 = unsafe { intrinsics::unchecked_shr(5_u64, 64) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 64 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:77:1 + | +LL | const SHR_U128: u128 = unsafe { intrinsics::unchecked_shr(5_u128, 128) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------^^^ + | | + | Overflowing shift by 128 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:82:1 + | +LL | const SHR_I8: i8 = unsafe { intrinsics::unchecked_shr(5_i8, 8) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------------------------^^^ + | | + | Overflowing shift by 8 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:84:1 + | +LL | const SHR_I16: i16 = unsafe { intrinsics::unchecked_shr(5_16, 16) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 16 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:86:1 + | +LL | const SHR_I32: i32 = unsafe { intrinsics::unchecked_shr(5_i32, 32) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 32 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:88:1 + | +LL | const SHR_I64: i64 = unsafe { intrinsics::unchecked_shr(5_i64, 64) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 64 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:90:1 + | +LL | const SHR_I128: i128 = unsafe { intrinsics::unchecked_shr(5_i128, 128) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------^^^ + | | + | Overflowing shift by 128 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:95:1 + | +LL | const SHR_I8_NEG: i8 = unsafe { intrinsics::unchecked_shr(5_i8, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 255 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:97:1 + | +LL | const SHR_I16_NEG: i16 = unsafe { intrinsics::unchecked_shr(5_16, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 65535 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:99:1 + | +LL | const SHR_I32_NEG: i32 = unsafe { intrinsics::unchecked_shr(5_i32, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 4294967295 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:101:1 + | +LL | const SHR_I64_NEG: i64 = unsafe { intrinsics::unchecked_shr(5_i64, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 18446744073709551615 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:103:1 + | +LL | const SHR_I128_NEG: i128 = unsafe { intrinsics::unchecked_shr(5_i128, -1) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------------------------------------^^^ + | | + | Overflowing shift by 340282366920938463463374607431768211455 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:109:1 + | +LL | const SHR_I8_NEG_RANDOM: i8 = unsafe { intrinsics::unchecked_shr(5_i8, -6) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------^^^ + | | + | Overflowing shift by 250 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:111:1 + | +LL | const SHR_I16_NEG_RANDOM: i16 = unsafe { intrinsics::unchecked_shr(5_16, -13) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^ + | | + | Overflowing shift by 65523 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:113:1 + | +LL | const SHR_I32_NEG_RANDOM: i32 = unsafe { intrinsics::unchecked_shr(5_i32, -25) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------------------------------------^^^ + | | + | Overflowing shift by 4294967271 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:115:1 + | +LL | const SHR_I64_NEG_RANDOM: i64 = unsafe { intrinsics::unchecked_shr(5_i64, -30) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------------------------------------^^^ + | | + | Overflowing shift by 18446744073709551586 in unchecked_shr + +error: any use of this value will cause an error + --> $DIR/const-int-unchecked.rs:117:1 + | +LL | const SHR_I128_NEG_RANDOM: i128 = unsafe { intrinsics::unchecked_shr(5_i128, -93) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------^^^ + | | + | Overflowing shift by 340282366920938463463374607431768211363 in unchecked_shr + +error: aborting due to 40 previous errors From e4c47f9c608c4b12f0c4e4a006b769420b066dcb Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 29 Dec 2018 12:58:17 +0100 Subject: [PATCH 09/86] qualify_min_const_fn: improve note. --- src/librustc_mir/transform/qualify_min_const_fn.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index 43013129541f1..431accf6110ad 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -387,7 +387,8 @@ fn check_terminator( } } -/// Returns true if the `def_id` refers to an intrisic which we've whitelisted. +/// Returns true if the `def_id` refers to an intrisic which we've whitelisted +/// for being called from stable `const fn`s (`min_const_fn`). /// /// Adding more intrinsics requires sign-off from @rust-lang/lang. fn is_intrinsic_whitelisted(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool { From fedfb61f266cf1a5e8339552745a74edbe22f428 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 31 Dec 2018 04:11:17 +0100 Subject: [PATCH 10/86] make some intrinsics safe. --- src/librustc_typeck/check/intrinsic.rs | 16 ++++++++++++---- src/librustc_typeck/check/mod.rs | 2 +- src/librustc_typeck/collect.rs | 6 ++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/librustc_typeck/check/intrinsic.rs b/src/librustc_typeck/check/intrinsic.rs index a36b21921436e..f2d69eb7f7456 100644 --- a/src/librustc_typeck/check/intrinsic.rs +++ b/src/librustc_typeck/check/intrinsic.rs @@ -66,6 +66,17 @@ fn equate_intrinsic_type<'a, 'tcx>( require_same_types(tcx, &cause, tcx.mk_fn_ptr(tcx.fn_sig(def_id)), fty); } +/// Returns whether the given intrinsic is unsafe to call or not. +pub fn intrisic_operation_unsafety(intrinsic: &str) -> hir::Unsafety { + match intrinsic { + "size_of" | "min_align_of" | "needs_drop" | + "overflowing_add" | "overflowing_sub" | "overflowing_mul" | + "rotate_left" | "rotate_right" + => hir::Unsafety::Normal, + _ => hir::Unsafety::Unsafe, + } +} + /// Remember to add all intrinsics here, in librustc_codegen_llvm/intrinsic.rs, /// and in libcore/intrinsics.rs pub fn check_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, @@ -117,10 +128,7 @@ pub fn check_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, } else if &name[..] == "abort" || &name[..] == "unreachable" { (0, Vec::new(), tcx.types.never, hir::Unsafety::Unsafe) } else { - let unsafety = match &name[..] { - "size_of" | "min_align_of" | "needs_drop" => hir::Unsafety::Normal, - _ => hir::Unsafety::Unsafe, - }; + let unsafety = intrisic_operation_unsafety(&name[..]); let (n_tps, inputs, output) = match &name[..] { "breakpoint" => (0, Vec::new(), tcx.mk_unit()), "size_of" | diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 39beb2832851b..30019feb960aa 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -80,7 +80,7 @@ mod closure; mod callee; mod compare_method; mod generator_interior; -mod intrinsic; +pub mod intrinsic; mod op; use astconv::{AstConv, PathSeg}; diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 9fc2f11b19738..5d6fe3f384535 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -16,6 +16,7 @@ use astconv::{AstConv, Bounds}; use constrained_type_params as ctp; +use check::intrinsic::intrisic_operation_unsafety; use lint; use middle::lang_items::SizedTraitLangItem; use middle::resolve_lifetime as rl; @@ -2076,10 +2077,7 @@ fn compute_sig_of_foreign_fn_decl<'a, 'tcx>( abi: abi::Abi, ) -> ty::PolyFnSig<'tcx> { let unsafety = if abi == abi::Abi::RustIntrinsic { - match &*tcx.item_name(def_id).as_str() { - "size_of" | "min_align_of" | "needs_drop" => hir::Unsafety::Normal, - _ => hir::Unsafety::Unsafe, - } + intrisic_operation_unsafety(&*tcx.item_name(def_id).as_str()) } else { hir::Unsafety::Unsafe }; From 50152d24ca09e80e8bf9314b3b7864d3bdfb9a16 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 31 Dec 2018 04:11:46 +0100 Subject: [PATCH 11/86] now that some intrisics are safe, use that fact. --- src/libcore/num/mod.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 23db318800508..7f087532e8b3b 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -997,9 +997,12 @@ $EndFeature, " #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_add(self, rhs: Self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::overflowing_add(self, rhs) } + #[cfg(not(stage0))] + intrinsics::overflowing_add(self, rhs) } } @@ -1021,9 +1024,12 @@ $EndFeature, " #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_sub(self, rhs: Self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::overflowing_sub(self, rhs) } + #[cfg(not(stage0))] + intrinsics::overflowing_sub(self, rhs) } } @@ -1044,9 +1050,12 @@ $EndFeature, " #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_mul(self, rhs: Self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::overflowing_mul(self, rhs) } + #[cfg(not(stage0))] + intrinsics::overflowing_mul(self, rhs) } } @@ -2311,7 +2320,10 @@ assert_eq!(n.rotate_left(", $rot, "), m); #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_rotate"))] #[inline] pub const fn rotate_left(self, n: u32) -> Self { + #[cfg(stage0)] unsafe { intrinsics::rotate_left(self, n as $SelfT) } + #[cfg(not(stage0))] + intrinsics::rotate_left(self, n as $SelfT) } } @@ -2336,7 +2348,10 @@ assert_eq!(n.rotate_right(", $rot, "), m); #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_rotate"))] #[inline] pub const fn rotate_right(self, n: u32) -> Self { + #[cfg(stage0)] unsafe { intrinsics::rotate_right(self, n as $SelfT) } + #[cfg(not(stage0))] + intrinsics::rotate_right(self, n as $SelfT) } } @@ -2885,9 +2900,12 @@ $EndFeature, " #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_add(self, rhs: Self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::overflowing_add(self, rhs) } + #[cfg(not(stage0))] + intrinsics::overflowing_add(self, rhs) } } @@ -2908,9 +2926,12 @@ $EndFeature, " #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_sub(self, rhs: Self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::overflowing_sub(self, rhs) } + #[cfg(not(stage0))] + intrinsics::overflowing_sub(self, rhs) } } @@ -2932,9 +2953,12 @@ $EndFeature, " #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_wrapping"))] #[inline] pub const fn wrapping_mul(self, rhs: Self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::overflowing_mul(self, rhs) } + #[cfg(not(stage0))] + intrinsics::overflowing_mul(self, rhs) } doc_comment! { From 2760f87e3a8433c90a9402418f6f802ca5821d4d Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 31 Dec 2018 16:11:03 +0100 Subject: [PATCH 12/86] const-stabilize const_int_ops + reverse_bits --- src/libcore/intrinsics.rs | 8 +- src/libcore/lib.rs | 2 +- src/libcore/num/mod.rs | 57 +++-- .../transform/qualify_min_const_fn.rs | 5 + src/librustc_typeck/check/intrinsic.rs | 3 +- src/libstd/lib.rs | 2 +- src/test/run-pass/const-int-conversion.rs | 3 +- src/test/run-pass/consts/const-endianess.rs | 2 - src/test/run-pass/ctfe/bswap-const.rs | 6 +- .../run-pass/intrinsics/intrinsics-integer.rs | 216 +++++++++--------- .../ui/bad/bad-intrinsic-monomorphization.rs | 2 +- 11 files changed, 163 insertions(+), 143 deletions(-) diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs index 7508257f7806f..40df2db065dfd 100644 --- a/src/libcore/intrinsics.rs +++ b/src/libcore/intrinsics.rs @@ -1343,7 +1343,7 @@ extern "rust-intrinsic" { /// use std::intrinsics::ctlz; /// /// let x = 0b0001_1100_u8; - /// let num_leading = unsafe { ctlz(x) }; + /// let num_leading = ctlz(x); /// assert_eq!(num_leading, 3); /// ``` /// @@ -1355,7 +1355,7 @@ extern "rust-intrinsic" { /// use std::intrinsics::ctlz; /// /// let x = 0u16; - /// let num_leading = unsafe { ctlz(x) }; + /// let num_leading = ctlz(x); /// assert_eq!(num_leading, 16); /// ``` pub fn ctlz(x: T) -> T; @@ -1386,7 +1386,7 @@ extern "rust-intrinsic" { /// use std::intrinsics::cttz; /// /// let x = 0b0011_1000_u8; - /// let num_trailing = unsafe { cttz(x) }; + /// let num_trailing = cttz(x); /// assert_eq!(num_trailing, 3); /// ``` /// @@ -1398,7 +1398,7 @@ extern "rust-intrinsic" { /// use std::intrinsics::cttz; /// /// let x = 0u16; - /// let num_trailing = unsafe { cttz(x) }; + /// let num_trailing = cttz(x); /// assert_eq!(num_trailing, 16); /// ``` pub fn cttz(x: T) -> T; diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 4b115a178d8be..49cc5b6c06f41 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -71,7 +71,7 @@ #![feature(cfg_target_has_atomic)] #![feature(concat_idents)] #![feature(const_fn)] -#![feature(const_int_ops)] +#![cfg_attr(stage0, feature(const_int_ops))] #![feature(const_fn_union)] #![feature(custom_attribute)] #![feature(doc_cfg)] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 7f087532e8b3b..7ff04410516a3 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -275,7 +275,7 @@ $EndFeature, " ``` "), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn count_ones(self) -> u32 { (self as $UnsignedT).count_ones() } } @@ -291,7 +291,7 @@ Basic usage: ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 1);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn count_zeros(self) -> u32 { (!self).count_ones() @@ -312,7 +312,7 @@ assert_eq!(n.leading_zeros(), 0);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn leading_zeros(self) -> u32 { (self as $UnsignedT).leading_zeros() @@ -333,7 +333,7 @@ assert_eq!(n.trailing_zeros(), 2);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn trailing_zeros(self) -> u32 { (self as $UnsignedT).trailing_zeros() @@ -404,7 +404,7 @@ let m = n.swap_bytes(); assert_eq!(m, ", $swapped, "); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn swap_bytes(self) -> Self { (self as $UnsignedT).swap_bytes() as Self @@ -454,7 +454,7 @@ if cfg!(target_endian = \"big\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn from_be(x: Self) -> Self { #[cfg(target_endian = "big")] @@ -488,7 +488,7 @@ if cfg!(target_endian = \"little\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn from_le(x: Self) -> Self { #[cfg(target_endian = "little")] @@ -522,7 +522,7 @@ if cfg!(target_endian = \"big\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn to_be(self) -> Self { // or not to be? #[cfg(target_endian = "big")] @@ -556,7 +556,7 @@ if cfg!(target_endian = \"little\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn to_le(self) -> Self { #[cfg(target_endian = "little")] @@ -2234,10 +2234,13 @@ Basic usage: assert_eq!(n.count_ones(), 3);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn count_ones(self) -> u32 { + #[cfg(stage0)] unsafe { intrinsics::ctpop(self as $ActualT) as u32 } + #[cfg(not(stage0))] + { intrinsics::ctpop(self as $ActualT) as u32 } } } @@ -2252,7 +2255,7 @@ Basic usage: ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 0);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn count_zeros(self) -> u32 { (!self).count_ones() @@ -2272,10 +2275,13 @@ Basic usage: assert_eq!(n.leading_zeros(), 2);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn leading_zeros(self) -> u32 { + #[cfg(stage0)] unsafe { intrinsics::ctlz(self as $ActualT) as u32 } + #[cfg(not(stage0))] + { intrinsics::ctlz(self as $ActualT) as u32 } } } @@ -2293,10 +2299,13 @@ Basic usage: assert_eq!(n.trailing_zeros(), 3);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn trailing_zeros(self) -> u32 { + #[cfg(stage0)] unsafe { intrinsics::cttz(self) as u32 } + #[cfg(not(stage0))] + { intrinsics::cttz(self) as u32 } } } @@ -2370,10 +2379,13 @@ let m = n.swap_bytes(); assert_eq!(m, ", $swapped, "); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn swap_bytes(self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::bswap(self as $ActualT) as Self } + #[cfg(not(stage0))] + { intrinsics::bswap(self as $ActualT) as Self } } } @@ -2393,10 +2405,13 @@ let m = n.reverse_bits(); assert_eq!(m, ", $reversed, "); ```"), #[unstable(feature = "reverse_bits", issue = "48763")] - #[rustc_const_unstable(feature = "const_int_conversion")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_conversion"))] #[inline] pub const fn reverse_bits(self) -> Self { + #[cfg(stage0)] unsafe { intrinsics::bitreverse(self as $ActualT) as Self } + #[cfg(not(stage0))] + { intrinsics::bitreverse(self as $ActualT) as Self } } } @@ -2420,7 +2435,7 @@ if cfg!(target_endian = \"big\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn from_be(x: Self) -> Self { #[cfg(target_endian = "big")] @@ -2454,7 +2469,7 @@ if cfg!(target_endian = \"little\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn from_le(x: Self) -> Self { #[cfg(target_endian = "little")] @@ -2488,7 +2503,7 @@ if cfg!(target_endian = \"big\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn to_be(self) -> Self { // or not to be? #[cfg(target_endian = "big")] @@ -2522,7 +2537,7 @@ if cfg!(target_endian = \"little\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_ops")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_int_ops"))] #[inline] pub const fn to_le(self) -> Self { #[cfg(target_endian = "little")] @@ -2957,8 +2972,8 @@ $EndFeature, " unsafe { intrinsics::overflowing_mul(self, rhs) } - #[cfg(not(stage0))] - intrinsics::overflowing_mul(self, rhs) + #[cfg(not(stage0))] + intrinsics::overflowing_mul(self, rhs) } doc_comment! { diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index 431accf6110ad..33f309c995702 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -404,6 +404,11 @@ fn is_intrinsic_whitelisted(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool | "unchecked_shr" // ~> .wrapping_shr | "rotate_left" // ~> .rotate_left | "rotate_right" // ~> .rotate_right + | "ctpop" // ~> .count_ones + | "ctlz" // ~> .leading_zeros + | "cttz" // ~> .trailing_zeros + | "bswap" // ~> .swap_bytes + | "bitreverse" // ~> .reverse_bits => true, _ => false, } diff --git a/src/librustc_typeck/check/intrinsic.rs b/src/librustc_typeck/check/intrinsic.rs index f2d69eb7f7456..dffe215b02ade 100644 --- a/src/librustc_typeck/check/intrinsic.rs +++ b/src/librustc_typeck/check/intrinsic.rs @@ -71,7 +71,8 @@ pub fn intrisic_operation_unsafety(intrinsic: &str) -> hir::Unsafety { match intrinsic { "size_of" | "min_align_of" | "needs_drop" | "overflowing_add" | "overflowing_sub" | "overflowing_mul" | - "rotate_left" | "rotate_right" + "rotate_left" | "rotate_right" | + "ctpop" | "ctlz" | "cttz" | "bswap" | "bitreverse" => hir::Unsafety::Normal, _ => hir::Unsafety::Unsafe, } diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 6ded43dfed1f4..82cee70232aa7 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -242,7 +242,7 @@ #![feature(char_error_internals)] #![feature(compiler_builtins_lib)] #![feature(concat_idents)] -#![feature(const_int_ops)] +#![cfg_attr(stage0, feature(const_int_ops))] #![feature(const_ip)] #![feature(const_raw_ptr_deref)] #![feature(const_cstr_unchecked)] diff --git a/src/test/run-pass/const-int-conversion.rs b/src/test/run-pass/const-int-conversion.rs index 2b4904cc6c39a..19d65860179b2 100644 --- a/src/test/run-pass/const-int-conversion.rs +++ b/src/test/run-pass/const-int-conversion.rs @@ -1,4 +1,4 @@ -#![feature(const_int_conversion, const_int_ops, reverse_bits)] +#![feature(const_int_conversion, reverse_bits)] const REVERSE: u32 = 0x12345678_u32.reverse_bits(); const FROM_BE_BYTES: i32 = i32::from_be_bytes([0x12, 0x34, 0x56, 0x78]); @@ -21,4 +21,3 @@ fn main() { assert_eq!(TO_LE_BYTES, ident([0x78, 0x56, 0x34, 0x12])); assert_eq!(TO_NE_BYTES, ident([0x80, 0, 0, 0])); } - diff --git a/src/test/run-pass/consts/const-endianess.rs b/src/test/run-pass/consts/const-endianess.rs index dfc6678ba289d..cbe6d864c9c3a 100644 --- a/src/test/run-pass/consts/const-endianess.rs +++ b/src/test/run-pass/consts/const-endianess.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(const_int_ops)] #![feature(test)] extern crate test; @@ -8,7 +7,6 @@ use test::black_box as b; const BE_U32: u32 = 55u32.to_be(); const LE_U32: u32 = 55u32.to_le(); - fn main() { assert_eq!(BE_U32, b(55u32).to_be()); assert_eq!(LE_U32, b(55u32).to_le()); diff --git a/src/test/run-pass/ctfe/bswap-const.rs b/src/test/run-pass/ctfe/bswap-const.rs index 90e97c8edbdd5..3145c21acc988 100644 --- a/src/test/run-pass/ctfe/bswap-const.rs +++ b/src/test/run-pass/ctfe/bswap-const.rs @@ -4,9 +4,9 @@ use std::intrinsics; -const SWAPPED_U8: u8 = unsafe { intrinsics::bswap(0x12_u8) }; -const SWAPPED_U16: u16 = unsafe { intrinsics::bswap(0x12_34_u16) }; -const SWAPPED_I32: i32 = unsafe { intrinsics::bswap(0x12_34_56_78_i32) }; +const SWAPPED_U8: u8 = intrinsics::bswap(0x12_u8); +const SWAPPED_U16: u16 = intrinsics::bswap(0x12_34_u16); +const SWAPPED_I32: i32 = intrinsics::bswap(0x12_34_56_78_i32); fn main() { assert_eq!(SWAPPED_U8, 0x12); diff --git a/src/test/run-pass/intrinsics/intrinsics-integer.rs b/src/test/run-pass/intrinsics/intrinsics-integer.rs index 66e07f8683a87..0154f04995029 100644 --- a/src/test/run-pass/intrinsics/intrinsics-integer.rs +++ b/src/test/run-pass/intrinsics/intrinsics-integer.rs @@ -16,63 +16,63 @@ mod rusti { } pub fn main() { - unsafe { - use rusti::*; - - assert_eq!(ctpop(0u8), 0); assert_eq!(ctpop(0i8), 0); - assert_eq!(ctpop(0u16), 0); assert_eq!(ctpop(0i16), 0); - assert_eq!(ctpop(0u32), 0); assert_eq!(ctpop(0i32), 0); - assert_eq!(ctpop(0u64), 0); assert_eq!(ctpop(0i64), 0); - assert_eq!(ctpop(0u128), 0); assert_eq!(ctpop(0i128), 0); - - assert_eq!(ctpop(1u8), 1); assert_eq!(ctpop(1i8), 1); - assert_eq!(ctpop(1u16), 1); assert_eq!(ctpop(1i16), 1); - assert_eq!(ctpop(1u32), 1); assert_eq!(ctpop(1i32), 1); - assert_eq!(ctpop(1u64), 1); assert_eq!(ctpop(1i64), 1); - assert_eq!(ctpop(1u128), 1); assert_eq!(ctpop(1i128), 1); - - assert_eq!(ctpop(10u8), 2); assert_eq!(ctpop(10i8), 2); - assert_eq!(ctpop(10u16), 2); assert_eq!(ctpop(10i16), 2); - assert_eq!(ctpop(10u32), 2); assert_eq!(ctpop(10i32), 2); - assert_eq!(ctpop(10u64), 2); assert_eq!(ctpop(10i64), 2); - assert_eq!(ctpop(10u128), 2); assert_eq!(ctpop(10i128), 2); - - assert_eq!(ctpop(100u8), 3); assert_eq!(ctpop(100i8), 3); - assert_eq!(ctpop(100u16), 3); assert_eq!(ctpop(100i16), 3); - assert_eq!(ctpop(100u32), 3); assert_eq!(ctpop(100i32), 3); - assert_eq!(ctpop(100u64), 3); assert_eq!(ctpop(100i64), 3); - assert_eq!(ctpop(100u128), 3); assert_eq!(ctpop(100i128), 3); - - assert_eq!(ctpop(-1i8 as u8), 8); assert_eq!(ctpop(-1i8), 8); - assert_eq!(ctpop(-1i16 as u16), 16); assert_eq!(ctpop(-1i16), 16); - assert_eq!(ctpop(-1i32 as u32), 32); assert_eq!(ctpop(-1i32), 32); - assert_eq!(ctpop(-1i64 as u64), 64); assert_eq!(ctpop(-1i64), 64); - assert_eq!(ctpop(-1i128 as u128), 128); assert_eq!(ctpop(-1i128), 128); - - assert_eq!(ctlz(0u8), 8); assert_eq!(ctlz(0i8), 8); - assert_eq!(ctlz(0u16), 16); assert_eq!(ctlz(0i16), 16); - assert_eq!(ctlz(0u32), 32); assert_eq!(ctlz(0i32), 32); - assert_eq!(ctlz(0u64), 64); assert_eq!(ctlz(0i64), 64); - assert_eq!(ctlz(0u128), 128); assert_eq!(ctlz(0i128), 128); - - assert_eq!(ctlz(1u8), 7); assert_eq!(ctlz(1i8), 7); - assert_eq!(ctlz(1u16), 15); assert_eq!(ctlz(1i16), 15); - assert_eq!(ctlz(1u32), 31); assert_eq!(ctlz(1i32), 31); - assert_eq!(ctlz(1u64), 63); assert_eq!(ctlz(1i64), 63); - assert_eq!(ctlz(1u128), 127); assert_eq!(ctlz(1i128), 127); - - assert_eq!(ctlz(10u8), 4); assert_eq!(ctlz(10i8), 4); - assert_eq!(ctlz(10u16), 12); assert_eq!(ctlz(10i16), 12); - assert_eq!(ctlz(10u32), 28); assert_eq!(ctlz(10i32), 28); - assert_eq!(ctlz(10u64), 60); assert_eq!(ctlz(10i64), 60); - assert_eq!(ctlz(10u128), 124); assert_eq!(ctlz(10i128), 124); - - assert_eq!(ctlz(100u8), 1); assert_eq!(ctlz(100i8), 1); - assert_eq!(ctlz(100u16), 9); assert_eq!(ctlz(100i16), 9); - assert_eq!(ctlz(100u32), 25); assert_eq!(ctlz(100i32), 25); - assert_eq!(ctlz(100u64), 57); assert_eq!(ctlz(100i64), 57); - assert_eq!(ctlz(100u128), 121); assert_eq!(ctlz(100i128), 121); + use rusti::*; + + assert_eq!(ctpop(0u8), 0); assert_eq!(ctpop(0i8), 0); + assert_eq!(ctpop(0u16), 0); assert_eq!(ctpop(0i16), 0); + assert_eq!(ctpop(0u32), 0); assert_eq!(ctpop(0i32), 0); + assert_eq!(ctpop(0u64), 0); assert_eq!(ctpop(0i64), 0); + assert_eq!(ctpop(0u128), 0); assert_eq!(ctpop(0i128), 0); + + assert_eq!(ctpop(1u8), 1); assert_eq!(ctpop(1i8), 1); + assert_eq!(ctpop(1u16), 1); assert_eq!(ctpop(1i16), 1); + assert_eq!(ctpop(1u32), 1); assert_eq!(ctpop(1i32), 1); + assert_eq!(ctpop(1u64), 1); assert_eq!(ctpop(1i64), 1); + assert_eq!(ctpop(1u128), 1); assert_eq!(ctpop(1i128), 1); + + assert_eq!(ctpop(10u8), 2); assert_eq!(ctpop(10i8), 2); + assert_eq!(ctpop(10u16), 2); assert_eq!(ctpop(10i16), 2); + assert_eq!(ctpop(10u32), 2); assert_eq!(ctpop(10i32), 2); + assert_eq!(ctpop(10u64), 2); assert_eq!(ctpop(10i64), 2); + assert_eq!(ctpop(10u128), 2); assert_eq!(ctpop(10i128), 2); + + assert_eq!(ctpop(100u8), 3); assert_eq!(ctpop(100i8), 3); + assert_eq!(ctpop(100u16), 3); assert_eq!(ctpop(100i16), 3); + assert_eq!(ctpop(100u32), 3); assert_eq!(ctpop(100i32), 3); + assert_eq!(ctpop(100u64), 3); assert_eq!(ctpop(100i64), 3); + assert_eq!(ctpop(100u128), 3); assert_eq!(ctpop(100i128), 3); + + assert_eq!(ctpop(-1i8 as u8), 8); assert_eq!(ctpop(-1i8), 8); + assert_eq!(ctpop(-1i16 as u16), 16); assert_eq!(ctpop(-1i16), 16); + assert_eq!(ctpop(-1i32 as u32), 32); assert_eq!(ctpop(-1i32), 32); + assert_eq!(ctpop(-1i64 as u64), 64); assert_eq!(ctpop(-1i64), 64); + assert_eq!(ctpop(-1i128 as u128), 128); assert_eq!(ctpop(-1i128), 128); + + assert_eq!(ctlz(0u8), 8); assert_eq!(ctlz(0i8), 8); + assert_eq!(ctlz(0u16), 16); assert_eq!(ctlz(0i16), 16); + assert_eq!(ctlz(0u32), 32); assert_eq!(ctlz(0i32), 32); + assert_eq!(ctlz(0u64), 64); assert_eq!(ctlz(0i64), 64); + assert_eq!(ctlz(0u128), 128); assert_eq!(ctlz(0i128), 128); + + assert_eq!(ctlz(1u8), 7); assert_eq!(ctlz(1i8), 7); + assert_eq!(ctlz(1u16), 15); assert_eq!(ctlz(1i16), 15); + assert_eq!(ctlz(1u32), 31); assert_eq!(ctlz(1i32), 31); + assert_eq!(ctlz(1u64), 63); assert_eq!(ctlz(1i64), 63); + assert_eq!(ctlz(1u128), 127); assert_eq!(ctlz(1i128), 127); + + assert_eq!(ctlz(10u8), 4); assert_eq!(ctlz(10i8), 4); + assert_eq!(ctlz(10u16), 12); assert_eq!(ctlz(10i16), 12); + assert_eq!(ctlz(10u32), 28); assert_eq!(ctlz(10i32), 28); + assert_eq!(ctlz(10u64), 60); assert_eq!(ctlz(10i64), 60); + assert_eq!(ctlz(10u128), 124); assert_eq!(ctlz(10i128), 124); + + assert_eq!(ctlz(100u8), 1); assert_eq!(ctlz(100i8), 1); + assert_eq!(ctlz(100u16), 9); assert_eq!(ctlz(100i16), 9); + assert_eq!(ctlz(100u32), 25); assert_eq!(ctlz(100i32), 25); + assert_eq!(ctlz(100u64), 57); assert_eq!(ctlz(100i64), 57); + assert_eq!(ctlz(100u128), 121); assert_eq!(ctlz(100i128), 121); + unsafe { assert_eq!(ctlz_nonzero(1u8), 7); assert_eq!(ctlz_nonzero(1i8), 7); assert_eq!(ctlz_nonzero(1u16), 15); assert_eq!(ctlz_nonzero(1i16), 15); assert_eq!(ctlz_nonzero(1u32), 31); assert_eq!(ctlz_nonzero(1i32), 31); @@ -90,37 +90,39 @@ pub fn main() { assert_eq!(ctlz_nonzero(100u32), 25); assert_eq!(ctlz_nonzero(100i32), 25); assert_eq!(ctlz_nonzero(100u64), 57); assert_eq!(ctlz_nonzero(100i64), 57); assert_eq!(ctlz_nonzero(100u128), 121); assert_eq!(ctlz_nonzero(100i128), 121); + } - assert_eq!(cttz(-1i8 as u8), 0); assert_eq!(cttz(-1i8), 0); - assert_eq!(cttz(-1i16 as u16), 0); assert_eq!(cttz(-1i16), 0); - assert_eq!(cttz(-1i32 as u32), 0); assert_eq!(cttz(-1i32), 0); - assert_eq!(cttz(-1i64 as u64), 0); assert_eq!(cttz(-1i64), 0); - assert_eq!(cttz(-1i128 as u128), 0); assert_eq!(cttz(-1i128), 0); - - assert_eq!(cttz(0u8), 8); assert_eq!(cttz(0i8), 8); - assert_eq!(cttz(0u16), 16); assert_eq!(cttz(0i16), 16); - assert_eq!(cttz(0u32), 32); assert_eq!(cttz(0i32), 32); - assert_eq!(cttz(0u64), 64); assert_eq!(cttz(0i64), 64); - assert_eq!(cttz(0u128), 128); assert_eq!(cttz(0i128), 128); - - assert_eq!(cttz(1u8), 0); assert_eq!(cttz(1i8), 0); - assert_eq!(cttz(1u16), 0); assert_eq!(cttz(1i16), 0); - assert_eq!(cttz(1u32), 0); assert_eq!(cttz(1i32), 0); - assert_eq!(cttz(1u64), 0); assert_eq!(cttz(1i64), 0); - assert_eq!(cttz(1u128), 0); assert_eq!(cttz(1i128), 0); - - assert_eq!(cttz(10u8), 1); assert_eq!(cttz(10i8), 1); - assert_eq!(cttz(10u16), 1); assert_eq!(cttz(10i16), 1); - assert_eq!(cttz(10u32), 1); assert_eq!(cttz(10i32), 1); - assert_eq!(cttz(10u64), 1); assert_eq!(cttz(10i64), 1); - assert_eq!(cttz(10u128), 1); assert_eq!(cttz(10i128), 1); - - assert_eq!(cttz(100u8), 2); assert_eq!(cttz(100i8), 2); - assert_eq!(cttz(100u16), 2); assert_eq!(cttz(100i16), 2); - assert_eq!(cttz(100u32), 2); assert_eq!(cttz(100i32), 2); - assert_eq!(cttz(100u64), 2); assert_eq!(cttz(100i64), 2); - assert_eq!(cttz(100u128), 2); assert_eq!(cttz(100i128), 2); + assert_eq!(cttz(-1i8 as u8), 0); assert_eq!(cttz(-1i8), 0); + assert_eq!(cttz(-1i16 as u16), 0); assert_eq!(cttz(-1i16), 0); + assert_eq!(cttz(-1i32 as u32), 0); assert_eq!(cttz(-1i32), 0); + assert_eq!(cttz(-1i64 as u64), 0); assert_eq!(cttz(-1i64), 0); + assert_eq!(cttz(-1i128 as u128), 0); assert_eq!(cttz(-1i128), 0); + + assert_eq!(cttz(0u8), 8); assert_eq!(cttz(0i8), 8); + assert_eq!(cttz(0u16), 16); assert_eq!(cttz(0i16), 16); + assert_eq!(cttz(0u32), 32); assert_eq!(cttz(0i32), 32); + assert_eq!(cttz(0u64), 64); assert_eq!(cttz(0i64), 64); + assert_eq!(cttz(0u128), 128); assert_eq!(cttz(0i128), 128); + + assert_eq!(cttz(1u8), 0); assert_eq!(cttz(1i8), 0); + assert_eq!(cttz(1u16), 0); assert_eq!(cttz(1i16), 0); + assert_eq!(cttz(1u32), 0); assert_eq!(cttz(1i32), 0); + assert_eq!(cttz(1u64), 0); assert_eq!(cttz(1i64), 0); + assert_eq!(cttz(1u128), 0); assert_eq!(cttz(1i128), 0); + + assert_eq!(cttz(10u8), 1); assert_eq!(cttz(10i8), 1); + assert_eq!(cttz(10u16), 1); assert_eq!(cttz(10i16), 1); + assert_eq!(cttz(10u32), 1); assert_eq!(cttz(10i32), 1); + assert_eq!(cttz(10u64), 1); assert_eq!(cttz(10i64), 1); + assert_eq!(cttz(10u128), 1); assert_eq!(cttz(10i128), 1); + + assert_eq!(cttz(100u8), 2); assert_eq!(cttz(100i8), 2); + assert_eq!(cttz(100u16), 2); assert_eq!(cttz(100i16), 2); + assert_eq!(cttz(100u32), 2); assert_eq!(cttz(100i32), 2); + assert_eq!(cttz(100u64), 2); assert_eq!(cttz(100i64), 2); + assert_eq!(cttz(100u128), 2); assert_eq!(cttz(100i128), 2); + unsafe { assert_eq!(cttz_nonzero(-1i8 as u8), 0); assert_eq!(cttz_nonzero(-1i8), 0); assert_eq!(cttz_nonzero(-1i16 as u16), 0); assert_eq!(cttz_nonzero(-1i16), 0); assert_eq!(cttz_nonzero(-1i32 as u32), 0); assert_eq!(cttz_nonzero(-1i32), 0); @@ -144,27 +146,27 @@ pub fn main() { assert_eq!(cttz_nonzero(100u32), 2); assert_eq!(cttz_nonzero(100i32), 2); assert_eq!(cttz_nonzero(100u64), 2); assert_eq!(cttz_nonzero(100i64), 2); assert_eq!(cttz_nonzero(100u128), 2); assert_eq!(cttz_nonzero(100i128), 2); - - assert_eq!(bswap(0x0Au8), 0x0A); // no-op - assert_eq!(bswap(0x0Ai8), 0x0A); // no-op - assert_eq!(bswap(0x0A0Bu16), 0x0B0A); - assert_eq!(bswap(0x0A0Bi16), 0x0B0A); - assert_eq!(bswap(0x0ABBCC0Du32), 0x0DCCBB0A); - assert_eq!(bswap(0x0ABBCC0Di32), 0x0DCCBB0A); - assert_eq!(bswap(0x0122334455667708u64), 0x0877665544332201); - assert_eq!(bswap(0x0122334455667708i64), 0x0877665544332201); - assert_eq!(bswap(0x0122334455667708u128), 0x08776655443322010000000000000000); - assert_eq!(bswap(0x0122334455667708i128), 0x08776655443322010000000000000000); - - assert_eq!(bitreverse(0x0Au8), 0x50); - assert_eq!(bitreverse(0x0Ai8), 0x50); - assert_eq!(bitreverse(0x0A0Cu16), 0x3050); - assert_eq!(bitreverse(0x0A0Ci16), 0x3050); - assert_eq!(bitreverse(0x0ABBCC0Eu32), 0x7033DD50); - assert_eq!(bitreverse(0x0ABBCC0Ei32), 0x7033DD50); - assert_eq!(bitreverse(0x0122334455667708u64), 0x10EE66AA22CC4480); - assert_eq!(bitreverse(0x0122334455667708i64), 0x10EE66AA22CC4480); - assert_eq!(bitreverse(0x0122334455667708u128), 0x10EE66AA22CC44800000000000000000); - assert_eq!(bitreverse(0x0122334455667708i128), 0x10EE66AA22CC44800000000000000000); } + + assert_eq!(bswap(0x0Au8), 0x0A); // no-op + assert_eq!(bswap(0x0Ai8), 0x0A); // no-op + assert_eq!(bswap(0x0A0Bu16), 0x0B0A); + assert_eq!(bswap(0x0A0Bi16), 0x0B0A); + assert_eq!(bswap(0x0ABBCC0Du32), 0x0DCCBB0A); + assert_eq!(bswap(0x0ABBCC0Di32), 0x0DCCBB0A); + assert_eq!(bswap(0x0122334455667708u64), 0x0877665544332201); + assert_eq!(bswap(0x0122334455667708i64), 0x0877665544332201); + assert_eq!(bswap(0x0122334455667708u128), 0x08776655443322010000000000000000); + assert_eq!(bswap(0x0122334455667708i128), 0x08776655443322010000000000000000); + + assert_eq!(bitreverse(0x0Au8), 0x50); + assert_eq!(bitreverse(0x0Ai8), 0x50); + assert_eq!(bitreverse(0x0A0Cu16), 0x3050); + assert_eq!(bitreverse(0x0A0Ci16), 0x3050); + assert_eq!(bitreverse(0x0ABBCC0Eu32), 0x7033DD50); + assert_eq!(bitreverse(0x0ABBCC0Ei32), 0x7033DD50); + assert_eq!(bitreverse(0x0122334455667708u64), 0x10EE66AA22CC4480); + assert_eq!(bitreverse(0x0122334455667708i64), 0x10EE66AA22CC4480); + assert_eq!(bitreverse(0x0122334455667708u128), 0x10EE66AA22CC44800000000000000000); + assert_eq!(bitreverse(0x0122334455667708i128), 0x10EE66AA22CC44800000000000000000); } diff --git a/src/test/ui/bad/bad-intrinsic-monomorphization.rs b/src/test/ui/bad/bad-intrinsic-monomorphization.rs index b56e1ea039cf1..a29723f34b432 100644 --- a/src/test/ui/bad/bad-intrinsic-monomorphization.rs +++ b/src/test/ui/bad/bad-intrinsic-monomorphization.rs @@ -14,7 +14,7 @@ use std::intrinsics; #[derive(Copy, Clone)] pub struct Foo(i64); -pub unsafe fn test_cttz(v: Foo) -> Foo { +pub fn test_cttz(v: Foo) -> Foo { intrinsics::cttz(v) //~^ ERROR `cttz` intrinsic: expected basic integer type, found `Foo` } From 14be8a7f14fdcc4d146efc7501be9933e0a817b0 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Mon, 31 Dec 2018 16:36:39 +0100 Subject: [PATCH 13/86] const-stabilize Ipv4Addr::new --- src/libstd/lib.rs | 2 +- src/libstd/net/ip.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 82cee70232aa7..a7ed7c3b81a3b 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -243,7 +243,7 @@ #![feature(compiler_builtins_lib)] #![feature(concat_idents)] #![cfg_attr(stage0, feature(const_int_ops))] -#![feature(const_ip)] +#![cfg_attr(stage0, feature(const_ip))] #![feature(const_raw_ptr_deref)] #![feature(const_cstr_unchecked)] #![feature(core_intrinsics)] diff --git a/src/libstd/net/ip.rs b/src/libstd/net/ip.rs index 52a29f4885f56..f98113e0896f7 100644 --- a/src/libstd/net/ip.rs +++ b/src/libstd/net/ip.rs @@ -328,7 +328,7 @@ impl Ipv4Addr { /// let addr = Ipv4Addr::new(127, 0, 0, 1); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_ip")] + #[cfg_attr(stage0, rustc_const_unstable(feature = "const_ip"))] pub const fn new(a: u8, b: u8, c: u8, d: u8) -> Ipv4Addr { Ipv4Addr { inner: c::in_addr { From 61fb909559bc61e2179f3ea7b62b60e2e7df3ac0 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Wed, 2 Jan 2019 21:05:37 -0800 Subject: [PATCH 14/86] Update src/liballoc/vec.rs Add @centril's comment Co-Authored-By: scottmcm --- src/liballoc/vec.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index b987b94500fc4..30bcc034221d3 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -790,6 +790,10 @@ impl Vec { /// // Per the FFI method's docs, "32768 bytes is always enough". /// let mut dict = Vec::with_capacity(32_768); /// let mut dict_length = 0; + /// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that: + /// // 1. `dict_length` elements were initialized. + /// // 2. `dict_length` <= the capacity (32_768) + /// // which makes `set_len` safe to call. /// unsafe { /// // Make the FFI call... /// let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length); From 40658fdadec9eb4e8fbefe07feace9633057e648 Mon Sep 17 00:00:00 2001 From: Joseph Lyons Date: Thu, 3 Jan 2019 00:20:31 -0500 Subject: [PATCH 15/86] Fixed the link to the ? operator --- src/libstd/io/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 040669b7302f1..bb5a909b3e95f 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -252,7 +252,7 @@ //! [`println!`]: ../macro.println.html //! [`Lines`]: struct.Lines.html //! [`io::Result`]: type.Result.html -//! [`?` operator]: ../../book/first-edition/syntax-index.html +//! [`?` operator]: ../../book/appendix-02-operators.html //! [`Read::read`]: trait.Read.html#tymethod.read //! [`Result`]: ../result/enum.Result.html //! [`.unwrap()`]: ../result/enum.Result.html#method.unwrap From 85c4b4c7f249bdb33cba9ac738efbcb9000e4b86 Mon Sep 17 00:00:00 2001 From: Ariel Ben-Yehuda Date: Sat, 5 Jan 2019 17:57:47 +0200 Subject: [PATCH 16/86] use the correct supertrait substitution in `object_ty_for_trait` Fixes #57156. --- src/librustc/traits/object_safety.rs | 33 ++++++++++++++++++++-------- src/test/ui/issues/issue-57156.rs | 23 +++++++++++++++++++ 2 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 src/test/ui/issues/issue-57156.rs diff --git a/src/librustc/traits/object_safety.rs b/src/librustc/traits/object_safety.rs index 31342c250e2bd..3851187c39d96 100644 --- a/src/librustc/traits/object_safety.rs +++ b/src/librustc/traits/object_safety.rs @@ -252,6 +252,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { method: &ty::AssociatedItem) -> Option { + debug!("object_safety_violation_for_method({:?}, {:?})", trait_def_id, method); // Any method that has a `Self : Sized` requisite is otherwise // exempt from the regulations. if self.generics_require_sized_self(method.def_id) { @@ -270,6 +271,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { method: &ty::AssociatedItem) -> bool { + debug!("is_vtable_safe_method({:?}, {:?})", trait_def_id, method); // Any method that has a `Self : Sized` requisite can't be called. if self.generics_require_sized_self(method.def_id) { return false; @@ -389,6 +391,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { fn receiver_for_self_ty( self, receiver_ty: Ty<'tcx>, self_ty: Ty<'tcx>, method_def_id: DefId ) -> Ty<'tcx> { + debug!("receiver_for_self_ty({:?}, {:?}, {:?})", receiver_ty, self_ty, method_def_id); let substs = Substs::for_item(self, method_def_id, |param, _| { if param.index == 0 { self_ty.into() @@ -397,7 +400,10 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { } }); - receiver_ty.subst(self, substs) + let result = receiver_ty.subst(self, substs); + debug!("receiver_for_self_ty({:?}, {:?}, {:?}) = {:?}", + receiver_ty, self_ty, method_def_id, result); + result } /// creates the object type for the current trait. For example, @@ -413,18 +419,26 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { ); let mut associated_types = traits::supertraits(self, ty::Binder::dummy(trait_ref)) - .flat_map(|trait_ref| self.associated_items(trait_ref.def_id())) - .filter(|item| item.kind == ty::AssociatedKind::Type) + .flat_map(|super_trait_ref| { + self.associated_items(super_trait_ref.def_id()) + .map(move |item| (super_trait_ref, item)) + }) + .filter(|(_, item)| item.kind == ty::AssociatedKind::Type) .collect::>(); // existential predicates need to be in a specific order - associated_types.sort_by_cached_key(|item| self.def_path_hash(item.def_id)); - - let projection_predicates = associated_types.into_iter().map(|item| { + associated_types.sort_by_cached_key(|(_, item)| self.def_path_hash(item.def_id)); + + let projection_predicates = associated_types.into_iter().map(|(super_trait_ref, item)| { + // We *can* get bound lifetimes here in cases like + // `trait MyTrait: for<'s> OtherTrait<&'s T, Output=bool>`. + // + // binder moved to (*)... + let super_trait_ref = super_trait_ref.skip_binder(); ty::ExistentialPredicate::Projection(ty::ExistentialProjection { - ty: self.mk_projection(item.def_id, trait_ref.substs), + ty: self.mk_projection(item.def_id, super_trait_ref.substs), item_def_id: item.def_id, - substs: trait_ref.substs, + substs: super_trait_ref.substs, }) }); @@ -433,7 +447,8 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { ); let object_ty = self.mk_dynamic( - ty::Binder::dummy(existential_predicates), + // (*) ... binder re-introduced here + ty::Binder::bind(existential_predicates), lifetime, ); diff --git a/src/test/ui/issues/issue-57156.rs b/src/test/ui/issues/issue-57156.rs new file mode 100644 index 0000000000000..f20b0f41c7fa5 --- /dev/null +++ b/src/test/ui/issues/issue-57156.rs @@ -0,0 +1,23 @@ +// compile-pass + +trait Foo { + type Output; +} + +trait Bar<'a, T>: for<'s> Foo<&'s T, Output=bool> { + fn cb(&self) -> Box>; +} + +impl<'s> Foo<&'s ()> for () { + type Output = bool; +} + +impl<'a> Bar<'a, ()> for () { + fn cb(&self) -> Box> { + Box::new(*self) + } +} + +fn main() { + let _t = ().cb(); +} From 42e65c164d0ee00bd3bb3716b5aa50d490006632 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Sat, 5 Jan 2019 19:11:27 -0800 Subject: [PATCH 17/86] Use CMAKE_{C,CXX}_COMPILER_LAUNCHER for ccache CMake 3.4 and newer which is the required minimum version for LLVM supports CMAKE_{C,CXX}_COMPILER_LAUNCHER for settting the compiler launcher such as ccache which doesn't require shifting arguments. --- src/bootstrap/native.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index c548d7f6948dc..83212b131c8eb 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -347,15 +347,13 @@ fn configure_cmake(builder: &Builder, if builder.config.llvm_clang_cl.is_some() && target.contains("i686") { cfg.env("SCCACHE_EXTRA_ARGS", "-m32"); } - - // If ccache is configured we inform the build a little differently how - // to invoke ccache while also invoking our compilers. - } else if let Some(ref ccache) = builder.config.ccache { - cfg.define("CMAKE_C_COMPILER", ccache) - .define("CMAKE_C_COMPILER_ARG1", sanitize_cc(cc)) - .define("CMAKE_CXX_COMPILER", ccache) - .define("CMAKE_CXX_COMPILER_ARG1", sanitize_cc(cxx)); } else { + // If ccache is configured we inform the build a little differently how + // to invoke ccache while also invoking our compilers. + if let Some(ref ccache) = builder.config.ccache { + cfg.define("CMAKE_C_COMPILER_LAUNCHER", ccache) + .define("CMAKE_CXX_COMPILER_LAUNCHER", ccache); + } cfg.define("CMAKE_C_COMPILER", sanitize_cc(cc)) .define("CMAKE_CXX_COMPILER", sanitize_cc(cxx)); } From 239ac2b9903594c8fe5f8fc40b2863510bf7fa01 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 7 Jan 2019 14:03:29 +0100 Subject: [PATCH 18/86] Source Serif Pro regular and bold 2.007, and italic 1.007 Use fonts from the Roman 2.007 and Italic 1.007 version at: https://github.com/adobe-fonts/source-serif-pro/releases/tag/2.007R-ro%2F1.007R-it The following files are used from the distribution: * WOFF/TTF/SourceSerifPro-Regular.ttf.woff * WOFF/TTF/SourceSerifPro-Bold.ttf.woff * WOFF/TTF/SourceSerifPro-It.ttf.woff These replace the older Source Serif Pro regular and bold fonts, and the Heuristica italic font. --- src/librustdoc/html/static/COPYRIGHT.txt | 18 +--- .../html/static/Heuristica-Italic.woff | Bin 119956 -> 0 bytes .../html/static/Heuristica-LICENSE.txt | 101 ------------------ .../html/static/SourceSerifPro-Bold.ttf.woff | Bin 0 -> 93380 bytes .../html/static/SourceSerifPro-Bold.woff | Bin 48720 -> 0 bytes .../html/static/SourceSerifPro-It.ttf.woff | Bin 0 -> 36332 bytes .../static/SourceSerifPro-Regular.ttf.woff | Bin 0 -> 88724 bytes .../html/static/SourceSerifPro-Regular.woff | Bin 49960 -> 0 bytes 8 files changed, 2 insertions(+), 117 deletions(-) delete mode 100644 src/librustdoc/html/static/Heuristica-Italic.woff delete mode 100644 src/librustdoc/html/static/Heuristica-LICENSE.txt create mode 100644 src/librustdoc/html/static/SourceSerifPro-Bold.ttf.woff delete mode 100644 src/librustdoc/html/static/SourceSerifPro-Bold.woff create mode 100644 src/librustdoc/html/static/SourceSerifPro-It.ttf.woff create mode 100644 src/librustdoc/html/static/SourceSerifPro-Regular.ttf.woff delete mode 100644 src/librustdoc/html/static/SourceSerifPro-Regular.woff diff --git a/src/librustdoc/html/static/COPYRIGHT.txt b/src/librustdoc/html/static/COPYRIGHT.txt index c69861aa70a23..af77776cca431 100644 --- a/src/librustdoc/html/static/COPYRIGHT.txt +++ b/src/librustdoc/html/static/COPYRIGHT.txt @@ -12,21 +12,6 @@ included, and carry their own copyright notices and license terms: Licensed under the SIL Open Font License, Version 1.1. See FiraSans-LICENSE.txt. -* Heuristica (Heuristica-Italic.woff): - - Copyright 1989, 1991 Adobe Systems Incorporated. All rights reserved. - Utopia is either a registered trademark or trademark of Adobe Systems - Incorporated in the United States and/or other countries. Used under - license. - - Copyright 2006 Han The Thanh, Vntopia font family, http://vntex.sf.net - - Copyright (c) 2008-2012, Andrey V. Panov (panov@canopus.iacp.dvo.ru), - with Reserved Font Name Heuristica. - - Licensed under the SIL Open Font License, Version 1.1. - See Heuristica-LICENSE.txt. - * rustdoc.css, main.js, and playpen.js: Copyright 2015 The Rust Developers. @@ -47,7 +32,8 @@ included, and carry their own copyright notices and license terms: Licensed under the SIL Open Font License, Version 1.1. See SourceCodePro-LICENSE.txt. -* Source Serif Pro (SourceSerifPro-Regular.woff, SourceSerifPro-Bold.woff): +* Source Serif Pro (SourceSerifPro-Regular.ttf.woff, + SourceSerifPro-Bold.ttf.woff, SourceSerifPro-It.ttf.woff): Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of diff --git a/src/librustdoc/html/static/Heuristica-Italic.woff b/src/librustdoc/html/static/Heuristica-Italic.woff deleted file mode 100644 index b0cebf01de49b61c0f1ec5cb47f2687c64e918c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119956 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�*_BmXVd#S5mW8HYZxRlrC2S%~o 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 diff --git a/src/librustdoc/html/static/Heuristica-LICENSE.txt b/src/librustdoc/html/static/Heuristica-LICENSE.txt deleted file mode 100644 index dd85e40e64548..0000000000000 --- a/src/librustdoc/html/static/Heuristica-LICENSE.txt +++ /dev/null @@ -1,101 +0,0 @@ -Copyright 1989, 1991 Adobe Systems Incorporated. All rights reserved. -Utopia is either a registered trademark or trademark of Adobe Systems -Incorporated in the United States and/or other countries. Used under -license. - -Copyright 2006 Han The Thanh, Vntopia font family, http://vntex.sf.net - -Copyright (c) 2008-2012, Andrey V. Panov (panov@canopus.iacp.dvo.ru), -with Reserved Font Name Heuristica. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/librustdoc/html/static/SourceSerifPro-Bold.ttf.woff b/src/librustdoc/html/static/SourceSerifPro-Bold.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..e283dae58de6b38fd88280bc95fbb8ec99bab9a8 GIT binary patch literal 93380 zcmZU(18`q%u={a-GOwaWB zb)T7@u5p$V6$O9*000onegMMv9aOy;@B;wxUHbneK>;NZ0N|GWyF&CoG9uRM5LS{9 z`{r%`eun&C0ud7y`L4h9`R>#L0QkX5>PmhlCNHN10NkAe02ZMD5Uns!;qh}ZB^5yc zh>i;Y04EFp{3_1rkY$xqqGSB#8~^T0<(qVMd($Tjtn_RF0BA=50QtM_cj?|cxvYt$ zt1$pTP7eUosR2M_vhy_3NllIP48M8Rzxi1IBXr{264URO-|u3+p9#N-1m+c1#?;F3 zd(0ms-y+Kb0O;szF*doDHU{7AaErgk2?PLO;Ndu%KdkgzzQ+Zr{^rB}j~^@^aA~b) zWds1MhI|8s`py4?9G7X<*2dvmwvBWE0QH+#N=KfDtNsVmA0VUX_M{Oy2;2_w^S}514&?(Moo=D-fJj>L0CtmspOI7aDp*Jc(rF)`=??C=a6J1 zoryhBSXw(lS(8>gE3FiGA^~4ZHLIB0L)MtKtfo{#BRnb3Rlj1TV&ohczWrCF zg=$-LRjzcE)r@-FPhuJ_A;u5o&L!xamvDnWEZhplhQp9PQQsssw z`o@YL3_XChI6$=6_p{j==3zxQs&9(n6yIvXwC(e&&T7yC8z>NCO|WmS!8nnT3ZlgQ zDoo+frsyWXB5zHr1P7$5*OOQfD3U3G=bW(LFVLo7Bi<(;)-`F==-50j{xhwsy7Vfq zpQr$xDyj(~n%Ts5RIg0+%fY|>Z(yU~MXa3@#_g?dD)%7=ON-#5r@Fz0Z0df^M}Kw2 zs;+?efRiV%f*z_hduHAgpjfC{#xF@=TDz&zmNaOdyCQ{hAvny}vf0I(G4RCd(n^~3cGXO4bJwrNs) z605$9q+~uKau&F{z?1TZ+V3o7wkVb)C|$M;x`n{@(^vcao5mg-btep%kgRCywJpbh&!`wy(IVf z1Ty_knQ4%Q?QE*YBtH>73w88FVBA-Cp)F531XZuJI`m;TXEk~`R9VkJYzaNsV=&5& z_%dmfCdg#u*#*>-=*K+!Q{nKD-G_*-WKcS1QaaT28r!wTxk>FRB=v#B*OhdzRZCft z&@0<=mH1|cF~L5ZEwFahW}A26#pY4-9;cgRA()Mn<;t98=If~0OhSLlG zrMe)_JHCzV)k+bQZ@8J`{HQin|7?1pj*m|F$=ci+yg^6YJqG(EhbNfxPrBVhoGZT0 z5TlLI`_+PnQ;6%;+@=0{((&5$((EVPN4&YQwfa)k$r6+Qh?E}h-meIuCo9vfTtE4* zE8RD{^NPU_mafweS4eRldIA=E$cy{9?>^jGw~arhN{E(q z(w?!=9;c5szOI_gf*$kE5F&ux>#eHe2nI1V{ZPaqvL2Xs|B zJN(x%-1JPgFX68qLZ1gU$Nn*p7rfIOlRYl!RnVAS6=E+%QV&ihnLB;dLnK^Sff<)@ zF0*+&U5#CL9&Svet*X>a8g{<0z3R^pSgzp3at%J+@ZaXS0$ZZ>Z1RrZ(2uXwB6&bh zJgKF;V5xn*&yZoR-Vw=d?(Vxno(kw!k0W)d=>JR@+zMsTfP@>%sZmy`Q9O=yQAuVm zSB`6W)+ahTF!y~z5|~MFp;|@`UH){ZwC6qc!8_rrxG`3fvk&Ki)G8Wm6Hy-Wa$1Rh z?j+=-a~3r&S)-Ntn^dP`Q8Il|DA?wQ>q=csI^Hw6<%=UPaP4Uw0@j*GQn@AaQtg%% z-_pV=^yP!?Imyl7OmWSahWqJb8E_MO8{woa8Wo%eGW#NT)ni&s*X4inJ^ii`UcT7M zLl6sk!oslJ6|w96d_Fv*N70GS6Ra>sHaBIpv#NqRshj;#W~yHdHCVm$%iD{t55KZ> z{T_dzm}URs*F8)xw>biXyC$D0eR?dN(Yeg&J6joMYz4_U{8k8%~7B9!#nu`hL#uC8?|w@htCH zPOZgVXm9-u+r&npgNr^2Pr0ql_mNB@j@P06%Krmwe#heXrWjv0jkW7-JKxr(!MN8< zmM)Ad3+L4sqUWJd5f|sH7qlH_CtpURCgQTjigw2pWUyjxjLR@$*_*P?2`ezH(c#a@V|aN27AjYBP4vURrjV3hI|UW`KZtfRKwYzp${Np|F6mu#jUv zzjVK#Wxv4RejyJMenFC5w$RZl`=G1?7-V7qdR%u9j5Ub}qYGllzPK+?JaAszzg|4} ze%L2sIADC(ul)U&!n4vO$Z(+I@9sG&}cDcn^qq6NzsV_iTk& zM;SY}r6%`0LPw%K29Ij-IOIWB6krynv9zYqGU%a{0Mh;1=Y9Bv2{yMvUZHX#IiWCJhF*QbFRX5QH?7dZzIZpyq;#w3St%OeB6naD_X0c*37xyef8ra z_L1E^r=wrnx~hI@`RrWgQPn-EV`=j$>>%u@R?Au~n<}F$tSr-_)}l~zU2kJ%ongan z9cm+ytD!BR&9|+@#Mh+Gq|K!2DElb+NLe?cTXn>Mvh(5|AjIjQ>*1P#>+v*)?YSV4L^{NeO$CWki*`e!!ApHs;^am z^Dv$DyH}VEOPY9YM4EnX{72nrIn&xWtwVP@o0@cptD$y^GyK3V{J<^zfO!{%Xrm=n zO2X)<@j)H*pN4YQMSw**%ZQwvZx!3a~8|$w&2L`|a5M?9Im|1oC;3t7frjaO5mq zeNXd3^FZ@N^Kk7L=h*Tq82`|oC=G=pWB7CX(?15H>4pH+o|vRFe#y=Ms~!j6zPs(^ zb10_qDGPM7LDurV^6s^ruY<3Bt7EHOrz5K)3vk7CrFn%!_-t`q6m!3+vWdPa>cgaS zeF)EcIo~2{39pUB&E0HeJD2SzkmAn>UH~VF2gGbfaWq-J;A$e*@`UlB{!tCmtqS0( z366-TsFm9U_>j%_o15WJ6oFl9dXIM#aM9!~)F-n3sE6~CN@Jgazcw*Nc$eYihd6=6 zD`IlYq@7l264auc~SukK`|*OPHXK>~QV(IBvJWB=@*RcQ7asi^X%fJ&J_|j3~{S zkWU#XPw5#?8KKP?e`qivr841b(DQ0Af^bfYa%mj*F&_`|-|N~tnrPe`x!oIp8w-0I z_wpO}0E`C-jR)ut`^67?)X}?t9~%9VHZhYnwj0;QV!sSYC=XvK4^}CUez1&~u#Aed z41=@u!?O&(u=JP0^#wf-B0dlFKaUbR_w73mrNRwN!;Qvi9xA!E=k()R@1F_Y2mzCN_fM4Fq&V)u+Ao_{JWz^#X5Hr#E5gcZbXMcr+HWTtFz z(PFS*DN@rWIp1xLWKMH1uSq8RJ|2WoK4?rFix|a_sB}7;vM(DBC68FkbczIX+!C|* z9CH*GbMh}{&pPIiALdkVayOBBAGrEhkou75axePwXyWn!{PILp^B_a>cx?0NO!EK~ z-h`Ri z5SCeAn%S6|S=aI2*!*6fa@@p-S{H3xpJQAPY}`m>+<Pa1kTlXL@pcXh7@>GT+A6pebL{?FD4cYn ziL5x?bOUvEcT)5m@k06Ww^txls~03ysP|W@QtldaQh+5hTPb07sj&B~IkMu+De{Mi zg*dyYh2%X>1?i5n29DM>d#mI<+XdM#(hJ%dzWU$*6vxDHdd=K4NBG0kKr_e801C&> z04zt}fO*H9fP2T-0PkacD6A7?sD=~8(9VJ}lJwj$($~z&n3$AG;5D5VsUD*i&CYKv z|Auk7nSaQi*=MBIf^6c${A`l_$b z=guOw00;%xVB4Q)w(}}I4C%r+>GsZct8jf-=>w+eeP9uNB2expq)muPc5rL98(RHv z&IoLz=8`rqtDx)7-meeA&p6T71%H4cUZe_)uPmJgUWs0GGlsAJ!W<{j&!HTAA6Q+C z7`a^%%VOS1#grdHRagxI$jy=X9y! zRKv*r1sUoWnAv0e3RIU!RXpcQl`Myqx%e>~l2Bl#72&9_V&;~Fi`8#F z9YKr67^;$&q6KY;R3=;33LGX=P2oL^+qJ7HyoY+i%tW;i&$3UssaGd{jTrMY8Ni-9 z`m4%Kw;0yBojDk;Pjf7FDbY^77}>e2JyfQTcWiMf(oV4$+IgVeyQYtK!gUGPPPdrh zwY}LJtj}{S_Kaz>hfkrCDrQpo0K&)(P==CxA@9%~WX#WTO9Z=CBe*BjloxMoX+7c}+;OP1cmSF{$xi z#*FMauGLjgw*Rux>P)0Cd5u(k-LlN;K%|&j&02k0TF9k-lPLll2#*#@1Ztbyka)6$ zN$5l&EoF3q{?IYy62#EJ?KFx$-)y{o#tFp}v~0Lcp~+vnbhI_Osg_E1I;Ui9TOK=w zb3n&_>rU;mfZM>oA(a}T`_waE2z{Ajp(MDjaJT~RW?bW6;mg>mD!JgyY0Jj1$-*?p zV#pm5Qc}#3s)?qQ6*M!Bt)mZp*lYlc4MW0ohjN-5l#HEYDn=Gf-5K|4MND5REt zNLmX0BwVP!k|g#evC9P_$VvDT8+GD`j6^MC5va6O_zqKh98a*B&T@Mq?S4boh3?Q- z%^1`07YwL8>xB10-mpUeH4xAZUD#ek<$iiKG~&N35sobMqYs0oCPoTGU7Nx0z`r{jeh06k2Nqnv&mWuWlCf{tkVbnW1GF6mQRp z`e#NjunX##D-|w*OpqV1#VH;8jF@pcYmnFM7sat+EDR1gD<4OT)iU-Ob>kGjkM`X7gLz{Qe@No#r>ulWVy2Va zZhF7C?Iuqk402Wx#>QMT$qks>3XeY*vQED9Mx6`c4e9GNPp}xWPN7co(M?6a+OhK` z*!%ArmDhOpne)(gu6 zxNG>mw{+tEZ-@D~%GPsXuVybqIttQ z8rfc9Zm}ub656C@)yGBAbUj&m;lg&Hx~bK`bCt6`;a=)=&;fLJv01omkG7|~DqHoB zR@&U(Qz^QJ8rAg3JyqtFa7~j_%@{2DO>kRM>hR3`y)V=HN2`Bt|xh!{D0Nu=y2CGfnU8Kvr|Jnk+5vAnca(zfJ{Uu29Byrfcgn-cI|@QjkT zRGbc=nYM4SX5s)qy#b1&ozl<#%+&|kS4vEC|`+u#f6>&1U3WlASp zeQ#mul<_9RfhMjsr;ysY+>=r&5I2km655rV0ciJnI-Sd=<5Z1_MdC%Ue^#fCb#8t${;85$?*?SaP6srt-#=k|c&)+2tNqL9mGm z!gc!W*j*{aoj24YEGY!0m;(2f_d7rus+YIq zqY;IA!=Ul6O+SL6q1zOxZ(WwvfceMXnf!s@mAGoZt3U2lAsy-ewYbXM-=Bhpub4%yNsON2lYv_*7(~hddza~k6&ZSQ6 z28s51``xu3g|qJN3$%cJUH-qA5o`}AV4EKnQ2l4%pUwXb7X42l#WXeX`YU&p{UYX3 zNUmUM*5ue3c5GO`p3NBZD6-1fyso5W_1)^ACRLNE+-lK)D>q}T(zvRgfQummdeZhN zJ8j+SRMy$X{k-5|(EX@m%S)gut83v4w;x&(g2tbsr)Qf9vfs}z2I^LTq8L0f8}Hsv zj~?oluV0xhsC6HY3#8mON4sCsH3)AX+cT8+HXo&Y zpfZPw6pK=ZGGBxCh3e3P(LbFI)vbXh4fGw{#qg zp#(e6b!>uelWVy5pWfZx;?lh#asd;?WCV()lgXv_$g5LNzHL}B8D^`?}GVUhY(>=cz@!MhdD6nPTV zX`@lKRk##Iqk;An>lD$W;kT6@SdEZv0ieAMI}z8i&qVLJM5WD=r6iR8qj{3W(4|r4 zIjzMY-&rnxG280Nd~2q4LEDLdTY6?e^fAn9lvhp{zib14A;OZ3OwZ^MZ=alWW<1@eO zl;E}LlTY9pK*#|L2DrCe6E|VCVw}nT__F-J>PmBOeA$#kj?O1qfh4A-5FU-y$j3Sn zevMTy#Qr0!t=?;HPE*7C682K~s{Km!QYEYs)+%nG6mE~5+w!fURMo-;GlSMB-bRBp z*NdG;!MDWtNxO8~N$ewXgL0CxVe{Ica?-P5w_0CIlC?hTJ7sPZ^7I?RsR5W9#dd_O zzN(-0KkXq}f2x8%hWyO+DJF9Z)zgntCz%YhU@WAj9vi;-PZ>62e3UtoWwjKg@(HR7 zDh3PM52}3&hAf&i3hoOG55hyU!Wgrl4+5TwI`eD~LLY+O(|pp>@zeRtSTeGEmk9C0@tU3(`B{;*Ui^w;t%2T0t3zE2{ib{j=}u(V5I|Ht8rPoW!Zlg?Le;wnq0$o8c0hA zlrX@&D&z)(Rg>X$ZZ`$SMj>5Pm;rU2lt z<6T^-l&Lf^xHi6&{x49iRral)i7d61MUJfm!7zDIDyoFLQJjWi?6Qf4kyF}-uvaCj zLWPRxMiKV{wRwY%HeQjf0zMXd%z=o@LHoU+lr`mv$wP{}JeBTJo5<=zO@s^Ow$zOo zZNn^EMy>+9OGl?e_TUUQ>#($Dru7eP4x0$)@u?k)&!1mHx<66;%k(sU_bu$q4Tp+~ zHSOiv#k+`jfT9V5PO~$^O}u%dtp-Kq;T(g#`Z?^qH~(0qAE2>i;|96vhPc7q+N&Z2lN2)IpGIyK;KPJR(IunyGpfda>{eihSlR(;_hBQ_QbrZ8 z#{eBLtWn}duNpu|kyA|)ZUpWfxVegWRcaMCYH2Q7E4hyo_-$j!TM_~QrWY;W*jg9i z?){||{RTO*K*N0Pwb6XdMQ)jH9T7Q@dMD)?9|+zcz(D<!;4#(7oHD^&x>q9d16yUm!9Traa*Eh#C1sgfQjCMoez2*4|K0EPT{-U zcm;vKw3oPBxHH%P%_-ojkl+B@|IGFK%Cwr-nfNYzGOsmWY{*=bt?z`{5}DYawP<<> zcp>tICAnsizf*s5d#8C%b{%=cPz1mV>ga{qYCKbsp_qg@7vL%)jR4^#ulB?2W&QwV zIDl*;ZNPd-)q-$FA=ko11)7JTM47YViA8*is)i{ygN_dCvl?EBtOB}OZ_JDc?Lm5f zHp{*0l>Tx{c;?uaK6CwwT9j4K3!_Ia@}#*{hIIc)i6cLUKG)rLJFjM_je2WUwkplp ziqpYMF}kXy`LpAPhsU>)_eL){@8YSKM1)V#FC}^AW2_imxogsL{70xiE{q;1Xki+{ zPW8mESWO|nHu3pHL*-rPAw*0mRzn_h@A9OB{IV$we6!s#A4Hg0fH=7Z-1OZ&tLG$iZEZQ3#VBWO zrzKI^m}+gsIU(0rWi`Y(+?x&}Hvk$*7z8l>zpAoYYFk)Y|DIqjURRu$_y~FbR~{=< z_>3IBh@g{dOpTcpcgm}jDX^f(x;z=mGgonl*sW~z3?&g|vi9HSApd9%fw z<`JuTo2Klk5r@Qn)b+?#A`mlw98q`%jBMf7e>!)2UPE$&(RHKh3`O5?y@!*Km`TVg z0+mVrNl48mz>*k@NY?^?lMtSbSlg%nC3`XxUG@EuP%IKXt$B~+DZy78_WfDIuQhs> zxG*c&kLev4@u4UEmb;jCVJ;G*zYl=Wl12roib^Nd_ad_7Y;h&+qF(ui%3;3^fC-~$ z2U!|Y8F{n{C8cGZt&$u0mr8OaOY?FXloh~5NzKBHdD_#GhjBOSj=D`vZzCY%AU0E^ zg|RAA)t`B4izs^XWTtVjLshECgn?7blSR$8&W>)c{eAmZ_OkS83#wA-& z=Z3ZwsROvXMK`XFyiF0limj!j5C6|PLalA^uD-{e*J~wZo>GFyNWWt+x_+q}^LC_f z2gNQS*aLK{C;A%Z3q&H;A>)6}LV2izsZ+wBZ2SR&34`hVQE)qb!hwZTm01U0q&!?YvIW>bCE006NC);ze6ScAWJID z#fC{09Da#j=r)5qV|jnjk=by$?f(9JijUt9yn~pV0_nT*c+zUFeQ7y@M9v}^9vcq7 z)jSuoShlu)33-{_JQR%~-I@YUF76f!rilgU=_TiQ-Fy!bmBRff|mjKbX z@Cliwd290~=jWVE>vHyrAKvMh_Rm-WQYJRe7%;lxY(l-soH-)s500-^G9X4T>cK56 z=Ha7?Lru<^F_J}G8rfv58RD!LVw3?^J5z>H?IOeDND=mbL*gX=q|ISL6%EVF57C#8 zjjST-l+E=V)F-hTO0BnPvS~H(c0Tk^J_qqjESfrqE)M3R&<4KumpKk@mKl@F;y;`| zsAc6^^O_Asp`^yv55Kz^R+28$-OwUx?~g%yfR$!;sKG{Vx%hl}2DO8BbGH6FgR~E9 zrup|*5&fdebf{A5HMe&ErlNwpG2Q)kr%rLGC^kMMfuH&e8F>~_WM7cE6D2051d?j| zT3ObetDDz|C}$nwx}H^R;)_&BaQ@ei4JMQ0tx|({rYFM98n6g}esULxe@-~0 zAqCMoge@Y{C;~wG8o`6%eQIbe+B{Bd;5xANuiw8LU9Dq%iQE~wL=x0}d3unH!QNP$ z-nUgJZ6;QaJ;OaG9f_(L>*&e@A`A8mXk9qwAdsMTvb}4TH)kE5QTnCyzbTx0Ym4!k zk{+K5S&Y~PKTt$Iydu_5lbZD$4I9sSI{N8qBhGkhaZ))!I%S*$9T2w5g1rmk-&y&| zzs#G&UzUNev2kLo{Y87g;iiFDZrOLnf0oE1*|}2KeX8UBFM{~@&{jD##M_3?M~Nh8 zd8?=DGCBJklZW!wo1rlTS zH6jw(8CxulR^Tc!jA717S&ma+)x39{>8MU0>Gj#WlB)*Mpk`22=wZ!`US(-VC;d6z$rdJ*WOZ6-tX${oZNR_OcHTB z^U9u*5>zeG^k@%-K-Za{GWo|D5*YT_G%mej{mVK4}P)mrt>)doqRIm@a_aH;&x4-#P zsLcA!8ypyhODqU|W5YkRvkmqc+%3#IE7-#h0BcT3ix{WsKV+gVU0Q{`rK+C(IY2jo2sj z4>cS}lDm=aTvUBVvRUa_zvE-Y?aD#>SzTab|Ehv_r7dQ2Rvxa3f#$+2b zWw{<8T>M$|EBorF$;mXv9DZMB+C?|K78V9r2WAy~zrzz1^Z6K1EXAit!yJA+{_xd! zf%HQez_=#Xvzw<_BsC{{tW#(F#YY=(#TPlq4YKuoI7gnRc~SchJ3(a6qVj3U2AAWZ ze>q*QReNmSmAz@LYQd%PVDY@Xg4aY=5{&24jpkx48854}q+=hm1(y_wGj-h;dI9~_ zzd&7f9hr*f{Au4yrZQk$++GC&pp*BWLEQV?lpe$TQc@%%)!%#MQ{65%#y+!eUbnv|2u=r?@A9XQ^gUknJJ zfWILgW6wOce^S`bF;fItK{v1&^xKc4m&pokhWl=8(fN1XPJQGW^Rx0H zR9y8qXO*UXO-jfu#A@sHPQZARV?C2QS;3;!xAgx)XXOj-3RoL9&g-v8(9u{H3;g38 z($OuF->c|Y&j5viFzYKq=)5&v*WGe4a2G>no{p=#NZi_Ah`lIhf4%L~4U zzvrQ~{i%S80g>g9X*E~I*>sSb-w$^Fe_cEG{z0PkAE;MsFL};8>SCM?_6(IKYFQ9uEI;V&g3Phmj%{FeUj$ zFA&BS7ygcPYKo*xUCx9mS{HCOdK56sR@Xxq-o;MGwbP~NnM6X z{5#Y;2EmA{M(A0zn8CdRuuSBEd9S)!HsTCZ`evRmp9yu&>{@p{brUL-sMi*g$YZjC z>#%Z=S}TYEwPhLhTwiK|?mnD;{Zn|Mtz$DZyR6%H{1?R6lHGHv<&NK?m-M~2UNJ-K zS>n;*WuSMZOHs*F z+vBBub98ZKbF;+JytT@vkfq&dYLiCu@p6U8r5T>52xc!431nSi04%UjsZ^V!W?c2} zz2eJ`#$;7Zsk9~GBwwKaU05p#Px_YXWj;RP#1}32b#$meLfluV*E4qUIFn-k8j4bj z?~1ZjR{@%SU$61X zilrQuab#Qp)@o0YFDxq@{65&nm`mZQrPXGZ^-@2H1B<=D$&n7RI)e>csxH(+w-bm}?xgycK^& zx_RVMj2S_IzVV$0@3nNzec)U0Jb_kf zrRBY96jJ^9XO$(#dtCAF^>nErM#C(b^;FM%Bv=}p!EL*)t_T9ZH#DyH0csRayol;Wl`K5;BMZ|(aFaRTRm7sQR(q} z+gtCk<5xw-@Oqu^enI8E!^LEE=SMVu4G+Gw#S7ZjB@{Jm<`>NJTSM!Un0MAk5M@qNe!IA}2McX`Sjc8uxAauWiZ0$77BtAD6tAS@<bCi7a1W%jcXwf~uH$aqDhmPltX_qPI<#HkPg11E+qeq-`-1UN4 zqj{sXeXT@03a?*D$5qs2JncSWw4*H{QTtzX-DbOHk7S0Z^7U@ihf4+KRVHS5E zb@0<7RD=7x7niy9F~&?LIB6F76@kE?(#0eEc(=11<@{RY^x0Z&glf$(`fM6=8aaAj zNgCCf)9TuxJ!6ux2>TSxoGka9pay{m*}0eL@IY&Y!zWX{KbtYI_1|`%!Lt>|Gy&g0 z5KF0JyFVA#d}h})r{($05_g69RZj8BXOIEC))Jk@4Kw%r)^{##zHg%5Ub&{5@gHmT z-)pLA1A3xo5;sIjKa3fkLObK>4|?CTRU)2{%z!GGhq+^Iy?3o!iF0evEnO~L98T`nKzlcZ#)41a0!k^hK63h0b!4F{iMAt@9SP4T>4kB&2;S5Jb8V} z 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 nJH*H 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 literal 0 HcmV?d00001 diff --git a/src/librustdoc/html/static/SourceSerifPro-Bold.woff b/src/librustdoc/html/static/SourceSerifPro-Bold.woff deleted file mode 100644 index ac1b1b3a0bb7a673d52495743d8f86fd55188b44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48720 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

9E8XSY2)E(Vq?32Bxtg&VLnC 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 QJ&hM32>KVoT7vcf00b!O^8f$< diff --git a/src/librustdoc/html/static/SourceSerifPro-It.ttf.woff b/src/librustdoc/html/static/SourceSerifPro-It.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..4bd621c9bd0bac971eced0ff78504c196e7b6c14 GIT binary patch literal 36332 zcmZ6xbCjpQ&oKNM@7T6&+r|!dY}>YN+uX739ox2T^PTVSe*SuMt~94f(>7_ZwC6Og zzs1A=K!6{Jz5u}g5Fmz;pE|^Uoc})v2`Y&K05)Mie6jz~m{_|@L`hQoNB7{T{_FoC zkhqBGkKAVFr*8a%QE+h)+4gdgM830gv8jKC%6IW6e0sund004+T008_E zJCV`nZzX!BpGo|utNw#}T9A$zhSvIa008)pE@I5QsD~dO?GMUJ7dmQK>%0Ao3)J|dhxLO5z$`$JHu}~-HW_{Z03hf;y1-bk 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 literal 0 HcmV?d00001 diff --git a/src/librustdoc/html/static/SourceSerifPro-Regular.ttf.woff b/src/librustdoc/html/static/SourceSerifPro-Regular.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..96b36a0ed2366b57ebaffa15c5546e5ec3bd0f65 GIT binary patch literal 88724 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�zB{Hl}NQ!3@RN26))!B%XaN?Z}$N|lrPG!%Cn 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%0AHnr$&HP)99eOG;&C)H59oX7tVW8CpZqiv(kJ zj>l6qPO{{Fa*p?%Lt9^O?$*GUZ^tFg8Z+pzVXaw)sEj@)i6DRK2>9A7pF!ok>F;~` zdr?_1XMP8no0j!!=Sb&yj)ibH+q60C%+;80w36w+$YvQIttwK3+=O(!m6Y(7;K(&?mUQuJ^vlR%AWw;cwJ`3)%ivFHy1sQUq`ZIMz%c*7o1dICR^J z{#64qqF}SACE|OUe>!_(9IKBOlIJb5LacPUks+(hZC`h4XTYrE zARtSznPK_dI+=um8SFM5g$#>0975KS*E7X$4MJUtM9vIXs*tAW;V+JZ{@yAYHzo>u zU8yOwf3#R~>CMVac=*ZM5T~B2qU)MHDR*nETr^yx@V@HMLblLM+6KON37PX{+@8dw zfX6*o7vIecoLxH=i-*0N{g!0^nbmpN6a`gK1+oh!*xGR`<3kz2M?}TKSs9~FlWKL4 z|Ln=)Df5xYT}H)1-=<``7agdg^v}dy*et16cDhFoTG{Y=0c`yHmob=jOFO1g zY7qB$s!E(D)%{baWps|@^QV8lgYMzc)dv;1Mnt%`ej)8JIOPSb4M7}sD*I$HZ@*! z6dIci`xQ-P-Oa%=kC%xri2gga4@=K(boADxY7n6;AvH&#sOVMD*$9|i>{s|JjNh7} z-2Z^BK<*3@R^6!;GTV%aAC-TJ@3p@FCP0|Bi+U6M+2v8XCr(jC8mURf}{}{kuRjd?o>@4$k~Kt(zRX8sYI;PR8#+)7o=#um7$ zO(AnUjUFpXSE-EhSeLswLmjf!{4nteV7K~|7oeOgDUWFb-WeRK>LsGKHT zlz6YwS1Y#^{rb9I)hvyHczVI3MyijnP^_F_X6!t&B3y_GoJ9PMnXtx(X1EuhoOXFI z=!8>q;M=!VyOS+dyk$96c$ofxXXha57{H6?!j-Sl6dTFKAZLRUH3ZdEID3yFckaFr zw8VQ;#=r0KzR(rMsO^2dy#VKMf-!i-7uIX`(iA`>*k&r1Y|;0gBD|>;Z03?eH6l>M zrr9L*CZVrW6sKnD-T1Mnh1`0GCp+U7pOJ8^EmB29O{Lyx%Y_-`#sgg5;7tA2>ztY&$Wi~Jj0nHimi%24{^!tEKY3Xr>E`mu~#ZxF0>8^J(Zj#n!! z+JgcA;d9v^v9^EFJvnW3namXp(vBn0>%Z{cvzQ|K5p~ia*llV=C1@j29>Cd#s~H zOG&*7U3A1$tJd`if9UcvdSj7xf@x9d?Vkv{L1jpzh2c6#g2m!ej|eD|cCMRi7>cww z8Z=%?L)wJ=)cc40eU<5u^g}ChdrT>Dr$#uyUIX!p|6l8p{J?K71>X~eJvrs@;h8|T;nOyTI5 z<{-qqTJ*N#I^^=}G$|6&ZDlvok>elnlo8yy7B)g5po$W!pQc+wlU2v$ki83^E_bAu zipYg)@1RL8i#cw7zNyIUY{&jfxYSOIEOy0n4}~p$7MndqXI~PLTv={r^^+I)bzWtO zvtO#dz6wo28G|^b1Ke@tJZLkPakwz9VlA(o6sQr}GAZHf5;NIf?SK)qkm9OMW5>;0 z3_`=xOxW4RRpzBzuFcBg#-wv2(6@LRCy2S(aXG{^k3Kv7d_+3M(nk6OJVT&_l7aew zu)WXTC+E3&nal8Wm~asi`Iz|hP(u$z`vi_Md47O$2*cxzS4$=# z;jf**zL|AgC|BH|ee$;1kP{NEBu_BFQ=#_3jmg(;KkSR8$c%foL(Gi46(}E#Ph_!T zBoZA5n@BzWT40=OFX8YD;X zx@^UGt!o0(ERf9v+|PIHxf<-U;rx!bQl>m`5grn;ql=*uTuC~W6i1doe%*gO3}?7otSm1{@W3*72-kI6To$04f+1brL<-me%uApN>9<#xh? z+tK|QsWjFfm^_&P*weUc45*DlC}|LJS=itAHtQTbU3C%Hmfo~8Zq2A3 zcCPM39s5wLUbf%+2-MwA>Pn~-=^9)lQFC|_{eJ*oK%l=mJ+Zr3+C7=cOzuAB$<%`W zTH51D*Zjd+#`DUI9pc8}&mDhgTXzSEgRl7;X6tYq{GvWn#kOuMvvoE2^Q}L+t^3yR zZ0q8nkN@(2$kyHW2efqouyz0b2e);_)7rWW(DoaDcw2Yp@59#peq-6+&DQm^qxrQ7H^4CI+qXY2m{$$ecPbB=l zu-RZvm<*PPCFS#_@IU_1P&9DExi`T715vuBXmPcV`xg2S%vJb2cItMqW}M=%Fe@c- z_b#z?E8G^T@CEQ~>)XXYAT{je>E4F%+yspK!=w$B&fbpePRQ!no98Kd5RLn(&bGGA z?)H!k9*YW*?$eA*kincQTpC8W=3S(P$>gO2W`nbs@}Yb%;E!#eE*^_p9eM>yn6&Cx z;Wbj5QQA?lC+rH1MyU-r1g}OJ8(b(Kj2cyXqt(~|;nWFXGp6y>Y9BgEXl#;cJO%wb z%KBG0<*6dwB~og#1u@>QvWxemJS3#35)x~00d)(3uhL{h*C6vooe~$e0e;?F{bB&bPM)xvdz%G(VE4vQ}0hLz68xjUyqg4g??}wt6a;;>X zoi&zfWee~f?~#BWM8j~;BqICAz~2YSvl8f0?l1Ts!;_qA_I;txVpW)|8U|POYc3aT z5r0@vYu$-Tz!A^e_%WyG2nC%s(GeZ#FWLRUY8v0$0r&oR@4Y*9@^EjaH@elv9{JwM zK6>wSHn=zR2ilEpfqN&BmGsBTeVvRucqV!S!O31N@R#AM$GMMl@8B`Qz5HPbLvP^T z0UCs2?GYT)SZYKk1ly@1a~5Ki3Xee5ys%O4ATtogBkRKH&3ekEV8 zX4gAh!0K?T=rOoHiO8N6@b|CTnyV`MD}s|fDB$m3Q<>oY z9$8TUZ?(rg3ZHrSpAtWz>Jrn>K8peqRF|^rcs26Lzx(b+zXRtgjXu#{B)=rrDU_$W zj(_Uqc;`Cw^;6#OzV<4`AG9M#bvEKbm%kn8k9E0?`jFg{NQ*v4&VxBg_GKb8 zUSk*EC8Wc4dpIq)>FblWP}b+og>1G^&g;vDq`g7DfWFHixIfUh{cq&{+g8WXApacr zXU;VnEW zr0Tt2k33^Pr|Gs?L6Q}pTz9{V#$8`-Ki_`-%dWAD>HUtc9z`+!>(GAzXsN|JVv=yg zj>itAs(fmcNZ0nIs;*D+{6(MV5#m43-!*>itmPM9*=-n0FMh4(Jd^Z!DtN4clu z`>Fs@lKWc7c{upKP0(&)*QNL6cf5$+`#tzprtX_lS%UTs!hI_cBt43^J!j!l zAH1uOcQ~Yq6Sv<0uXN{sMAnB(ag!SRKe#{CA;zYoPS5BBT`+`PDC~GZhj}N+ocD+K89vu$%SBlPLQJdBl zlg?tLKRi5|ru0B%x!q=R`Vnqz66-(mu7Y=>B<%*5jjOPBlQlKaWQgl%penhk>`1aY z+hu~p(PgQD{!?@S@m;M_{Q6FCOivsEJ@iu;M{e*@v3@uLdIoHJ0l#_#&GBCWeS>ub z$MhA@Kh#e&OX8>(cpl_8tORS-q3&g!?g z0uEOx)^B!NIkvaZ!w^G%lN;ssbG;?ehP9{R80hxNIM2e9HH8XJ#|}WH?{IzjNiHwr zqwF2A?E0ki0dLEt>Z9JAKe=XVY6#>(mOf$#1eK;9X7nqTf@~ z^JB1WIf58YPadRDW zaL_vKZJvU@-IT{HIXyROYZ!>HexSn!L%73+Fnp9*=S_(*rxQF> T#x!RM8#a#Gm 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 T`>xjor2he>K@jvWkwJRWB`#{9 From aa257ec73ed96782821fc90e3aa9698813fa8385 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 7 Jan 2019 14:03:46 +0100 Subject: [PATCH 19/86] Replace Heuristica with Source Serif Pro italic in rustdoc.css --- src/librustdoc/html/static/rustdoc.css | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 2cc0b5e30b893..14273c6b1db33 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -12,25 +12,24 @@ src: local('Fira Sans Medium'), url("FiraSans-Medium.woff") format('woff'); } -/* See SourceSerifPro-LICENSE.txt for the Source Serif Pro license and - * Heuristica-LICENSE.txt for the Heuristica license. */ +/* See SourceSerifPro-LICENSE.txt for the Source Serif Pro license. */ @font-face { font-family: 'Source Serif Pro'; font-style: normal; font-weight: 400; - src: local('Source Serif Pro'), url("SourceSerifPro-Regular.woff") format('woff'); + src: local('Source Serif Pro'), url("SourceSerifPro-Regular.ttf.woff") format('woff'); } @font-face { font-family: 'Source Serif Pro'; font-style: italic; font-weight: 400; - src: url("Heuristica-Italic.woff") format('woff'); + src: local('Source Serif Pro Italic'), url("SourceSerifPro-It.ttf.woff") format('woff'); } @font-face { font-family: 'Source Serif Pro'; font-style: normal; font-weight: 700; - src: local('Source Serif Pro Bold'), url("SourceSerifPro-Bold.woff") format('woff'); + src: local('Source Serif Pro Bold'), url("SourceSerifPro-Bold.ttf.woff") format('woff'); } /* See SourceCodePro-LICENSE.txt for the Source Code Pro license. */ From d2ac094c99993d0bf3be2b480bf63605f1b39ab3 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 7 Jan 2019 14:27:50 +0100 Subject: [PATCH 20/86] Update static files code for updated Source Serif Pro font --- src/librustdoc/html/render.rs | 10 ++++------ src/librustdoc/html/static_files.rs | 21 ++++++++------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 184d5b24d6e12..b48951d7593b6 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -893,14 +893,12 @@ themePicker.onblur = handleThemeButtonsBlur; static_files::fira_sans::MEDIUM)?; write(cx.dst.join("FiraSans-LICENSE.txt"), static_files::fira_sans::LICENSE)?; - write(cx.dst.join("Heuristica-Italic.woff"), - static_files::heuristica::ITALIC)?; - write(cx.dst.join("Heuristica-LICENSE.txt"), - static_files::heuristica::LICENSE)?; - write(cx.dst.join("SourceSerifPro-Regular.woff"), + write(cx.dst.join("SourceSerifPro-Regular.ttf.woff"), static_files::source_serif_pro::REGULAR)?; - write(cx.dst.join("SourceSerifPro-Bold.woff"), + write(cx.dst.join("SourceSerifPro-Bold.ttf.woff"), static_files::source_serif_pro::BOLD)?; + write(cx.dst.join("SourceSerifPro-It.ttf.woff"), + static_files::source_serif_pro::ITALIC)?; write(cx.dst.join("SourceSerifPro-LICENSE.txt"), static_files::source_serif_pro::LICENSE)?; write(cx.dst.join("SourceCodePro-Regular.woff"), diff --git a/src/librustdoc/html/static_files.rs b/src/librustdoc/html/static_files.rs index 47629d058e31a..f340590e5fe33 100644 --- a/src/librustdoc/html/static_files.rs +++ b/src/librustdoc/html/static_files.rs @@ -73,22 +73,17 @@ pub mod fira_sans { pub static LICENSE: &'static [u8] = include_bytes!("static/FiraSans-LICENSE.txt"); } -/// Files related to the Heuristica font. -pub mod heuristica { - /// The file `Heuristica-Italic.woff`, the Italic variant of the Heuristica font. - pub static ITALIC: &'static [u8] = include_bytes!("static/Heuristica-Italic.woff"); - - /// The file `Heuristica-LICENSE.txt`, the license text for the Heuristica font. - pub static LICENSE: &'static [u8] = include_bytes!("static/Heuristica-LICENSE.txt"); -} - /// Files related to the Source Serif Pro font. pub mod source_serif_pro { - /// The file `SourceSerifPro-Regular.woff`, the Regular variant of the Source Serif Pro font. - pub static REGULAR: &'static [u8] = include_bytes!("static/SourceSerifPro-Regular.woff"); + /// The file `SourceSerifPro-Regular.ttf.woff`, the Regular variant of the Source Serif Pro + /// font. + pub static REGULAR: &'static [u8] = include_bytes!("static/SourceSerifPro-Regular.ttf.woff"); + + /// The file `SourceSerifPro-Bold.ttf.woff`, the Bold variant of the Source Serif Pro font. + pub static BOLD: &'static [u8] = include_bytes!("static/SourceSerifPro-Bold.ttf.woff"); - /// The file `SourceSerifPro-Bold.woff`, the Bold variant of the Source Serif Pro font. - pub static BOLD: &'static [u8] = include_bytes!("static/SourceSerifPro-Bold.woff"); + /// The file `SourceSerifPro-It.ttf.woff`, the Italic variant of the Source Serif Pro font. + pub static ITALIC: &'static [u8] = include_bytes!("static/SourceSerifPro-It.ttf.woff"); /// The file `SourceSerifPro-LICENSE.txt`, the license text for the Source Serif Pro font. pub static LICENSE: &'static [u8] = include_bytes!("static/SourceSerifPro-LICENSE.txt"); From dac6eeca92e08a252fa952a1e89f6cd9cb6ba6f5 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Thu, 20 Dec 2018 15:10:07 -0600 Subject: [PATCH 21/86] semi-revert libsyntax doctest parsing if a macro is wrapping main --- src/librustdoc/test.rs | 51 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index 2170054b532b9..1f19fa2e7f598 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -394,7 +394,7 @@ pub fn make_test(s: &str, // Uses libsyntax to parse the doctest and find if there's a main fn and the extern // crate already is included. - let (already_has_main, already_has_extern_crate) = crate::syntax::with_globals(|| { + let (already_has_main, already_has_extern_crate, found_macro) = crate::syntax::with_globals(|| { use crate::syntax::{ast, parse::{self, ParseSess}, source_map::FilePathMapping}; use crate::syntax_pos::FileName; use errors::emitter::EmitterWriter; @@ -412,6 +412,7 @@ pub fn make_test(s: &str, let mut found_main = false; let mut found_extern_crate = cratename.is_none(); + let mut found_macro = false; let mut parser = match parse::maybe_new_parser_from_source_str(&sess, filename, source) { Ok(p) => p, @@ -420,7 +421,7 @@ pub fn make_test(s: &str, err.cancel(); } - return (found_main, found_extern_crate); + return (found_main, found_extern_crate, found_macro); } }; @@ -448,6 +449,12 @@ pub fn make_test(s: &str, } } + if !found_macro { + if let ast::ItemKind::Mac(..) = item.node { + found_macro = true; + } + } + if found_main && found_extern_crate { break; } @@ -460,9 +467,28 @@ pub fn make_test(s: &str, } } - (found_main, found_extern_crate) + (found_main, found_extern_crate, found_macro) }); + // If a doctest's `fn main` is being masked by a wrapper macro, the parsing loop above won't + // see it. In that case, run the old text-based scan to see if they at least have a main + // function written inside a macro invocation. See + // https://github.com/rust-lang/rust/issues/56898 + let already_has_main = if found_macro && !already_has_main { + s.lines() + .map(|line| { + let comment = line.find("//"); + if let Some(comment_begins) = comment { + &line[0..comment_begins] + } else { + line + } + }) + .any(|code| code.contains("fn main")) + } else { + already_has_main + }; + // Don't inject `extern crate std` because it's already injected by the // compiler. if !already_has_extern_crate && !opts.no_crate_inject && cratename != Some("std") { @@ -1143,4 +1169,23 @@ assert_eq!(asdf::foo, 4); let output = make_test(input, Some("asdf"), false, &opts); assert_eq!(output, (expected, 3)); } + + #[test] + fn make_test_main_in_macro() { + let opts = TestOptions::default(); + let input = +"#[macro_use] extern crate my_crate; +test_wrapper! { + fn main() {} +}"; + let expected = +"#![allow(unused)] +#[macro_use] extern crate my_crate; +test_wrapper! { + fn main() {} +}".to_string(); + + let output = make_test(input, Some("my_crate"), false, &opts); + assert_eq!(output, (expected, 1)); + } } From 68b8b438c3dd641f187e59035589b498e231f4cc Mon Sep 17 00:00:00 2001 From: Dylan MacKenzie Date: Mon, 7 Jan 2019 21:03:41 -0800 Subject: [PATCH 22/86] Add link destination for `read-ownership` --- src/libcore/ptr.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index 55a72d7a9a94d..02eef07afd7ab 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -849,6 +849,7 @@ pub unsafe fn write_unaligned(dst: *mut T, src: T) { /// [valid]: ../ptr/index.html#safety /// [`Copy`]: ../marker/trait.Copy.html /// [`read`]: ./fn.read.html +/// [read-ownership]: ./fn.read.html#ownership-of-the-returned-value /// /// Just like in C, whether an operation is volatile has no bearing whatsoever /// on questions involving concurrent access from multiple threads. Volatile From 8780ebff1f7468f0be64b81f81b72bce1301433a Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 8 Jan 2019 16:13:22 +1100 Subject: [PATCH 23/86] Remove `CrateNum::Invalid`. It's unused. --- src/librustc/hir/def_id.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/librustc/hir/def_id.rs b/src/librustc/hir/def_id.rs index fb2c873d740ca..0a8c72a0ad8ec 100644 --- a/src/librustc/hir/def_id.rs +++ b/src/librustc/hir/def_id.rs @@ -17,8 +17,6 @@ pub enum CrateNum { // FIXME(jseyfried): this is also used for custom derives until proc-macro crates get // `CrateNum`s. BuiltinMacros, - /// A CrateNum value that indicates that something is wrong. - Invalid, /// A special CrateNum that we use for the tcx.rcache when decoding from /// the incr. comp. cache. ReservedForIncrCompCache, @@ -29,7 +27,6 @@ impl ::std::fmt::Debug for CrateNum { fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { match self { CrateNum::Index(id) => write!(fmt, "crate{}", id.private), - CrateNum::Invalid => write!(fmt, "invalid crate"), CrateNum::BuiltinMacros => write!(fmt, "builtin macros crate"), CrateNum::ReservedForIncrCompCache => write!(fmt, "crate for decoding incr comp cache"), } @@ -90,7 +87,6 @@ impl fmt::Display for CrateNum { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { CrateNum::Index(id) => fmt::Display::fmt(&id.private, f), - CrateNum::Invalid => write!(f, "invalid crate"), CrateNum::BuiltinMacros => write!(f, "builtin macros crate"), CrateNum::ReservedForIncrCompCache => write!(f, "crate for decoding incr comp cache"), } From 4166a4e5d0ef32ceb0d67d1f5dba334caf439a0d Mon Sep 17 00:00:00 2001 From: Vardhan Thigle Date: Thu, 3 Jan 2019 10:46:22 +0530 Subject: [PATCH 24/86] Supporting backtrace for x86_64-fortanix-unknown-sgx. --- src/libstd/lib.rs | 2 +- src/libstd/sys/sgx/backtrace.rs | 91 +++++++++++++++++++++++++++++---- 2 files changed, 83 insertions(+), 10 deletions(-) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index ccfce672e5f9e..2f35b58106eab 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -305,7 +305,7 @@ #![feature(maybe_uninit)] #![cfg_attr(all(target_vendor = "fortanix", target_env = "sgx"), feature(global_asm, range_contains, slice_index_methods, - decl_macro, coerce_unsized, sgx_platform))] + decl_macro, coerce_unsized, sgx_platform, ptr_wrapping_offset_from))] #![default_lib_allocator] diff --git a/src/libstd/sys/sgx/backtrace.rs b/src/libstd/sys/sgx/backtrace.rs index 52d4a63bb6384..7e792300f434c 100644 --- a/src/libstd/sys/sgx/backtrace.rs +++ b/src/libstd/sys/sgx/backtrace.rs @@ -1,21 +1,94 @@ use io; -use sys::unsupported; +use error::Error; +use libc; use sys_common::backtrace::Frame; +use unwind as uw; pub struct BacktraceContext; -pub fn unwind_backtrace(_frames: &mut [Frame]) - -> io::Result<(usize, BacktraceContext)> -{ - unsupported() +struct Context<'a> { + idx: usize, + frames: &'a mut [Frame], +} + +#[derive(Debug)] +struct UnwindError(uw::_Unwind_Reason_Code); + +impl Error for UnwindError { + fn description(&self) -> &'static str { + "unexpected return value while unwinding" + } +} + +impl ::fmt::Display for UnwindError { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + write!(f, "{}: {:?}", self.description(), self.0) + } +} + +#[inline(never)] // this function call can be skipped it when tracing. +pub fn unwind_backtrace(frames: &mut [Frame]) -> io::Result<(usize, BacktraceContext)> { + let mut cx = Context { idx: 0, frames }; + let result_unwind = + unsafe { uw::_Unwind_Backtrace(trace_fn, &mut cx as *mut Context as *mut libc::c_void) }; + // See libunwind:src/unwind/Backtrace.c for the return values. + // No, there is no doc. + let res = match result_unwind { + // These return codes seem to be benign and need to be ignored for backtraces + // to show up properly on all tested platforms. + uw::_URC_END_OF_STACK | uw::_URC_FATAL_PHASE1_ERROR | uw::_URC_FAILURE => { + Ok((cx.idx, BacktraceContext)) + } + _ => Err(io::Error::new( + io::ErrorKind::Other, + UnwindError(result_unwind), + )), + }; + res } -pub fn resolve_symname(_frame: Frame, - _callback: F, +extern "C" fn trace_fn( + ctx: *mut uw::_Unwind_Context, + arg: *mut libc::c_void, +) -> uw::_Unwind_Reason_Code { + let cx = unsafe { &mut *(arg as *mut Context) }; + if cx.idx >= cx.frames.len() { + return uw::_URC_NORMAL_STOP; + } + + let mut ip_before_insn = 0; + let mut ip = unsafe { uw::_Unwind_GetIPInfo(ctx, &mut ip_before_insn) as *mut libc::c_void }; + if !ip.is_null() && ip_before_insn == 0 { + // this is a non-signaling frame, so `ip` refers to the address + // after the calling instruction. account for that. + ip = (ip as usize - 1) as *mut _; + } + + let symaddr = unsafe { uw::_Unwind_FindEnclosingFunction(ip) }; + cx.frames[cx.idx] = Frame { + symbol_addr: symaddr as *mut u8, + exact_position: ip as *mut u8, + inline_context: 0, + }; + cx.idx += 1; + + uw::_URC_NO_REASON +} + +extern { + static IMAGE_BASE: u8; +} + + +// To reduce TCB size in Sgx enclave, we do not want to implement resolve_symname functionality. +// Rather, we print the offset of the address here, which could be later mapped to correct function. +pub fn resolve_symname(frame: Frame, + callback: F, _: &BacktraceContext) -> io::Result<()> where F: FnOnce(Option<&str>) -> io::Result<()> { - unsupported() + callback(Some(&format!("0x{:x}", + (unsafe {frame.symbol_addr.wrapping_offset_from(&IMAGE_BASE)})))) } pub fn foreach_symbol_fileline(_: Frame, @@ -23,5 +96,5 @@ pub fn foreach_symbol_fileline(_: Frame, _: &BacktraceContext) -> io::Result where F: FnMut(&[u8], u32) -> io::Result<()> { - unsupported() + Ok(false) } From 564a24c772c6eb6dcad0388a80b8987bc57bf614 Mon Sep 17 00:00:00 2001 From: Czipperz Date: Sat, 29 Dec 2018 02:09:21 -0500 Subject: [PATCH 25/86] Change std::error::Error trait documentation to talk about `source` instead of `cause` --- src/libstd/error.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libstd/error.rs b/src/libstd/error.rs index f026cadd639c3..2f9efb3f0fb57 100644 --- a/src/libstd/error.rs +++ b/src/libstd/error.rs @@ -30,17 +30,17 @@ use string; /// themselves through the [`Display`] and [`Debug`] traits, and may provide /// cause chain information: /// -/// The [`cause`] method is generally used when errors cross "abstraction -/// boundaries", i.e., when a one module must report an error that is "caused" -/// by an error from a lower-level module. This setup makes it possible for the -/// high-level module to provide its own errors that do not commit to any -/// particular implementation, but also reveal some of its implementation for -/// debugging via [`cause`] chains. +/// The [`source`] method is generally used when errors cross "abstraction +/// boundaries". If one module must report an error that is caused by an error +/// from a lower-level module, it can allow access to that error via the +/// [`source`] method. This makes it possible for the high-level module to +/// provide its own errors while also revealing some of the implementation for +/// debugging via [`source`] chains. /// /// [`Result`]: ../result/enum.Result.html /// [`Display`]: ../fmt/trait.Display.html /// [`Debug`]: ../fmt/trait.Debug.html -/// [`cause`]: trait.Error.html#method.cause +/// [`source`]: trait.Error.html#method.source #[stable(feature = "rust1", since = "1.0.0")] pub trait Error: Debug + Display { /// **This method is soft-deprecated.** From d1b65fb691b49aecc567593a14d5c6690d3fd90c Mon Sep 17 00:00:00 2001 From: varkor Date: Tue, 8 Jan 2019 23:50:51 +0000 Subject: [PATCH 26/86] Add issue reference to E0202 message --- src/librustc_typeck/collect.rs | 2 +- src/test/ui/assoc-inherent.rs | 4 ++-- src/test/ui/assoc-inherent.stderr | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 9fc2f11b19738..03945912cb4c1 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1107,7 +1107,7 @@ fn report_assoc_ty_on_inherent_impl<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, span: tcx.sess, span, E0202, - "associated types are not allowed in inherent impls" + "associated types are not yet supported in inherent impls (see #8995)" ); } diff --git a/src/test/ui/assoc-inherent.rs b/src/test/ui/assoc-inherent.rs index fe34be3731736..05329a2714257 100644 --- a/src/test/ui/assoc-inherent.rs +++ b/src/test/ui/assoc-inherent.rs @@ -1,9 +1,9 @@ -// Test associated types are forbidden in inherent impls. +// Test associated types are, until #8995 is implemented, forbidden in inherent impls. struct Foo; impl Foo { - type Bar = isize; //~ERROR associated types are not allowed in inherent impls + type Bar = isize; //~ERROR associated types are not yet supported in inherent impls (see #8995) } fn main() {} diff --git a/src/test/ui/assoc-inherent.stderr b/src/test/ui/assoc-inherent.stderr index 1a555bd53ac83..f438ac8df4a09 100644 --- a/src/test/ui/assoc-inherent.stderr +++ b/src/test/ui/assoc-inherent.stderr @@ -1,7 +1,7 @@ -error[E0202]: associated types are not allowed in inherent impls +error[E0202]: associated types are not yet supported in inherent impls (see #8995) --> $DIR/assoc-inherent.rs:6:5 | -LL | type Bar = isize; //~ERROR associated types are not allowed in inherent impls +LL | type Bar = isize; //~ERROR associated types are not yet supported in inherent impls (see #8995) | ^^^^^^^^^^^^^^^^^ error: aborting due to previous error From ac4a4547ba674b6d9d0e3b3e018be94d32766faa Mon Sep 17 00:00:00 2001 From: varkor Date: Tue, 8 Jan 2019 23:53:43 +0000 Subject: [PATCH 27/86] Consolidate equality constraints error message --- src/librustc_passes/ast_validation.rs | 5 +++-- src/test/ui/where-clauses/where-equality-constraints.stderr | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs index 584f0ba0449e1..3d0e46d998622 100644 --- a/src/librustc_passes/ast_validation.rs +++ b/src/librustc_passes/ast_validation.rs @@ -438,8 +438,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> { } for predicate in &generics.where_clause.predicates { if let WherePredicate::EqPredicate(ref predicate) = *predicate { - self.err_handler().span_err(predicate.span, "equality constraints are not yet \ - supported in where clauses (#20041)"); + self.err_handler() + .span_err(predicate.span, "equality constraints are not yet \ + supported in where clauses (see #20041)"); } } visit::walk_generics(self, generics) diff --git a/src/test/ui/where-clauses/where-equality-constraints.stderr b/src/test/ui/where-clauses/where-equality-constraints.stderr index 56caaaeee401e..220447079c629 100644 --- a/src/test/ui/where-clauses/where-equality-constraints.stderr +++ b/src/test/ui/where-clauses/where-equality-constraints.stderr @@ -1,10 +1,10 @@ -error: equality constraints are not yet supported in where clauses (#20041) +error: equality constraints are not yet supported in where clauses (see #20041) --> $DIR/where-equality-constraints.rs:1:14 | LL | fn f() where u8 = u16 {} | ^^^^^^^^ -error: equality constraints are not yet supported in where clauses (#20041) +error: equality constraints are not yet supported in where clauses (see #20041) --> $DIR/where-equality-constraints.rs:3:14 | LL | fn g() where for<'a> &'static (u8,) == u16, {} From 47db51eecee943dc2af1adc467d1ff47685e6d09 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Sun, 16 Dec 2018 17:01:57 -0800 Subject: [PATCH 28/86] Issue 56905 Adding a map to TypeckTables to get the list of all the Upvars given a closureID. This is help us get rid of the recurring pattern in the codebase of iterating over the free vars using with_freevars. --- src/librustc/ty/context.rs | 10 ++++++++++ src/librustc/ty/mod.rs | 2 ++ src/librustc_typeck/check/upvar.rs | 18 ++++++++++++------ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index c0ba4329ae05c..aebf71791bc60 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -417,6 +417,12 @@ pub struct TypeckTables<'tcx> { /// All the existential types that are restricted to concrete types /// by this function pub concrete_existential_types: FxHashMap>, + + /// Given the closure ID this map provides the list of UpvarIDs used by it. + /// The upvarID contains the HIR node ID and it also contains the full path + /// leading to the member of the struct or tuple that is used instead of the + /// entire variable. + pub upvar_list: ty::UpvarListMap<'tcx>, } impl<'tcx> TypeckTables<'tcx> { @@ -441,6 +447,7 @@ impl<'tcx> TypeckTables<'tcx> { tainted_by_errors: false, free_region_map: Default::default(), concrete_existential_types: Default::default(), + upvar_list: Default::default(), } } @@ -741,6 +748,8 @@ impl<'a, 'gcx> HashStable> for TypeckTables<'gcx> { tainted_by_errors, ref free_region_map, ref concrete_existential_types, + ref upvar_list, + } = *self; hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { @@ -783,6 +792,7 @@ impl<'a, 'gcx> HashStable> for TypeckTables<'gcx> { tainted_by_errors.hash_stable(hcx, hasher); free_region_map.hash_stable(hcx, hasher); concrete_existential_types.hash_stable(hcx, hasher); + upvar_list.hash_stable(hcx, hasher); }) } } diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index a2c96e7cf9f66..f770f2bf7b125 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -589,6 +589,8 @@ impl<'a, 'gcx> HashStable> for ty::TyS<'gcx> { pub type Ty<'tcx> = &'tcx TyS<'tcx>; +pub type UpvarListMap<'tcx> = FxHashMap>; + impl<'tcx> serialize::UseSpecializedEncodable for Ty<'tcx> {} impl<'tcx> serialize::UseSpecializedDecodable for Ty<'tcx> {} diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index 86165d50b27e4..c37e0e262cf5f 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -122,14 +122,16 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { }; self.tcx.with_freevars(closure_node_id, |freevars| { + let mut freevar_list: Vec = Vec::new(); for freevar in freevars { let upvar_id = ty::UpvarId { var_path: ty::UpvarPath { - hir_id : self.tcx.hir().node_to_hir_id(freevar.var_id()), + hir_id: self.tcx.hir().node_to_hir_id(freevar.var_id()), }, closure_expr_id: LocalDefId::from_def_id(closure_def_id), }; debug!("seed upvar_id {:?}", upvar_id); + freevar_list.push(upvar_id); let capture_kind = match capture_clause { hir::CaptureByValue => ty::UpvarCapture::ByValue, @@ -149,6 +151,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { .upvar_capture_map .insert(upvar_id, capture_kind); } + self.tables + .borrow_mut() + .upvar_list + .insert(closure_def_id, freevar_list); }); let body_owner_def_id = self.tcx.hir().body_owner_def_id(body.id()); @@ -166,7 +172,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { self.param_env, region_scope_tree, &self.tables.borrow(), - ).consume_body(body); + ) + .consume_body(body); if let Some(closure_substs) = infer_kind { // Unify the (as yet unbound) type variable in the closure @@ -240,9 +247,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { let var_hir_id = tcx.hir().node_to_hir_id(var_node_id); let freevar_ty = self.node_ty(var_hir_id); let upvar_id = ty::UpvarId { - var_path: ty::UpvarPath { - hir_id: var_hir_id, - }, + var_path: ty::UpvarPath { hir_id: var_hir_id }, closure_expr_id: LocalDefId::from_def_id(closure_def_index), }; let capture = self.tables.borrow().upvar_capture(upvar_id); @@ -262,7 +267,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { }, ), } - }).collect() + }) + .collect() }) } } From 410b52958da4434c2638da15e6c6c9a7ef665761 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Tue, 18 Dec 2018 20:54:35 -0800 Subject: [PATCH 29/86] Creating the vector using with_capacity to avoid re-allocation later on (#56905) --- src/librustc_typeck/check/upvar.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index c37e0e262cf5f..2a50f63b7925b 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -122,7 +122,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { }; self.tcx.with_freevars(closure_node_id, |freevars| { - let mut freevar_list: Vec = Vec::new(); + let mut freevar_list: Vec = Vec::with_capacity(freevars.len()); for freevar in freevars { let upvar_id = ty::UpvarId { var_path: ty::UpvarPath { @@ -131,6 +131,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { closure_expr_id: LocalDefId::from_def_id(closure_def_id), }; debug!("seed upvar_id {:?}", upvar_id); + // Adding the upvar Id to the list of Upvars, which will be added + // to the map for the closure at the end of the for loop. freevar_list.push(upvar_id); let capture_kind = match capture_clause { @@ -151,6 +153,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { .upvar_capture_map .insert(upvar_id, capture_kind); } + // Add the vector of freevars to the map keyed with the closure id. + // This gives us an easier access to them without having to call + // with_freevars again.. self.tables .borrow_mut() .upvar_list From 7853b780fc678e670362690ddeb8648d552db0bf Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Fri, 21 Dec 2018 20:00:11 -0800 Subject: [PATCH 30/86] Some more refactoring. Change the key of UpvarListMap from DefId to ast::NodeId --- src/librustc/ty/mod.rs | 3 +-- src/librustc_mir/build/mod.rs | 1 + src/librustc_typeck/check/upvar.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index f770f2bf7b125..8afe0241ac863 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -589,8 +589,6 @@ impl<'a, 'gcx> HashStable> for ty::TyS<'gcx> { pub type Ty<'tcx> = &'tcx TyS<'tcx>; -pub type UpvarListMap<'tcx> = FxHashMap>; - impl<'tcx> serialize::UseSpecializedEncodable for Ty<'tcx> {} impl<'tcx> serialize::UseSpecializedDecodable for Ty<'tcx> {} @@ -810,6 +808,7 @@ pub struct UpvarBorrow<'tcx> { pub region: ty::Region<'tcx>, } +pub type UpvarListMap<'tcx> = FxHashMap>; pub type UpvarCaptureMap<'tcx> = FxHashMap>; #[derive(Copy, Clone)] diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs index 727b769cf4d44..4b0907f808364 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir/build/mod.rs @@ -642,6 +642,7 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>, let tcx = hir.tcx(); let span = tcx.hir().span(fn_id); + // hir.tables().upvar_list[fn_id]. // Gather the upvars of a closure, if any. let upvar_decls: Vec<_> = tcx.with_freevars(fn_id, |freevars| { freevars.iter().map(|fv| { diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index 2a50f63b7925b..24d13d9c2acfa 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -159,7 +159,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { self.tables .borrow_mut() .upvar_list - .insert(closure_def_id, freevar_list); + .insert(closure_node_id, freevar_list); }); let body_owner_def_id = self.tcx.hir().body_owner_def_id(body.id()); From 15d8e8fb2b5ae3c1493b82077a2c5d3252926227 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Sat, 22 Dec 2018 15:06:14 -0800 Subject: [PATCH 31/86] [Cleanup] This is the first in the series of removals of with_freevars usage. Currently, there are many places in rustc, where we use with_freevars to iterate over freevars of a closure. The problem with this is the argument to with_freevars is a NodeId and this will get in the way of our eventual goal of solving for issue (#53488), sub-issue (#56905) --- src/librustc/ty/context.rs | 2 +- src/librustc/ty/mod.rs | 2 +- src/librustc_mir/build/mod.rs | 77 +++++++++++++------------- src/librustc_typeck/check/upvar.rs | 10 ++-- src/librustc_typeck/check/writeback.rs | 29 +++++++++- 5 files changed, 74 insertions(+), 46 deletions(-) diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index aebf71791bc60..8d4b8aae8b176 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -422,7 +422,7 @@ pub struct TypeckTables<'tcx> { /// The upvarID contains the HIR node ID and it also contains the full path /// leading to the member of the struct or tuple that is used instead of the /// entire variable. - pub upvar_list: ty::UpvarListMap<'tcx>, + pub upvar_list: ty::UpvarListMap, } impl<'tcx> TypeckTables<'tcx> { diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 8afe0241ac863..cfd99948e4370 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -808,7 +808,7 @@ pub struct UpvarBorrow<'tcx> { pub region: ty::Region<'tcx>, } -pub type UpvarListMap<'tcx> = FxHashMap>; +pub type UpvarListMap = FxHashMap>; pub type UpvarCaptureMap<'tcx> = FxHashMap>; #[derive(Copy, Clone)] diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs index 4b0907f808364..b1a377591e310 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir/build/mod.rs @@ -4,7 +4,7 @@ use hair::cx::Cx; use hair::{LintLevel, BindingMode, PatternKind}; use rustc::hir; use rustc::hir::Node; -use rustc::hir::def_id::{DefId, LocalDefId}; +use rustc::hir::def_id::DefId; use rustc::middle::region; use rustc::mir::*; use rustc::mir::visit::{MutVisitor, TyContext}; @@ -640,47 +640,49 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>, let arguments: Vec<_> = arguments.collect(); let tcx = hir.tcx(); - let span = tcx.hir().span(fn_id); + let tcx_hir = tcx.hir(); + let span = tcx_hir.span(fn_id); - // hir.tables().upvar_list[fn_id]. - // Gather the upvars of a closure, if any. - let upvar_decls: Vec<_> = tcx.with_freevars(fn_id, |freevars| { - freevars.iter().map(|fv| { - let var_id = fv.var_id(); - let var_hir_id = tcx.hir().node_to_hir_id(var_id); - let closure_expr_id = tcx.hir().local_def_id(fn_id); - let capture = hir.tables().upvar_capture(ty::UpvarId { - var_path: ty::UpvarPath {hir_id: var_hir_id}, - closure_expr_id: LocalDefId::from_def_id(closure_expr_id), - }); - let by_ref = match capture { - ty::UpvarCapture::ByValue => false, - ty::UpvarCapture::ByRef(..) => true - }; - let mut decl = UpvarDecl { - debug_name: keywords::Invalid.name(), - var_hir_id: ClearCrossCrate::Set(var_hir_id), - by_ref, - mutability: Mutability::Not, - }; - if let Some(Node::Binding(pat)) = tcx.hir().find(var_id) { - if let hir::PatKind::Binding(_, _, ident, _) = pat.node { - decl.debug_name = ident.name; + let hir_tables = hir.tables(); + let fn_def_id = tcx_hir.local_def_id(fn_id); - if let Some(&bm) = hir.tables.pat_binding_modes().get(pat.hir_id) { - if bm == ty::BindByValue(hir::MutMutable) { - decl.mutability = Mutability::Mut; + // Gather the upvars of a closure, if any. + let upvar_decls: Vec<_> = match hir_tables.upvar_list.get(&fn_def_id) { + Some(upvars) => upvars + .iter() + .map(|upvar_id| { + let var_hir_id = upvar_id.var_path.hir_id; + let var_node_id = tcx_hir.hir_to_node_id(var_hir_id); + let capture = hir_tables.upvar_capture(*upvar_id); + let by_ref = match capture { + ty::UpvarCapture::ByValue => false, + ty::UpvarCapture::ByRef(..) => true, + }; + let mut decl = UpvarDecl { + debug_name: keywords::Invalid.name(), + var_hir_id: ClearCrossCrate::Set(var_hir_id), + by_ref, + mutability: Mutability::Not, + }; + if let Some(Node::Binding(pat)) = tcx_hir.find(var_node_id) { + if let hir::PatKind::Binding(_, _, ident, _) = pat.node { + decl.debug_name = ident.name; + if let Some(&bm) = hir.tables.pat_binding_modes().get(pat.hir_id) { + if bm == ty::BindByValue(hir::MutMutable) { + decl.mutability = Mutability::Mut; + } else { + decl.mutability = Mutability::Not; + } } else { - decl.mutability = Mutability::Not; + tcx.sess.delay_span_bug(pat.span, "missing binding mode"); } - } else { - tcx.sess.delay_span_bug(pat.span, "missing binding mode"); } } - } - decl - }).collect() - }); + decl + }) + .collect(), + _ => vec![], + }; let mut builder = Builder::new(hir, span, @@ -690,7 +692,6 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>, return_ty_span, upvar_decls); - let fn_def_id = tcx.hir().local_def_id(fn_id); let call_site_scope = region::Scope { id: body.value.hir_id.local_id, data: region::ScopeData::CallSite @@ -733,7 +734,7 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>, // RustCall pseudo-ABI untuples the last argument. spread_arg = Some(Local::new(arguments.len())); } - let closure_expr_id = tcx.hir().local_def_id(fn_id); + let closure_expr_id = tcx_hir.local_def_id(fn_id); info!("fn_id {:?} has attrs {:?}", closure_expr_id, tcx.get_attrs(closure_expr_id)); diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index 24d13d9c2acfa..ffd7c2114e5ab 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -156,10 +156,12 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { // Add the vector of freevars to the map keyed with the closure id. // This gives us an easier access to them without having to call // with_freevars again.. - self.tables - .borrow_mut() - .upvar_list - .insert(closure_node_id, freevar_list); + if !freevar_list.is_empty() { + self.tables + .borrow_mut() + .upvar_list + .insert(closure_def_id, freevar_list); + } }); let body_owner_def_id = self.tcx.hir().body_owner_def_id(body.id()); diff --git a/src/librustc_typeck/check/writeback.rs b/src/librustc_typeck/check/writeback.rs index 38de936a027ff..8499a492bccec 100644 --- a/src/librustc_typeck/check/writeback.rs +++ b/src/librustc_typeck/check/writeback.rs @@ -20,6 +20,15 @@ use syntax_pos::Span; /////////////////////////////////////////////////////////////////////////// // Entry point +/// During type inference, partially inferred types are +/// represented using Type variables (ty::Infer). These don't appear in +/// the final TypeckTables since all of the types should have been +/// inferred once typeck_tables_of is done. +/// When type inference is running however, having to update the typeck +/// tables every time a new type is inferred would be unreasonably slow, +/// so instead all of the replacement happens at the end in +/// resolve_type_vars_in_body, which creates a new TypeTables which +/// doesn't contain any inference types. impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { pub fn resolve_type_vars_in_body(&self, body: &'gcx hir::Body) -> &'gcx ty::TypeckTables<'gcx> { @@ -35,7 +44,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { wbcx.visit_node_id(arg.pat.span, arg.hir_id); } wbcx.visit_body(body); - wbcx.visit_upvar_borrow_map(); + wbcx.visit_upvar_capture_map(); + wbcx.visit_upvar_list_map(); wbcx.visit_closures(); wbcx.visit_liberated_fn_sigs(); wbcx.visit_fru_field_types(); @@ -291,7 +301,7 @@ impl<'cx, 'gcx, 'tcx> Visitor<'gcx> for WritebackCx<'cx, 'gcx, 'tcx> { } impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> { - fn visit_upvar_borrow_map(&mut self) { + fn visit_upvar_capture_map(&mut self) { for (upvar_id, upvar_capture) in self.fcx.tables.borrow().upvar_capture_map.iter() { let new_upvar_capture = match *upvar_capture { ty::UpvarCapture::ByValue => ty::UpvarCapture::ByValue, @@ -314,6 +324,21 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> { } } + /// Runs through the function context's upvar list map and adds the same to + /// the TypeckTables. upvarlist is a hashmap of the list of upvars referred + /// to in a closure.. + fn visit_upvar_list_map(&mut self) { + for (closure_def_id, upvar_list) in self.fcx.tables.borrow().upvar_list.iter() { + debug!( + "UpvarIDs captured by closure {:?} are: {:?}", + closure_def_id, upvar_list + ); + self.tables + .upvar_list + .insert(*closure_def_id, upvar_list.to_vec()); + } + } + fn visit_closures(&mut self) { let fcx_tables = self.fcx.tables.borrow(); debug_assert_eq!(fcx_tables.local_id_root, self.tables.local_id_root); From 5052197e447a2279a63e8ef06179ca01b657eb9b Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Wed, 9 Jan 2019 04:17:24 +0100 Subject: [PATCH 32/86] explain safety for vec.set_len(0) --- src/liballoc/vec.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index 30bcc034221d3..0da00b70f9e51 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -816,6 +816,9 @@ impl Vec { /// let mut vec = vec![vec![1, 0, 0], /// vec![0, 1, 0], /// vec![0, 0, 1]]; + /// // SAFETY: + /// // 1. `old_len..0` is empty so no elements need to be initialized. + /// // 2. `0 <= capacity` always holds whatever `capacity` is. /// unsafe { /// vec.set_len(0); /// } From 69e491815d927b3206c8acf88fbdbed8521e5955 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Tue, 8 Jan 2019 19:13:50 -0800 Subject: [PATCH 33/86] addressing Niko's comments --- src/librustc_mir/build/mod.rs | 68 ++++++++++++++------------ src/librustc_typeck/check/writeback.rs | 18 +++---- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs index b1a377591e310..65ae111fbc0fc 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir/build/mod.rs @@ -647,42 +647,46 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>, let fn_def_id = tcx_hir.local_def_id(fn_id); // Gather the upvars of a closure, if any. - let upvar_decls: Vec<_> = match hir_tables.upvar_list.get(&fn_def_id) { - Some(upvars) => upvars - .iter() - .map(|upvar_id| { - let var_hir_id = upvar_id.var_path.hir_id; - let var_node_id = tcx_hir.hir_to_node_id(var_hir_id); - let capture = hir_tables.upvar_capture(*upvar_id); - let by_ref = match capture { - ty::UpvarCapture::ByValue => false, - ty::UpvarCapture::ByRef(..) => true, - }; - let mut decl = UpvarDecl { - debug_name: keywords::Invalid.name(), - var_hir_id: ClearCrossCrate::Set(var_hir_id), - by_ref, - mutability: Mutability::Not, - }; - if let Some(Node::Binding(pat)) = tcx_hir.find(var_node_id) { - if let hir::PatKind::Binding(_, _, ident, _) = pat.node { - decl.debug_name = ident.name; - if let Some(&bm) = hir.tables.pat_binding_modes().get(pat.hir_id) { - if bm == ty::BindByValue(hir::MutMutable) { - decl.mutability = Mutability::Mut; - } else { - decl.mutability = Mutability::Not; - } + // In analyze_closure() in upvar.rs we gathered a list of upvars used by a + // closure and we stored in a map called upvar_list in TypeckTables indexed + // with the closure's DefId. Here, we run through that vec of UpvarIds for + // the given closure and use the necessary information to create UpvarDecl. + let upvar_decls: Vec<_> = hir_tables + .upvar_list + .get(&fn_def_id) + .into_iter() + .flatten() + .map(|upvar_id| { + let var_hir_id = upvar_id.var_path.hir_id; + let var_node_id = tcx_hir.hir_to_node_id(var_hir_id); + let capture = hir_tables.upvar_capture(*upvar_id); + let by_ref = match capture { + ty::UpvarCapture::ByValue => false, + ty::UpvarCapture::ByRef(..) => true, + }; + let mut decl = UpvarDecl { + debug_name: keywords::Invalid.name(), + var_hir_id: ClearCrossCrate::Set(var_hir_id), + by_ref, + mutability: Mutability::Not, + }; + if let Some(Node::Binding(pat)) = tcx_hir.find(var_node_id) { + if let hir::PatKind::Binding(_, _, ident, _) = pat.node { + decl.debug_name = ident.name; + if let Some(&bm) = hir.tables.pat_binding_modes().get(pat.hir_id) { + if bm == ty::BindByValue(hir::MutMutable) { + decl.mutability = Mutability::Mut; } else { - tcx.sess.delay_span_bug(pat.span, "missing binding mode"); + decl.mutability = Mutability::Not; } + } else { + tcx.sess.delay_span_bug(pat.span, "missing binding mode"); } } - decl - }) - .collect(), - _ => vec![], - }; + } + decl + }) + .collect(); let mut builder = Builder::new(hir, span, diff --git a/src/librustc_typeck/check/writeback.rs b/src/librustc_typeck/check/writeback.rs index 8499a492bccec..c61159eb49481 100644 --- a/src/librustc_typeck/check/writeback.rs +++ b/src/librustc_typeck/check/writeback.rs @@ -20,16 +20,16 @@ use syntax_pos::Span; /////////////////////////////////////////////////////////////////////////// // Entry point -/// During type inference, partially inferred types are -/// represented using Type variables (ty::Infer). These don't appear in -/// the final TypeckTables since all of the types should have been -/// inferred once typeck_tables_of is done. -/// When type inference is running however, having to update the typeck -/// tables every time a new type is inferred would be unreasonably slow, -/// so instead all of the replacement happens at the end in -/// resolve_type_vars_in_body, which creates a new TypeTables which -/// doesn't contain any inference types. +// During type inference, partially inferred types are +// represented using Type variables (ty::Infer). These don't appear in +// the final TypeckTables since all of the types should have been +// inferred once typeck_tables_of is done. +// When type inference is running however, having to update the typeck +// tables every time a new type is inferred would be unreasonably slow, +// so instead all of the replacement happens at the end in +// resolve_type_vars_in_body, which creates a new TypeTables which +// doesn't contain any inference types. impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { pub fn resolve_type_vars_in_body(&self, body: &'gcx hir::Body) -> &'gcx ty::TypeckTables<'gcx> { let item_id = self.tcx.hir().body_owner(body.id()); From a89cecef0129161dd4bd85131f0ea4d6630ad194 Mon Sep 17 00:00:00 2001 From: Philipp Hansch Date: Wed, 9 Jan 2019 07:15:52 +0100 Subject: [PATCH 34/86] docs: Fix some 'second-edition' links --- src/libcore/ops/deref.rs | 4 ++-- src/libcore/ops/function.rs | 6 +++--- src/libstd/keyword_docs.rs | 8 ++++---- src/libstd/primitive_docs.rs | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libcore/ops/deref.rs b/src/libcore/ops/deref.rs index f2187bd66869e..075c3a084f41d 100644 --- a/src/libcore/ops/deref.rs +++ b/src/libcore/ops/deref.rs @@ -27,7 +27,7 @@ /// [book] as well as the reference sections on [the dereference operator] /// [ref-deref-op], [method resolution] and [type coercions]. /// -/// [book]: ../../book/second-edition/ch15-02-deref.html +/// [book]: ../../book/ch15-02-deref.html /// [`DerefMut`]: trait.DerefMut.html /// [more]: #more-on-deref-coercion /// [ref-deref-op]: ../../reference/expressions/operator-expr.html#the-dereference-operator @@ -117,7 +117,7 @@ impl Deref for &mut T { /// [book] as well as the reference sections on [the dereference operator] /// [ref-deref-op], [method resolution] and [type coercions]. /// -/// [book]: ../../book/second-edition/ch15-02-deref.html +/// [book]: ../../book/ch15-02-deref.html /// [`Deref`]: trait.Deref.html /// [more]: #more-on-deref-coercion /// [ref-deref-op]: ../../reference/expressions/operator-expr.html#the-dereference-operator diff --git a/src/libcore/ops/function.rs b/src/libcore/ops/function.rs index ec2e53412a0a5..3a1d765f7b816 100644 --- a/src/libcore/ops/function.rs +++ b/src/libcore/ops/function.rs @@ -27,7 +27,7 @@ /// `Fn(usize, bool) -> usize`). Those interested in the technical details of /// this can refer to [the relevant section in the *Rustonomicon*][nomicon]. /// -/// [book]: ../../book/second-edition/ch13-01-closures.html +/// [book]: ../../book/ch13-01-closures.html /// [`FnMut`]: trait.FnMut.html /// [`FnOnce`]: trait.FnOnce.html /// [function pointers]: ../../std/primitive.fn.html @@ -95,7 +95,7 @@ pub trait Fn : FnMut { /// `Fn(usize, bool) -> usize`). Those interested in the technical details of /// this can refer to [the relevant section in the *Rustonomicon*][nomicon]. /// -/// [book]: ../../book/second-edition/ch13-01-closures.html +/// [book]: ../../book/ch13-01-closures.html /// [`Fn`]: trait.Fn.html /// [`FnOnce`]: trait.FnOnce.html /// [function pointers]: ../../std/primitive.fn.html @@ -173,7 +173,7 @@ pub trait FnMut : FnOnce { /// `Fn(usize, bool) -> usize`). Those interested in the technical details of /// this can refer to [the relevant section in the *Rustonomicon*][nomicon]. /// -/// [book]: ../../book/second-edition/ch13-01-closures.html +/// [book]: ../../book/ch13-01-closures.html /// [`Fn`]: trait.Fn.html /// [`FnMut`]: trait.FnMut.html /// [function pointers]: ../../std/primitive.fn.html diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index 4ca62cca94bc8..262930e08c004 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -169,7 +169,7 @@ mod crate_keyword { } /// /// [Algebraic Data Types]: https://en.wikipedia.org/wiki/Algebraic_data_type /// [`Option`]: option/enum.Option.html -/// [Rust Book]: https://doc.rust-lang.org/book/second-edition/ch06-01-defining-an-enum.html +/// [Rust Book]: https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html /// [Reference]: https://doc.rust-lang.org/reference/items/enumerations.html mod enum_keyword { } @@ -211,7 +211,7 @@ mod enum_keyword { } /// For more information on FFI, check the [Rust book] or the [Reference]. /// /// [Rust book]: -/// https://doc.rust-lang.org/book/second-edition/ch19-01-unsafe-rust.html#using-extern-functions-to-call-external-code +/// https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html#using-extern-functions-to-call-external-code /// [Reference]: https://doc.rust-lang.org/reference/items/external-blocks.html mod extern_keyword { } @@ -278,7 +278,7 @@ mod extern_keyword { } /// /// [`impl`]: keyword.impl.html /// [`extern`]: keyword.extern.html -/// [Rust book]: https://doc.rust-lang.org/book/second-edition/ch03-03-how-functions-work.html +/// [Rust book]: https://doc.rust-lang.org/book/ch03-03-how-functions-work.html /// [Reference]: https://doc.rust-lang.org/reference/items/functions.html mod fn_keyword { } @@ -705,6 +705,6 @@ mod loop_keyword { } /// [Reference][reference]. /// /// [`PhantomData`]: marker/struct.PhantomData.html -/// [book]: https://doc.rust-lang.org/book/second-edition/ch05-01-defining-structs.html +/// [book]: https://doc.rust-lang.org/book/ch05-01-defining-structs.html /// [reference]: https://doc.rust-lang.org/reference/items/structs.html mod struct_keyword { } diff --git a/src/libstd/primitive_docs.rs b/src/libstd/primitive_docs.rs index 7755d9339e6f5..475c9b4aeaa4e 100644 --- a/src/libstd/primitive_docs.rs +++ b/src/libstd/primitive_docs.rs @@ -923,7 +923,7 @@ mod prim_usize { } /// For more information on how to use references, see [the book's section on "References and /// Borrowing"][book-refs]. /// -/// [book-refs]: ../book/second-edition/ch04-02-references-and-borrowing.html +/// [book-refs]: ../book/ch04-02-references-and-borrowing.html /// /// # Trait implementations /// From 4b4fc63eb7745639c76c1f8011239354a1823547 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Fri, 28 Dec 2018 20:05:22 +0100 Subject: [PATCH 35/86] Stabilize `let` bindings and destructuring in constants and const fn --- src/librustc_mir/transform/qualify_consts.rs | 221 ++++-------------- .../transform/qualify_min_const_fn.rs | 36 +-- src/libsyntax/feature_gate.rs | 5 +- src/test/compile-fail/const-fn-error.rs | 2 +- .../ctfe/const-block-non-item-statement-3.rs | 2 - .../ctfe/const-block-non-item-statement.rs | 2 - src/test/run-pass/ctfe/issue-37550.rs | 2 +- src/test/run-pass/ctfe/locals-in-const-fn.rs | 2 +- .../ui/check-static-values-constraints.rs | 9 +- .../ui/check-static-values-constraints.stderr | 62 ++++- .../const-block-non-item-statement-2.rs | 18 -- .../const-block-non-item-statement-2.stderr | 62 ----- .../const-block-non-item-statement-3.rs | 7 - .../const-block-non-item-statement-3.stderr | 35 --- .../consts/const-block-non-item-statement.rs | 22 +- .../const-block-non-item-statement.stderr | 35 --- .../assign-to-static-within-other-static-2.rs | 1 - ...ign-to-static-within-other-static-2.stderr | 2 +- .../assign-to-static-within-other-static.rs | 1 - ...ssign-to-static-within-other-static.stderr | 2 +- src/test/ui/consts/const-eval/const_let.rs | 2 - .../ui/consts/const-eval/const_let.stderr | 4 +- .../ui/consts/const-eval/infinite_loop.rs | 2 - .../ui/consts/const-eval/infinite_loop.stderr | 6 +- src/test/ui/consts/const-eval/issue-52475.rs | 2 - .../ui/consts/const-eval/issue-52475.stderr | 6 +- .../const-eval/mod-static-with-const-fn.rs | 1 - .../mod-static-with-const-fn.stderr | 4 +- src/test/ui/consts/const-eval/ub-upvars.rs | 2 +- .../ui/consts/const-fn-destructuring-arg.rs | 14 +- .../consts/const-fn-destructuring-arg.stderr | 35 --- .../ui/consts/const-fn-not-safe-for-const.rs | 8 +- .../consts/const-fn-not-safe-for-const.stderr | 52 +---- src/test/ui/consts/const_let_assign.rs | 2 - src/test/ui/consts/const_let_assign2.rs | 1 - src/test/ui/consts/const_let_assign3.rs | 5 +- src/test/ui/consts/const_let_assign3.stderr | 18 +- src/test/ui/consts/const_let_eq.rs | 2 +- src/test/ui/consts/const_let_eq_float.rs | 2 +- src/test/ui/consts/const_short_circuit.rs | 2 +- src/test/ui/consts/dangling-alloc-id-ice.rs | 2 - .../ui/consts/dangling-alloc-id-ice.stderr | 2 +- src/test/ui/consts/dangling_raw_ptr.rs | 2 - src/test/ui/consts/dangling_raw_ptr.stderr | 2 +- .../ui/consts/min_const_fn/min_const_fn.rs | 2 +- .../consts/min_const_fn/min_const_fn.stderr | 8 +- .../ui/consts/min_const_fn/mutable_borrow.rs | 8 +- .../consts/min_const_fn/mutable_borrow.stderr | 16 +- src/test/ui/consts/partial_qualif.rs | 2 - src/test/ui/consts/partial_qualif.stderr | 2 +- src/test/ui/consts/projection_qualif.rs | 2 - src/test/ui/consts/projection_qualif.stderr | 6 +- src/test/ui/consts/promote_const_let.rs | 6 +- src/test/ui/consts/promote_const_let.stderr | 18 +- src/test/ui/consts/qualif_overwrite.rs | 2 - src/test/ui/consts/qualif_overwrite.stderr | 2 +- src/test/ui/consts/qualif_overwrite_2.rs | 2 - src/test/ui/consts/qualif_overwrite_2.stderr | 2 +- .../consts/static_mut_containing_mut_ref2.rs | 2 - .../static_mut_containing_mut_ref2.stderr | 4 +- .../consts/static_mut_containing_mut_ref3.rs | 2 - .../static_mut_containing_mut_ref3.stderr | 2 +- src/test/ui/error-codes/E0010-teach.rs | 1 + src/test/ui/error-codes/E0010-teach.stderr | 14 +- src/test/ui/error-codes/E0010.rs | 1 + src/test/ui/error-codes/E0010.stderr | 11 +- .../feature-gates/feature-gate-const_let.rs | 21 -- .../feature-gate-const_let.stderr | 91 -------- .../feature-gate-underscore_const_names.rs | 2 - ...feature-gate-underscore_const_names.stderr | 2 +- src/test/ui/issues/issue-18118.rs | 5 - src/test/ui/issues/issue-18118.stderr | 60 +---- src/test/ui/issues/issue-32829-2.rs | 13 +- src/test/ui/issues/issue-32829-2.stderr | 83 +------ src/test/ui/issues/issue-37550.rs | 4 +- src/test/ui/issues/issue-37550.stderr | 6 +- src/test/ui/issues/issue-7364.rs | 1 + src/test/ui/issues/issue-7364.stderr | 10 +- src/test/ui/static/static-mut-not-constant.rs | 1 + .../ui/static/static-mut-not-constant.stderr | 11 +- src/test/ui/underscore_const_names.rs | 1 - src/test/ui/unsafe/ranged_ints2_const.rs | 2 +- src/test/ui/unsafe/ranged_ints3_const.rs | 2 +- src/test/ui/unsafe/ranged_ints4_const.rs | 2 +- src/test/ui/write-to-static-mut-in-static.rs | 2 - .../ui/write-to-static-mut-in-static.stderr | 8 +- 86 files changed, 283 insertions(+), 865 deletions(-) delete mode 100644 src/test/ui/consts/const-block-non-item-statement-2.rs delete mode 100644 src/test/ui/consts/const-block-non-item-statement-2.stderr delete mode 100644 src/test/ui/consts/const-block-non-item-statement-3.rs delete mode 100644 src/test/ui/consts/const-block-non-item-statement-3.stderr delete mode 100644 src/test/ui/consts/const-block-non-item-statement.stderr delete mode 100644 src/test/ui/consts/const-fn-destructuring-arg.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-const_let.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-const_let.stderr diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index a04dd5bb5970f..3d90e55f1e4e2 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -21,7 +21,7 @@ use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext, NonMutatingUs use rustc::middle::lang_items; use rustc::session::config::nightly_options; use syntax::ast::LitKind; -use syntax::feature_gate::{UnstableFeatures, feature_err, emit_feature_err, GateIssue}; +use syntax::feature_gate::{UnstableFeatures, emit_feature_err, GateIssue}; use syntax_pos::{Span, DUMMY_SP}; use std::fmt; @@ -104,7 +104,6 @@ struct Qualifier<'a, 'gcx: 'a+'tcx, 'tcx: 'a> { param_env: ty::ParamEnv<'tcx>, local_qualif: IndexVec>, qualif: Qualif, - const_fn_arg_vars: BitSet, temp_promotion_state: IndexVec, promotion_candidates: Vec } @@ -139,7 +138,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> { param_env, local_qualif, qualif: Qualif::empty(), - const_fn_arg_vars: BitSet::new_empty(mir.local_decls.len()), temp_promotion_state: temps, promotion_candidates: vec![] } @@ -168,26 +166,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> { } } - /// Error about extra statements in a constant. - fn statement_like(&mut self) { - self.add(Qualif::NOT_CONST); - if self.mode != Mode::Fn { - let mut err = feature_err( - &self.tcx.sess.parse_sess, - "const_let", - self.span, - GateIssue::Language, - &format!("statements in {}s are unstable", self.mode), - ); - if self.tcx.sess.teach(&err.get_code().unwrap()) { - err.note("Blocks in constants may only contain items (such as constant, function \ - definition, etc...) and a tail expression."); - err.help("To avoid it, you have to replace the non-item object."); - } - err.emit(); - } - } - /// Add the given qualification to self.qualif. fn add(&mut self, qualif: Qualif) { self.qualif = self.qualif | qualif; @@ -233,80 +211,46 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> { return; } - if self.tcx.features().const_let { - let mut dest = dest; - let index = loop { - match dest { - // with `const_let` active, we treat all locals equal - Place::Local(index) => break *index, - // projections are transparent for assignments - // we qualify the entire destination at once, even if just a field would have - // stricter qualification - Place::Projection(proj) => { - // Catch more errors in the destination. `visit_place` also checks various - // projection rules like union field access and raw pointer deref - self.visit_place( - dest, - PlaceContext::MutatingUse(MutatingUseContext::Store), - location - ); - dest = &proj.base; - }, - Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"), - Place::Static(..) => { - // Catch more errors in the destination. `visit_place` also checks that we - // do not try to access statics from constants or try to mutate statics - self.visit_place( - dest, - PlaceContext::MutatingUse(MutatingUseContext::Store), - location - ); - return; - } + let mut dest = dest; + let index = loop { + match dest { + // We treat all locals equal in constants + Place::Local(index) => break *index, + // projections are transparent for assignments + // we qualify the entire destination at once, even if just a field would have + // stricter qualification + Place::Projection(proj) => { + // Catch more errors in the destination. `visit_place` also checks various + // projection rules like union field access and raw pointer deref + self.visit_place( + dest, + PlaceContext::MutatingUse(MutatingUseContext::Store), + location + ); + dest = &proj.base; + }, + Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"), + Place::Static(..) => { + // Catch more errors in the destination. `visit_place` also checks that we + // do not try to access statics from constants or try to mutate statics + self.visit_place( + dest, + PlaceContext::MutatingUse(MutatingUseContext::Store), + location + ); + return; } - }; - debug!("store to var {:?}", index); - match &mut self.local_qualif[index] { - // this is overly restrictive, because even full assignments do not clear the qualif - // While we could special case full assignments, this would be inconsistent with - // aggregates where we overwrite all fields via assignments, which would not get - // that feature. - Some(ref mut qualif) => *qualif = *qualif | self.qualif, - // insert new qualification - qualif @ None => *qualif = Some(self.qualif), - } - return; - } - - match *dest { - Place::Local(index) if self.mir.local_kind(index) == LocalKind::Temp || - self.mir.local_kind(index) == LocalKind::ReturnPointer => { - debug!("store to {:?} (temp or return pointer)", index); - store(&mut self.local_qualif[index]) - } - - Place::Projection(box Projection { - base: Place::Local(index), - elem: ProjectionElem::Deref - }) if self.mir.local_kind(index) == LocalKind::Temp - && self.mir.local_decls[index].ty.is_box() - && self.local_qualif[index].map_or(false, |qualif| { - qualif.contains(Qualif::NOT_CONST) - }) => { - // Part of `box expr`, we should've errored - // already for the Box allocation Rvalue. - } - - // This must be an explicit assignment. - _ => { - // Catch more errors in the destination. - self.visit_place( - dest, - PlaceContext::MutatingUse(MutatingUseContext::Store), - location - ); - self.statement_like(); } + }; + debug!("store to var {:?}", index); + match &mut self.local_qualif[index] { + // this is overly restrictive, because even full assignments do not clear the qualif + // While we could special case full assignments, this would be inconsistent with + // aggregates where we overwrite all fields via assignments, which would not get + // that feature. + Some(ref mut qualif) => *qualif = *qualif | self.qualif, + // insert new qualification + qualif @ None => *qualif = Some(self.qualif), } } @@ -347,45 +291,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> { TerminatorKind::FalseUnwind { .. } => None, TerminatorKind::Return => { - if !self.tcx.features().const_let { - // Check for unused values. This usually means - // there are extra statements in the AST. - for temp in mir.temps_iter() { - if self.local_qualif[temp].is_none() { - continue; - } - - let state = self.temp_promotion_state[temp]; - if let TempState::Defined { location, uses: 0 } = state { - let data = &mir[location.block]; - let stmt_idx = location.statement_index; - - // Get the span for the initialization. - let source_info = if stmt_idx < data.statements.len() { - data.statements[stmt_idx].source_info - } else { - data.terminator().source_info - }; - self.span = source_info.span; - - // Treat this as a statement in the AST. - self.statement_like(); - } - } - - // Make sure there are no extra unassigned variables. - self.qualif = Qualif::NOT_CONST; - for index in mir.vars_iter() { - if !self.const_fn_arg_vars.contains(index) { - debug!("unassigned variable {:?}", index); - self.assign(&Place::Local(index), Location { - block: bb, - statement_index: usize::MAX, - }); - } - } - } - break; } }; @@ -454,12 +359,8 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> { LocalKind::ReturnPointer => { self.not_const(); } - LocalKind::Var if !self.tcx.features().const_let => { - if self.mode != Mode::Fn { - emit_feature_err(&self.tcx.sess.parse_sess, "const_let", - self.span, GateIssue::Language, - &format!("let bindings in {}s are unstable",self.mode)); - } + LocalKind::Arg | + LocalKind::Var if self.mode == Mode::Fn => { self.add(Qualif::NOT_CONST); } LocalKind::Var | @@ -1168,46 +1069,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> { debug!("visit_assign: dest={:?} rvalue={:?} location={:?}", dest, rvalue, location); self.visit_rvalue(rvalue, location); - // Check the allowed const fn argument forms. - if let (Mode::ConstFn, &Place::Local(index)) = (self.mode, dest) { - if self.mir.local_kind(index) == LocalKind::Var && - self.const_fn_arg_vars.insert(index) && - !self.tcx.features().const_let { - // Direct use of an argument is permitted. - match *rvalue { - Rvalue::Use(Operand::Copy(Place::Local(local))) | - Rvalue::Use(Operand::Move(Place::Local(local))) => { - if self.mir.local_kind(local) == LocalKind::Arg { - return; - } - } - _ => {} - } - // Avoid a generic error for other uses of arguments. - if self.qualif.contains(Qualif::FN_ARGUMENT) { - let decl = &self.mir.local_decls[index]; - let mut err = feature_err( - &self.tcx.sess.parse_sess, - "const_let", - decl.source_info.span, - GateIssue::Language, - "arguments of constant functions can only be immutable by-value bindings" - ); - if self.tcx.sess.teach(&err.get_code().unwrap()) { - err.note("Constant functions are not allowed to mutate anything. Thus, \ - binding to an argument with a mutable pattern is not allowed."); - err.note("Remove any mutable bindings from the argument list to fix this \ - error. In case you need to mutate the argument, try lazily \ - initializing a global variable instead of using a const fn, or \ - refactoring the code to a functional style to avoid mutation if \ - possible."); - } - err.emit(); - return; - } - } - } - self.assign(dest, location); } diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index c1c5b18915aed..6df6841f869f2 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -65,12 +65,6 @@ pub fn is_min_const_fn( } } - for local in mir.vars_iter() { - return Err(( - mir.local_decls[local].source_info.span, - "local variables in const fn are unstable".into(), - )); - } for local in &mir.local_decls { check_ty(tcx, local.ty, local.source_info.span)?; } @@ -147,7 +141,7 @@ fn check_rvalue( check_operand(tcx, mir, operand, span) } Rvalue::Len(place) | Rvalue::Discriminant(place) | Rvalue::Ref(_, _, place) => { - check_place(tcx, mir, place, span, PlaceMode::Read) + check_place(tcx, mir, place, span) } Rvalue::Cast(CastKind::Misc, operand, cast_ty) => { use rustc::ty::cast::CastTy; @@ -213,11 +207,6 @@ fn check_rvalue( } } -enum PlaceMode { - Assign, - Read, -} - fn check_statement( tcx: TyCtxt<'a, 'tcx, 'tcx>, mir: &'a Mir<'tcx>, @@ -226,11 +215,11 @@ fn check_statement( let span = statement.source_info.span; match &statement.kind { StatementKind::Assign(place, rval) => { - check_place(tcx, mir, place, span, PlaceMode::Assign)?; + check_place(tcx, mir, place, span)?; check_rvalue(tcx, mir, rval, span) } - StatementKind::FakeRead(_, place) => check_place(tcx, mir, place, span, PlaceMode::Read), + StatementKind::FakeRead(_, place) => check_place(tcx, mir, place, span), // just an assignment StatementKind::SetDiscriminant { .. } => Ok(()), @@ -256,7 +245,7 @@ fn check_operand( ) -> McfResult { match operand { Operand::Move(place) | Operand::Copy(place) => { - check_place(tcx, mir, place, span, PlaceMode::Read) + check_place(tcx, mir, place, span) } Operand::Constant(_) => Ok(()), } @@ -267,25 +256,16 @@ fn check_place( mir: &'a Mir<'tcx>, place: &Place<'tcx>, span: Span, - mode: PlaceMode, ) -> McfResult { match place { - Place::Local(l) => match mode { - PlaceMode::Assign => match mir.local_kind(*l) { - LocalKind::Temp | LocalKind::ReturnPointer => Ok(()), - LocalKind::Arg | LocalKind::Var => { - Err((span, "assignments in const fn are unstable".into())) - } - }, - PlaceMode::Read => Ok(()), - }, + Place::Local(_) => Ok(()), // promoteds are always fine, they are essentially constants Place::Promoted(_) => Ok(()), Place::Static(_) => Err((span, "cannot access `static` items in const fn".into())), Place::Projection(proj) => { match proj.elem { | ProjectionElem::Deref | ProjectionElem::Field(..) | ProjectionElem::Index(_) => { - check_place(tcx, mir, &proj.base, span, mode) + check_place(tcx, mir, &proj.base, span) } // slice patterns are unstable | ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => { @@ -311,10 +291,10 @@ fn check_terminator( | TerminatorKind::Resume => Ok(()), TerminatorKind::Drop { location, .. } => { - check_place(tcx, mir, location, span, PlaceMode::Read) + check_place(tcx, mir, location, span) } TerminatorKind::DropAndReplace { location, value, .. } => { - check_place(tcx, mir, location, span, PlaceMode::Read)?; + check_place(tcx, mir, location, span)?; check_operand(tcx, mir, value, span) }, diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index cddec3eb23a5a..15cf4334154da 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -193,9 +193,6 @@ declare_features! ( // Allows the definition of `const` functions with some advanced features. (active, const_fn, "1.2.0", Some(24111), None), - // Allows let bindings and destructuring in `const` functions and constants. - (active, const_let, "1.22.1", Some(48821), None), - // Allows accessing fields of unions inside `const` functions. (active, const_fn_union, "1.27.0", Some(51909), None), @@ -688,6 +685,8 @@ declare_features! ( (accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None), // `#[cfg_attr(predicate, multiple, attributes, here)]` (accepted, cfg_attr_multi, "1.33.0", Some(54881), None), + // Allows let bindings and destructuring in `const` functions and constants. + (accepted, const_let, "1.33.0", Some(48821), None), ); // If you change this, please modify `src/doc/unstable-book` as well. You must diff --git a/src/test/compile-fail/const-fn-error.rs b/src/test/compile-fail/const-fn-error.rs index 9913138693c94..da6036a04a549 100644 --- a/src/test/compile-fail/const-fn-error.rs +++ b/src/test/compile-fail/const-fn-error.rs @@ -1,4 +1,4 @@ -#![feature(const_fn, const_let)] +#![feature(const_fn)] const X : usize = 2; diff --git a/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs b/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs index 90295414d3efc..54ed2efa50bbd 100644 --- a/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs +++ b/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs @@ -1,8 +1,6 @@ // run-pass #![allow(dead_code)] -#![feature(const_let)] - type Array = [u32; { let x = 2; 5 }]; pub fn main() {} diff --git a/src/test/run-pass/ctfe/const-block-non-item-statement.rs b/src/test/run-pass/ctfe/const-block-non-item-statement.rs index 21ce08ab69c73..92bf5ae7b97e7 100644 --- a/src/test/run-pass/ctfe/const-block-non-item-statement.rs +++ b/src/test/run-pass/ctfe/const-block-non-item-statement.rs @@ -1,8 +1,6 @@ // run-pass #![allow(dead_code)] -#![feature(const_let)] - enum Foo { Bar = { let x = 1; 3 } } diff --git a/src/test/run-pass/ctfe/issue-37550.rs b/src/test/run-pass/ctfe/issue-37550.rs index 732c34dff5a80..04865830df2eb 100644 --- a/src/test/run-pass/ctfe/issue-37550.rs +++ b/src/test/run-pass/ctfe/issue-37550.rs @@ -2,7 +2,7 @@ #![allow(dead_code)] #![allow(unused_variables)] -#![feature(const_fn, const_let)] +#![feature(const_fn)] const fn x() { let t = true; diff --git a/src/test/run-pass/ctfe/locals-in-const-fn.rs b/src/test/run-pass/ctfe/locals-in-const-fn.rs index e527e1e88c8da..27e93b913f844 100644 --- a/src/test/run-pass/ctfe/locals-in-const-fn.rs +++ b/src/test/run-pass/ctfe/locals-in-const-fn.rs @@ -2,7 +2,7 @@ // https://github.com/rust-lang/rust/issues/48821 -#![feature(const_fn, const_let)] +#![feature(const_fn)] const fn foo(i: usize) -> usize { let x = i; diff --git a/src/test/ui/check-static-values-constraints.rs b/src/test/ui/check-static-values-constraints.rs index eb0fc39e1bf15..acfb3b5e44bab 100644 --- a/src/test/ui/check-static-values-constraints.rs +++ b/src/test/ui/check-static-values-constraints.rs @@ -78,6 +78,7 @@ struct MyOwned; static STATIC11: Box = box MyOwned; //~^ ERROR allocations are not allowed in statics +//~| ERROR static contains unimplemented expression type static mut STATIC12: UnsafeStruct = UnsafeStruct; @@ -92,12 +93,16 @@ static mut STATIC14: SafeStruct = SafeStruct { static STATIC15: &'static [Box] = &[ box MyOwned, //~ ERROR allocations are not allowed in statics + //~| ERROR contains unimplemented expression box MyOwned, //~ ERROR allocations are not allowed in statics + //~| ERROR contains unimplemented expression ]; static STATIC16: (&'static Box, &'static Box) = ( &box MyOwned, //~ ERROR allocations are not allowed in statics + //~| ERROR contains unimplemented expression &box MyOwned, //~ ERROR allocations are not allowed in statics + //~| ERROR contains unimplemented expression ); static mut STATIC17: SafeEnum = SafeEnum::Variant1; @@ -105,9 +110,11 @@ static mut STATIC17: SafeEnum = SafeEnum::Variant1; static STATIC19: Box = box 3; //~^ ERROR allocations are not allowed in statics + //~| ERROR contains unimplemented expression pub fn main() { let y = { static x: Box = box 3; x }; //~^ ERROR allocations are not allowed in statics - //~^^ ERROR cannot move out of static item + //~| ERROR cannot move out of static item + //~| ERROR contains unimplemented expression } diff --git a/src/test/ui/check-static-values-constraints.stderr b/src/test/ui/check-static-values-constraints.stderr index 450a9ba0c0d11..5b1f265c34aef 100644 --- a/src/test/ui/check-static-values-constraints.stderr +++ b/src/test/ui/check-static-values-constraints.stderr @@ -13,55 +13,97 @@ error[E0010]: allocations are not allowed in statics LL | static STATIC11: Box = box MyOwned; | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:79:37 + | +LL | static STATIC11: Box = box MyOwned; + | ^^^^^^^ + error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/check-static-values-constraints.rs:89:32 + --> $DIR/check-static-values-constraints.rs:90:32 | LL | field2: SafeEnum::Variant4("str".to_string()) | ^^^^^^^^^^^^^^^^^ error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:94:5 + --> $DIR/check-static-values-constraints.rs:95:5 | LL | box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:95:9 + | +LL | box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:95:5 + --> $DIR/check-static-values-constraints.rs:97:5 | LL | box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:97:9 + | +LL | box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:99:6 + --> $DIR/check-static-values-constraints.rs:102:6 | LL | &box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:102:10 + | +LL | &box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:100:6 + --> $DIR/check-static-values-constraints.rs:104:6 | LL | &box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:104:10 + | +LL | &box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:106:5 + --> $DIR/check-static-values-constraints.rs:111:5 | LL | box 3; | ^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:111:9 + | +LL | box 3; + | ^ + error[E0507]: cannot move out of static item - --> $DIR/check-static-values-constraints.rs:110:45 + --> $DIR/check-static-values-constraints.rs:116:45 | LL | let y = { static x: Box = box 3; x }; | ^ cannot move out of static item error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:110:38 + --> $DIR/check-static-values-constraints.rs:116:38 | LL | let y = { static x: Box = box 3; x }; | ^^^^^ allocation not allowed in statics -error: aborting due to 10 previous errors +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:116:42 + | +LL | let y = { static x: Box = box 3; x }; + | ^ + +error: aborting due to 17 previous errors -Some errors occurred: E0010, E0015, E0493, E0507. +Some errors occurred: E0010, E0015, E0019, E0493, E0507. For more information about an error, try `rustc --explain E0010`. diff --git a/src/test/ui/consts/const-block-non-item-statement-2.rs b/src/test/ui/consts/const-block-non-item-statement-2.rs deleted file mode 100644 index 58a6cf6dcfdeb..0000000000000 --- a/src/test/ui/consts/const-block-non-item-statement-2.rs +++ /dev/null @@ -1,18 +0,0 @@ -const A: usize = { 1; 2 }; -//~^ ERROR statements in constants are unstable - -const B: usize = { { } 2 }; -//~^ ERROR statements in constants are unstable - -macro_rules! foo { - () => (()) //~ ERROR statements in constants are unstable -} -const C: usize = { foo!(); 2 }; - -const D: usize = { let x = 4; 2 }; -//~^ ERROR let bindings in constants are unstable -//~| ERROR statements in constants are unstable -//~| ERROR let bindings in constants are unstable -//~| ERROR statements in constants are unstable - -pub fn main() {} diff --git a/src/test/ui/consts/const-block-non-item-statement-2.stderr b/src/test/ui/consts/const-block-non-item-statement-2.stderr deleted file mode 100644 index e0c61a953f50b..0000000000000 --- a/src/test/ui/consts/const-block-non-item-statement-2.stderr +++ /dev/null @@ -1,62 +0,0 @@ -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:1:20 - | -LL | const A: usize = { 1; 2 }; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:4:20 - | -LL | const B: usize = { { } 2 }; - | ^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:8:12 - | -LL | () => (()) //~ ERROR statements in constants are unstable - | ^^ -LL | } -LL | const C: usize = { foo!(); 2 }; - | ------- in this macro invocation - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:12:28 - | -LL | const D: usize = { let x = 4; 2 }; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:12:28 - | -LL | const D: usize = { let x = 4; 2 }; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:12:1 - | -LL | const D: usize = { let x = 4; 2 }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-2.rs:12:1 - | -LL | const D: usize = { let x = 4; 2 }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 7 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-block-non-item-statement-3.rs b/src/test/ui/consts/const-block-non-item-statement-3.rs deleted file mode 100644 index 867840925b2d5..0000000000000 --- a/src/test/ui/consts/const-block-non-item-statement-3.rs +++ /dev/null @@ -1,7 +0,0 @@ -type Array = [u32; { let x = 2; 5 }]; -//~^ ERROR let bindings in constants are unstable -//~| ERROR statements in constants are unstable -//~| ERROR let bindings in constants are unstable -//~| ERROR statements in constants are unstable - -pub fn main() {} diff --git a/src/test/ui/consts/const-block-non-item-statement-3.stderr b/src/test/ui/consts/const-block-non-item-statement-3.stderr deleted file mode 100644 index 0a549bc0c8ded..0000000000000 --- a/src/test/ui/consts/const-block-non-item-statement-3.stderr +++ /dev/null @@ -1,35 +0,0 @@ -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-3.rs:1:31 - | -LL | type Array = [u32; { let x = 2; 5 }]; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-3.rs:1:31 - | -LL | type Array = [u32; { let x = 2; 5 }]; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-3.rs:1:20 - | -LL | type Array = [u32; { let x = 2; 5 }]; - | ^^^^^^^^^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement-3.rs:1:20 - | -LL | type Array = [u32; { let x = 2; 5 }]; - | ^^^^^^^^^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-block-non-item-statement.rs b/src/test/ui/consts/const-block-non-item-statement.rs index 2db9e2413e5b5..5ecf9a049842d 100644 --- a/src/test/ui/consts/const-block-non-item-statement.rs +++ b/src/test/ui/consts/const-block-non-item-statement.rs @@ -1,9 +1,23 @@ +// compile-pass + enum Foo { Bar = { let x = 1; 3 } - //~^ ERROR let bindings in constants are unstable - //~| ERROR statements in constants are unstable - //~| ERROR let bindings in constants are unstable - //~| ERROR statements in constants are unstable } + +const A: usize = { 1; 2 }; + +const B: usize = { { } 2 }; + +macro_rules! foo { + () => (()) +} + +const C: usize = { foo!(); 2 }; + +const D: usize = { let x = 4; 2 }; + +type Array = [u32; { let x = 2; 5 }]; +type Array2 = [u32; { let mut x = 2; x = 3; x}]; + pub fn main() {} diff --git a/src/test/ui/consts/const-block-non-item-statement.stderr b/src/test/ui/consts/const-block-non-item-statement.stderr deleted file mode 100644 index f0d751e07561c..0000000000000 --- a/src/test/ui/consts/const-block-non-item-statement.stderr +++ /dev/null @@ -1,35 +0,0 @@ -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement.rs:2:21 - | -LL | Bar = { let x = 1; 3 } - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement.rs:2:21 - | -LL | Bar = { let x = 1; 3 } - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement.rs:2:11 - | -LL | Bar = { let x = 1; 3 } - | ^^^^^^^^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/const-block-non-item-statement.rs:2:11 - | -LL | Bar = { let x = 1; 3 } - | ^^^^^^^^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.rs b/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.rs index ba8d032367ef8..4d3c714481a29 100644 --- a/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.rs +++ b/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.rs @@ -2,7 +2,6 @@ // The test should never compile successfully #![feature(const_raw_ptr_deref)] -#![feature(const_let)] use std::cell::UnsafeCell; diff --git a/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.stderr b/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.stderr index 6ca9d688bd062..be1be6c060071 100644 --- a/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.stderr +++ b/src/test/ui/consts/const-eval/assign-to-static-within-other-static-2.stderr @@ -1,5 +1,5 @@ error[E0019]: static contains unimplemented expression type - --> $DIR/assign-to-static-within-other-static-2.rs:17:5 + --> $DIR/assign-to-static-within-other-static-2.rs:16:5 | LL | *FOO.0.get() = 5; //~ ERROR contains unimplemented expression type | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/const-eval/assign-to-static-within-other-static.rs b/src/test/ui/consts/const-eval/assign-to-static-within-other-static.rs index 9fe17bfc6a06e..b4c416b1c55f0 100644 --- a/src/test/ui/consts/const-eval/assign-to-static-within-other-static.rs +++ b/src/test/ui/consts/const-eval/assign-to-static-within-other-static.rs @@ -2,7 +2,6 @@ // The test should never compile successfully #![feature(const_raw_ptr_deref)] -#![feature(const_let)] use std::cell::UnsafeCell; diff --git a/src/test/ui/consts/const-eval/assign-to-static-within-other-static.stderr b/src/test/ui/consts/const-eval/assign-to-static-within-other-static.stderr index 2ab9765305f47..31e49dc10ca60 100644 --- a/src/test/ui/consts/const-eval/assign-to-static-within-other-static.stderr +++ b/src/test/ui/consts/const-eval/assign-to-static-within-other-static.stderr @@ -1,5 +1,5 @@ error: cannot mutate statics in the initializer of another static - --> $DIR/assign-to-static-within-other-static.rs:11:5 + --> $DIR/assign-to-static-within-other-static.rs:10:5 | LL | FOO = 5; //~ ERROR cannot mutate statics in the initializer of another static | ^^^^^^^ diff --git a/src/test/ui/consts/const-eval/const_let.rs b/src/test/ui/consts/const-eval/const_let.rs index 9e6952733bb0b..63321b9120076 100644 --- a/src/test/ui/consts/const-eval/const_let.rs +++ b/src/test/ui/consts/const-eval/const_let.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - fn main() {} struct FakeNeedsDrop; diff --git a/src/test/ui/consts/const-eval/const_let.stderr b/src/test/ui/consts/const-eval/const_let.stderr index e128ca07d8659..00de97e6fb3a0 100644 --- a/src/test/ui/consts/const-eval/const_let.stderr +++ b/src/test/ui/consts/const-eval/const_let.stderr @@ -1,11 +1,11 @@ error[E0019]: constant contains unimplemented expression type - --> $DIR/const_let.rs:15:55 + --> $DIR/const_let.rs:13:55 | LL | const Y: FakeNeedsDrop = { let mut x = FakeNeedsDrop; x = FakeNeedsDrop; x }; | ^ error[E0019]: constant contains unimplemented expression type - --> $DIR/const_let.rs:19:35 + --> $DIR/const_let.rs:17:35 | LL | const Z: () = { let mut x = None; x = Some(FakeNeedsDrop); }; | ^ diff --git a/src/test/ui/consts/const-eval/infinite_loop.rs b/src/test/ui/consts/const-eval/infinite_loop.rs index 0d5530acc9582..a2a45af7cb086 100644 --- a/src/test/ui/consts/const-eval/infinite_loop.rs +++ b/src/test/ui/consts/const-eval/infinite_loop.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - fn main() { // Tests the Collatz conjecture with an incorrect base case (0 instead of 1). // The value of `n` will loop indefinitely (4 - 2 - 1 - 4). diff --git a/src/test/ui/consts/const-eval/infinite_loop.stderr b/src/test/ui/consts/const-eval/infinite_loop.stderr index 90d2159d7b551..422c2bab6ea90 100644 --- a/src/test/ui/consts/const-eval/infinite_loop.stderr +++ b/src/test/ui/consts/const-eval/infinite_loop.stderr @@ -1,5 +1,5 @@ error[E0019]: constant contains unimplemented expression type - --> $DIR/infinite_loop.rs:9:9 + --> $DIR/infinite_loop.rs:7:9 | LL | / while n != 0 { //~ ERROR constant contains unimplemented expression type LL | | n = if n % 2 == 0 { n/2 } else { 3*n + 1 }; @@ -8,7 +8,7 @@ LL | | } | |_________^ warning: Constant evaluating a complex constant, this might take some time - --> $DIR/infinite_loop.rs:6:18 + --> $DIR/infinite_loop.rs:4:18 | LL | let _ = [(); { | __________________^ @@ -21,7 +21,7 @@ LL | | }]; | |_____^ error[E0080]: evaluation of constant value failed - --> $DIR/infinite_loop.rs:10:20 + --> $DIR/infinite_loop.rs:8:20 | LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 }; | ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate diff --git a/src/test/ui/consts/const-eval/issue-52475.rs b/src/test/ui/consts/const-eval/issue-52475.rs index 2e3d6fb9e84be..aafdd5fe61782 100644 --- a/src/test/ui/consts/const-eval/issue-52475.rs +++ b/src/test/ui/consts/const-eval/issue-52475.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - fn main() { let _ = [(); { //~^ WARNING Constant evaluating a complex constant, this might take some time diff --git a/src/test/ui/consts/const-eval/issue-52475.stderr b/src/test/ui/consts/const-eval/issue-52475.stderr index 329ea8a21f989..4f1b2ab4c8f46 100644 --- a/src/test/ui/consts/const-eval/issue-52475.stderr +++ b/src/test/ui/consts/const-eval/issue-52475.stderr @@ -1,5 +1,5 @@ error[E0019]: constant contains unimplemented expression type - --> $DIR/issue-52475.rs:8:9 + --> $DIR/issue-52475.rs:6:9 | LL | / while n < 5 { //~ ERROR constant contains unimplemented expression type LL | | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed @@ -8,7 +8,7 @@ LL | | } | |_________^ warning: Constant evaluating a complex constant, this might take some time - --> $DIR/issue-52475.rs:4:18 + --> $DIR/issue-52475.rs:2:18 | LL | let _ = [(); { | __________________^ @@ -21,7 +21,7 @@ LL | | }]; | |_____^ error[E0080]: evaluation of constant value failed - --> $DIR/issue-52475.rs:9:17 + --> $DIR/issue-52475.rs:7:17 | LL | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed | ^^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate diff --git a/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs b/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs index 62090f4180d36..32f0062168b3d 100644 --- a/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs +++ b/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs @@ -2,7 +2,6 @@ // The test should never compile successfully #![feature(const_raw_ptr_deref)] -#![feature(const_let)] use std::cell::UnsafeCell; diff --git a/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr b/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr index 12d6e3be40a99..9fad6868d2038 100644 --- a/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr +++ b/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr @@ -1,11 +1,11 @@ error[E0019]: static contains unimplemented expression type - --> $DIR/mod-static-with-const-fn.rs:19:5 + --> $DIR/mod-static-with-const-fn.rs:18:5 | LL | *FOO.0.get() = 5; | ^^^^^^^^^^^^^^^^ error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/mod-static-with-const-fn.rs:22:5 + --> $DIR/mod-static-with-const-fn.rs:21:5 | LL | foo(); | ^^^^^ diff --git a/src/test/ui/consts/const-eval/ub-upvars.rs b/src/test/ui/consts/const-eval/ub-upvars.rs index 16df0c1b0cc0e..9b7bca6b72d61 100644 --- a/src/test/ui/consts/const-eval/ub-upvars.rs +++ b/src/test/ui/consts/const-eval/ub-upvars.rs @@ -1,4 +1,4 @@ -#![feature(const_transmute,const_let)] +#![feature(const_transmute)] #![allow(const_err)] // make sure we cannot allow away the errors tested here use std::mem; diff --git a/src/test/ui/consts/const-fn-destructuring-arg.rs b/src/test/ui/consts/const-fn-destructuring-arg.rs index 7f818079a19d1..dcf89f90e31da 100644 --- a/src/test/ui/consts/const-fn-destructuring-arg.rs +++ b/src/test/ui/consts/const-fn-destructuring-arg.rs @@ -1,17 +1,7 @@ -// test that certain things are disallowed in constant functions +// compile-pass -#![feature(const_fn)] - -// no destructuring -const fn i(( - a, - //~^ ERROR arguments of constant functions can only be immutable by-value bindings - b - //~^ ERROR arguments of constant functions can only be immutable by-value bindings - ): (u32, u32)) -> u32 { +const fn i((a, b): (u32, u32)) -> u32 { a + b - //~^ ERROR let bindings in constant functions are unstable - //~| ERROR let bindings in constant functions are unstable } fn main() {} diff --git a/src/test/ui/consts/const-fn-destructuring-arg.stderr b/src/test/ui/consts/const-fn-destructuring-arg.stderr deleted file mode 100644 index db63e8308045a..0000000000000 --- a/src/test/ui/consts/const-fn-destructuring-arg.stderr +++ /dev/null @@ -1,35 +0,0 @@ -error[E0658]: arguments of constant functions can only be immutable by-value bindings (see issue #48821) - --> $DIR/const-fn-destructuring-arg.rs:7:13 - | -LL | a, - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: arguments of constant functions can only be immutable by-value bindings (see issue #48821) - --> $DIR/const-fn-destructuring-arg.rs:9:13 - | -LL | b - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-destructuring-arg.rs:12:5 - | -LL | a + b - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-destructuring-arg.rs:12:9 - | -LL | a + b - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-fn-not-safe-for-const.rs b/src/test/ui/consts/const-fn-not-safe-for-const.rs index fe672e7b3e6da..085ff5c58e60c 100644 --- a/src/test/ui/consts/const-fn-not-safe-for-const.rs +++ b/src/test/ui/consts/const-fn-not-safe-for-const.rs @@ -27,13 +27,9 @@ const fn get_Y_addr() -> &'static u32 { } const fn get() -> u32 { - let x = 22; //~ ERROR let bindings in constant functions are unstable -//~^ ERROR statements in constant functions - let y = 44; //~ ERROR let bindings in constant functions are unstable -//~^ ERROR statements in constant functions + let x = 22; + let y = 44; x + y -//~^ ERROR let bindings in constant functions are unstable -//~| ERROR let bindings in constant functions are unstable } fn main() {} diff --git a/src/test/ui/consts/const-fn-not-safe-for-const.stderr b/src/test/ui/consts/const-fn-not-safe-for-const.stderr index 8cc4c38526238..2003b137c272b 100644 --- a/src/test/ui/consts/const-fn-not-safe-for-const.stderr +++ b/src/test/ui/consts/const-fn-not-safe-for-const.stderr @@ -16,55 +16,7 @@ error[E0013]: constant functions cannot refer to statics, use a constant instead LL | &Y | ^^ -error[E0658]: let bindings in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-not-safe-for-const.rs:30:13 - | -LL | let x = 22; //~ ERROR let bindings in constant functions are unstable - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-not-safe-for-const.rs:30:13 - | -LL | let x = 22; //~ ERROR let bindings in constant functions are unstable - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-not-safe-for-const.rs:32:13 - | -LL | let y = 44; //~ ERROR let bindings in constant functions are unstable - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-not-safe-for-const.rs:32:13 - | -LL | let y = 44; //~ ERROR let bindings in constant functions are unstable - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-not-safe-for-const.rs:34:5 - | -LL | x + y - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constant functions are unstable (see issue #48821) - --> $DIR/const-fn-not-safe-for-const.rs:34:9 - | -LL | x + y - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 9 previous errors +error: aborting due to 3 previous errors -Some errors occurred: E0013, E0015, E0658. +Some errors occurred: E0013, E0015. For more information about an error, try `rustc --explain E0013`. diff --git a/src/test/ui/consts/const_let_assign.rs b/src/test/ui/consts/const_let_assign.rs index a3c53a451e106..0b09b8469fd75 100644 --- a/src/test/ui/consts/const_let_assign.rs +++ b/src/test/ui/consts/const_let_assign.rs @@ -1,7 +1,5 @@ // compile-pass -#![feature(const_let)] - struct S(i32); const A: () = { diff --git a/src/test/ui/consts/const_let_assign2.rs b/src/test/ui/consts/const_let_assign2.rs index 0de7396501adc..7839aafe5efa6 100644 --- a/src/test/ui/consts/const_let_assign2.rs +++ b/src/test/ui/consts/const_let_assign2.rs @@ -1,6 +1,5 @@ // compile-pass -#![feature(const_let)] #![feature(const_fn)] pub struct AA { diff --git a/src/test/ui/consts/const_let_assign3.rs b/src/test/ui/consts/const_let_assign3.rs index c2ed6cd85ab5c..dd0705edfe78d 100644 --- a/src/test/ui/consts/const_let_assign3.rs +++ b/src/test/ui/consts/const_let_assign3.rs @@ -1,4 +1,3 @@ -#![feature(const_let)] #![feature(const_fn)] struct S { @@ -18,6 +17,10 @@ const FOO: S = { s }; +type Array = [u32; { let mut x = 2; let y = &mut x; *y = 42; *y}]; +//~^ ERROR references in constants may only refer to immutable values +//~| ERROR constant contains unimplemented expression type + fn main() { assert_eq!(FOO.state, 3); } diff --git a/src/test/ui/consts/const_let_assign3.stderr b/src/test/ui/consts/const_let_assign3.stderr index 0f294616d255c..ecf6625151dfe 100644 --- a/src/test/ui/consts/const_let_assign3.stderr +++ b/src/test/ui/consts/const_let_assign3.stderr @@ -1,16 +1,28 @@ error[E0019]: constant function contains unimplemented expression type - --> $DIR/const_let_assign3.rs:10:9 + --> $DIR/const_let_assign3.rs:9:9 | LL | self.state = x; | ^^^^^^^^^^^^^^ error[E0017]: references in constants may only refer to immutable values - --> $DIR/const_let_assign3.rs:17:5 + --> $DIR/const_let_assign3.rs:16:5 | LL | s.foo(3); //~ ERROR references in constants may only refer to immutable values | ^ constants require immutable values -error: aborting due to 2 previous errors +error[E0017]: references in constants may only refer to immutable values + --> $DIR/const_let_assign3.rs:20:45 + | +LL | type Array = [u32; { let mut x = 2; let y = &mut x; *y = 42; *y}]; + | ^^^^^^ constants require immutable values + +error[E0019]: constant contains unimplemented expression type + --> $DIR/const_let_assign3.rs:20:53 + | +LL | type Array = [u32; { let mut x = 2; let y = &mut x; *y = 42; *y}]; + | ^^^^^^^ + +error: aborting due to 4 previous errors Some errors occurred: E0017, E0019. For more information about an error, try `rustc --explain E0017`. diff --git a/src/test/ui/consts/const_let_eq.rs b/src/test/ui/consts/const_let_eq.rs index 8739cb80e9403..106a45ee1d41f 100644 --- a/src/test/ui/consts/const_let_eq.rs +++ b/src/test/ui/consts/const_let_eq.rs @@ -1,4 +1,4 @@ -#![feature(const_let, const_fn)] +#![feature(const_fn)] // run-pass diff --git a/src/test/ui/consts/const_let_eq_float.rs b/src/test/ui/consts/const_let_eq_float.rs index 2c7262df367a3..c48f54e567b2c 100644 --- a/src/test/ui/consts/const_let_eq_float.rs +++ b/src/test/ui/consts/const_let_eq_float.rs @@ -1,6 +1,6 @@ // compile-pass -#![feature(const_let, const_fn)] +#![feature(const_fn)] struct Foo(T); struct Bar { x: T } diff --git a/src/test/ui/consts/const_short_circuit.rs b/src/test/ui/consts/const_short_circuit.rs index cc49e4696e58f..1e7b7ed319355 100644 --- a/src/test/ui/consts/const_short_circuit.rs +++ b/src/test/ui/consts/const_short_circuit.rs @@ -1,4 +1,4 @@ -#![feature(underscore_const_names, const_let)] +#![feature(underscore_const_names)] const _: bool = false && false; const _: bool = true && false; diff --git a/src/test/ui/consts/dangling-alloc-id-ice.rs b/src/test/ui/consts/dangling-alloc-id-ice.rs index 695d33b690898..dbc50f1fbd4b4 100644 --- a/src/test/ui/consts/dangling-alloc-id-ice.rs +++ b/src/test/ui/consts/dangling-alloc-id-ice.rs @@ -1,7 +1,5 @@ // https://github.com/rust-lang/rust/issues/55223 -#![feature(const_let)] - union Foo<'a> { y: &'a (), long_live_the_unit: &'static (), diff --git a/src/test/ui/consts/dangling-alloc-id-ice.stderr b/src/test/ui/consts/dangling-alloc-id-ice.stderr index a5fa88e5e6832..2cd8711f03d31 100644 --- a/src/test/ui/consts/dangling-alloc-id-ice.stderr +++ b/src/test/ui/consts/dangling-alloc-id-ice.stderr @@ -1,5 +1,5 @@ error: any use of this value will cause an error - --> $DIR/dangling-alloc-id-ice.rs:10:1 + --> $DIR/dangling-alloc-id-ice.rs:8:1 | LL | / const FOO: &() = { //~ ERROR any use of this value will cause an error LL | | let y = (); diff --git a/src/test/ui/consts/dangling_raw_ptr.rs b/src/test/ui/consts/dangling_raw_ptr.rs index 7fc773412f2f8..c2d8e6d421a28 100644 --- a/src/test/ui/consts/dangling_raw_ptr.rs +++ b/src/test/ui/consts/dangling_raw_ptr.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - const FOO: *const u32 = { //~ ERROR any use of this value will cause an error let x = 42; &x diff --git a/src/test/ui/consts/dangling_raw_ptr.stderr b/src/test/ui/consts/dangling_raw_ptr.stderr index 3b20936f8ae97..091f1f785cb02 100644 --- a/src/test/ui/consts/dangling_raw_ptr.stderr +++ b/src/test/ui/consts/dangling_raw_ptr.stderr @@ -1,5 +1,5 @@ error: any use of this value will cause an error - --> $DIR/dangling_raw_ptr.rs:3:1 + --> $DIR/dangling_raw_ptr.rs:1:1 | LL | / const FOO: *const u32 = { //~ ERROR any use of this value will cause an error LL | | let x = 42; diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.rs b/src/test/ui/consts/min_const_fn/min_const_fn.rs index 238b5f7e31003..05cf3d5f1f173 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.rs +++ b/src/test/ui/consts/min_const_fn/min_const_fn.rs @@ -96,7 +96,7 @@ const fn foo30_2(x: *mut u32) -> usize { x as usize } const fn foo30_4(b: bool) -> usize { if b { 1 } else { 42 } } //~^ ERROR `if`, `match`, `&&` and `||` are not stable in const fn const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn -const fn foo30_6() -> bool { let x = true; x } //~ ERROR local variables in const fn +const fn foo30_6() -> bool { let x = true; x } const fn foo36(a: bool, b: bool) -> bool { a && b } //~^ ERROR `if`, `match`, `&&` and `||` are not stable in const fn const fn foo37(a: bool, b: bool) -> bool { a || b } diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.stderr index 1c68df513b697..2cae714fbf727 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.stderr +++ b/src/test/ui/consts/min_const_fn/min_const_fn.stderr @@ -112,12 +112,6 @@ error: `if`, `match`, `&&` and `||` are not stable in const fn LL | const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn | ^^^^^^^^^^^ -error: local variables in const fn are unstable - --> $DIR/min_const_fn.rs:99:34 - | -LL | const fn foo30_6() -> bool { let x = true; x } //~ ERROR local variables in const fn - | ^ - error: `if`, `match`, `&&` and `||` are not stable in const fn --> $DIR/min_const_fn.rs:100:44 | @@ -208,6 +202,6 @@ error: function pointers in const fn are unstable LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo } | ^^^^ -error: aborting due to 35 previous errors +error: aborting due to 34 previous errors For more information about this error, try `rustc --explain E0493`. diff --git a/src/test/ui/consts/min_const_fn/mutable_borrow.rs b/src/test/ui/consts/min_const_fn/mutable_borrow.rs index 3dd76b630a883..89acfea6ed8ff 100644 --- a/src/test/ui/consts/min_const_fn/mutable_borrow.rs +++ b/src/test/ui/consts/min_const_fn/mutable_borrow.rs @@ -1,6 +1,6 @@ const fn mutable_ref_in_const() -> u8 { - let mut a = 0; //~ ERROR local variables in const fn - let b = &mut a; + let mut a = 0; + let b = &mut a; //~ ERROR mutable references in const fn *b } @@ -8,8 +8,8 @@ struct X; impl X { const fn inherent_mutable_ref_in_const() -> u8 { - let mut a = 0; //~ ERROR local variables in const fn - let b = &mut a; + let mut a = 0; + let b = &mut a; //~ ERROR mutable references in const fn *b } } diff --git a/src/test/ui/consts/min_const_fn/mutable_borrow.stderr b/src/test/ui/consts/min_const_fn/mutable_borrow.stderr index fa46f5c804fe0..5ce0f30dc6e1f 100644 --- a/src/test/ui/consts/min_const_fn/mutable_borrow.stderr +++ b/src/test/ui/consts/min_const_fn/mutable_borrow.stderr @@ -1,14 +1,14 @@ -error: local variables in const fn are unstable - --> $DIR/mutable_borrow.rs:2:9 +error: mutable references in const fn are unstable + --> $DIR/mutable_borrow.rs:3:9 | -LL | let mut a = 0; //~ ERROR local variables in const fn - | ^^^^^ +LL | let b = &mut a; //~ ERROR mutable references in const fn + | ^ -error: local variables in const fn are unstable - --> $DIR/mutable_borrow.rs:11:13 +error: mutable references in const fn are unstable + --> $DIR/mutable_borrow.rs:12:13 | -LL | let mut a = 0; //~ ERROR local variables in const fn - | ^^^^^ +LL | let b = &mut a; //~ ERROR mutable references in const fn + | ^ error: aborting due to 2 previous errors diff --git a/src/test/ui/consts/partial_qualif.rs b/src/test/ui/consts/partial_qualif.rs index 4ce41f80f82c8..32c68e69f4bed 100644 --- a/src/test/ui/consts/partial_qualif.rs +++ b/src/test/ui/consts/partial_qualif.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - use std::cell::Cell; const FOO: &(Cell, bool) = { diff --git a/src/test/ui/consts/partial_qualif.stderr b/src/test/ui/consts/partial_qualif.stderr index d695f64e2c3b5..967fb83b78b08 100644 --- a/src/test/ui/consts/partial_qualif.stderr +++ b/src/test/ui/consts/partial_qualif.stderr @@ -1,5 +1,5 @@ error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead - --> $DIR/partial_qualif.rs:8:5 + --> $DIR/partial_qualif.rs:6:5 | LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability | ^^^^ diff --git a/src/test/ui/consts/projection_qualif.rs b/src/test/ui/consts/projection_qualif.rs index 5863429a2f2c5..dedb7db592089 100644 --- a/src/test/ui/consts/projection_qualif.rs +++ b/src/test/ui/consts/projection_qualif.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - use std::cell::Cell; const FOO: &u32 = { diff --git a/src/test/ui/consts/projection_qualif.stderr b/src/test/ui/consts/projection_qualif.stderr index cc3635a979b37..410c51c4b54e1 100644 --- a/src/test/ui/consts/projection_qualif.stderr +++ b/src/test/ui/consts/projection_qualif.stderr @@ -1,17 +1,17 @@ error[E0017]: references in constants may only refer to immutable values - --> $DIR/projection_qualif.rs:8:27 + --> $DIR/projection_qualif.rs:6:27 | LL | let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values | ^^^^^^ constants require immutable values error[E0019]: constant contains unimplemented expression type - --> $DIR/projection_qualif.rs:9:18 + --> $DIR/projection_qualif.rs:7:18 | LL | unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants | ^^^^^^ error[E0658]: dereferencing raw pointers in constants is unstable (see issue #51911) - --> $DIR/projection_qualif.rs:9:18 + --> $DIR/projection_qualif.rs:7:18 | LL | unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants | ^^^^^^ diff --git a/src/test/ui/consts/promote_const_let.rs b/src/test/ui/consts/promote_const_let.rs index 8de9b00eb111d..a8a6d4d99c6ff 100644 --- a/src/test/ui/consts/promote_const_let.rs +++ b/src/test/ui/consts/promote_const_let.rs @@ -1,8 +1,10 @@ -#![feature(const_let)] - fn main() { let x: &'static u32 = { let y = 42; &y //~ ERROR does not live long enough }; + let x: &'static u32 = &{ //~ ERROR does not live long enough + let y = 42; + y + }; } diff --git a/src/test/ui/consts/promote_const_let.stderr b/src/test/ui/consts/promote_const_let.stderr index 6bbb7495fb0dc..d37bd49186032 100644 --- a/src/test/ui/consts/promote_const_let.stderr +++ b/src/test/ui/consts/promote_const_let.stderr @@ -1,5 +1,5 @@ error[E0597]: `y` does not live long enough - --> $DIR/promote_const_let.rs:6:10 + --> $DIR/promote_const_let.rs:4:10 | LL | &y //~ ERROR does not live long enough | ^ borrowed value does not live long enough @@ -8,6 +8,20 @@ LL | }; | = note: borrowed value must be valid for the static lifetime... -error: aborting due to previous error +error[E0597]: borrowed value does not live long enough + --> $DIR/promote_const_let.rs:6:28 + | +LL | let x: &'static u32 = &{ //~ ERROR does not live long enough + | ____________________________^ +LL | | let y = 42; +LL | | y +LL | | }; + | |_____^ temporary value does not live long enough +LL | } + | - temporary value only lives until here + | + = note: borrowed value must be valid for the static lifetime... + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0597`. diff --git a/src/test/ui/consts/qualif_overwrite.rs b/src/test/ui/consts/qualif_overwrite.rs index 806a74ee4530b..430eea37de73c 100644 --- a/src/test/ui/consts/qualif_overwrite.rs +++ b/src/test/ui/consts/qualif_overwrite.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - use std::cell::Cell; // this is overly conservative. The reset to `None` should clear `a` of all qualifications diff --git a/src/test/ui/consts/qualif_overwrite.stderr b/src/test/ui/consts/qualif_overwrite.stderr index 4fac64bf8063f..30479139e314c 100644 --- a/src/test/ui/consts/qualif_overwrite.stderr +++ b/src/test/ui/consts/qualif_overwrite.stderr @@ -1,5 +1,5 @@ error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead - --> $DIR/qualif_overwrite.rs:12:5 + --> $DIR/qualif_overwrite.rs:10:5 | LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability | ^^^^ diff --git a/src/test/ui/consts/qualif_overwrite_2.rs b/src/test/ui/consts/qualif_overwrite_2.rs index 29557a3da4781..fa79b5c14a736 100644 --- a/src/test/ui/consts/qualif_overwrite_2.rs +++ b/src/test/ui/consts/qualif_overwrite_2.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - use std::cell::Cell; // const qualification is not smart enough to know about fields and always assumes that there might diff --git a/src/test/ui/consts/qualif_overwrite_2.stderr b/src/test/ui/consts/qualif_overwrite_2.stderr index 181b728c7b76f..8276db99a12c0 100644 --- a/src/test/ui/consts/qualif_overwrite_2.stderr +++ b/src/test/ui/consts/qualif_overwrite_2.stderr @@ -1,5 +1,5 @@ error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead - --> $DIR/qualif_overwrite_2.rs:10:5 + --> $DIR/qualif_overwrite_2.rs:8:5 | LL | &{a.0} //~ ERROR cannot borrow a constant which may contain interior mutability | ^^^^^^ diff --git a/src/test/ui/consts/static_mut_containing_mut_ref2.rs b/src/test/ui/consts/static_mut_containing_mut_ref2.rs index 4180b1e295ab0..ef378fa84518e 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref2.rs +++ b/src/test/ui/consts/static_mut_containing_mut_ref2.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - static mut STDERR_BUFFER_SPACE: u8 = 0; pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; diff --git a/src/test/ui/consts/static_mut_containing_mut_ref2.stderr b/src/test/ui/consts/static_mut_containing_mut_ref2.stderr index f0ae1545056b7..72186571d697e 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref2.stderr +++ b/src/test/ui/consts/static_mut_containing_mut_ref2.stderr @@ -1,11 +1,11 @@ error[E0017]: references in statics may only refer to immutable values - --> $DIR/static_mut_containing_mut_ref2.rs:5:46 + --> $DIR/static_mut_containing_mut_ref2.rs:3:46 | LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ statics require immutable values error[E0019]: static contains unimplemented expression type - --> $DIR/static_mut_containing_mut_ref2.rs:5:45 + --> $DIR/static_mut_containing_mut_ref2.rs:3:45 | LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/static_mut_containing_mut_ref3.rs b/src/test/ui/consts/static_mut_containing_mut_ref3.rs index 0bc7faa9afdec..c24c7e2792079 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref3.rs +++ b/src/test/ui/consts/static_mut_containing_mut_ref3.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - static mut FOO: (u8, u8) = (42, 43); static mut BAR: () = unsafe { FOO.0 = 99; }; diff --git a/src/test/ui/consts/static_mut_containing_mut_ref3.stderr b/src/test/ui/consts/static_mut_containing_mut_ref3.stderr index cae53c6fee9dd..e88e49b097af2 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref3.stderr +++ b/src/test/ui/consts/static_mut_containing_mut_ref3.stderr @@ -1,5 +1,5 @@ error[E0080]: could not evaluate static initializer - --> $DIR/static_mut_containing_mut_ref3.rs:5:31 + --> $DIR/static_mut_containing_mut_ref3.rs:3:31 | LL | static mut BAR: () = unsafe { FOO.0 = 99; }; | ^^^^^^^^^^ tried to modify a static's initial value from another static's initializer diff --git a/src/test/ui/error-codes/E0010-teach.rs b/src/test/ui/error-codes/E0010-teach.rs index fc5dffb37cfe7..da51035ab5550 100644 --- a/src/test/ui/error-codes/E0010-teach.rs +++ b/src/test/ui/error-codes/E0010-teach.rs @@ -4,5 +4,6 @@ #![allow(warnings)] const CON : Box = box 0; //~ ERROR E0010 +//~^ ERROR constant contains unimplemented expression type fn main() {} diff --git a/src/test/ui/error-codes/E0010-teach.stderr b/src/test/ui/error-codes/E0010-teach.stderr index da0aadfded5f8..77e7b5ec0e860 100644 --- a/src/test/ui/error-codes/E0010-teach.stderr +++ b/src/test/ui/error-codes/E0010-teach.stderr @@ -6,6 +6,16 @@ LL | const CON : Box = box 0; //~ ERROR E0010 | = note: The value of statics and constants must be known at compile time, and they live for the entire lifetime of a program. Creating a boxed value allocates memory on the heap at runtime, and therefore cannot be done at compile time. -error: aborting due to previous error +error[E0019]: constant contains unimplemented expression type + --> $DIR/E0010-teach.rs:6:28 + | +LL | const CON : Box = box 0; //~ ERROR E0010 + | ^ + | + = note: A function call isn't allowed in the const's initialization expression because the expression's value must be known at compile-time. + = note: Remember: you can't use a function call inside a const's initialization expression! However, you can use it anywhere else. + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0010`. +Some errors occurred: E0010, E0019. +For more information about an error, try `rustc --explain E0010`. diff --git a/src/test/ui/error-codes/E0010.rs b/src/test/ui/error-codes/E0010.rs index e62997640f473..3398e2c28ba6b 100644 --- a/src/test/ui/error-codes/E0010.rs +++ b/src/test/ui/error-codes/E0010.rs @@ -2,5 +2,6 @@ #![allow(warnings)] const CON : Box = box 0; //~ ERROR E0010 +//~^ ERROR constant contains unimplemented expression type fn main() {} diff --git a/src/test/ui/error-codes/E0010.stderr b/src/test/ui/error-codes/E0010.stderr index b4b490922c45f..1364693109e08 100644 --- a/src/test/ui/error-codes/E0010.stderr +++ b/src/test/ui/error-codes/E0010.stderr @@ -4,6 +4,13 @@ error[E0010]: allocations are not allowed in constants LL | const CON : Box = box 0; //~ ERROR E0010 | ^^^^^ allocation not allowed in constants -error: aborting due to previous error +error[E0019]: constant contains unimplemented expression type + --> $DIR/E0010.rs:4:28 + | +LL | const CON : Box = box 0; //~ ERROR E0010 + | ^ + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0010`. +Some errors occurred: E0010, E0019. +For more information about an error, try `rustc --explain E0010`. diff --git a/src/test/ui/feature-gates/feature-gate-const_let.rs b/src/test/ui/feature-gates/feature-gate-const_let.rs deleted file mode 100644 index 74cefd7c0670d..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-const_let.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Test use of const let without feature gate. - -const FOO: usize = { - //~^ ERROR statements in constants are unstable - //~| ERROR: let bindings in constants are unstable - let x = 42; - //~^ ERROR statements in constants are unstable - //~| ERROR: let bindings in constants are unstable - 42 -}; - -static BAR: usize = { - //~^ ERROR statements in statics are unstable - //~| ERROR: let bindings in statics are unstable - let x = 42; - //~^ ERROR statements in statics are unstable - //~| ERROR: let bindings in statics are unstable - 42 -}; - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-const_let.stderr b/src/test/ui/feature-gates/feature-gate-const_let.stderr deleted file mode 100644 index 56312999a5fd8..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-const_let.stderr +++ /dev/null @@ -1,91 +0,0 @@ -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:6:13 - | -LL | let x = 42; - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:6:13 - | -LL | let x = 42; - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:3:1 - | -LL | / const FOO: usize = { -LL | | //~^ ERROR statements in constants are unstable -LL | | //~| ERROR: let bindings in constants are unstable -LL | | let x = 42; -... | -LL | | 42 -LL | | }; - | |__^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:3:1 - | -LL | / const FOO: usize = { -LL | | //~^ ERROR statements in constants are unstable -LL | | //~| ERROR: let bindings in constants are unstable -LL | | let x = 42; -... | -LL | | 42 -LL | | }; - | |__^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in statics are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:15:13 - | -LL | let x = 42; - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:15:13 - | -LL | let x = 42; - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in statics are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:12:1 - | -LL | / static BAR: usize = { -LL | | //~^ ERROR statements in statics are unstable -LL | | //~| ERROR: let bindings in statics are unstable -LL | | let x = 42; -... | -LL | | 42 -LL | | }; - | |__^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/feature-gate-const_let.rs:12:1 - | -LL | / static BAR: usize = { -LL | | //~^ ERROR statements in statics are unstable -LL | | //~| ERROR: let bindings in statics are unstable -LL | | let x = 42; -... | -LL | | 42 -LL | | }; - | |__^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 8 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-underscore_const_names.rs b/src/test/ui/feature-gates/feature-gate-underscore_const_names.rs index a82b356c75216..6b97c24a47ed2 100644 --- a/src/test/ui/feature-gates/feature-gate-underscore_const_names.rs +++ b/src/test/ui/feature-gates/feature-gate-underscore_const_names.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - trait Trt {} struct Str {} diff --git a/src/test/ui/feature-gates/feature-gate-underscore_const_names.stderr b/src/test/ui/feature-gates/feature-gate-underscore_const_names.stderr index b3658208828e9..d608f3d37cf2a 100644 --- a/src/test/ui/feature-gates/feature-gate-underscore_const_names.stderr +++ b/src/test/ui/feature-gates/feature-gate-underscore_const_names.stderr @@ -1,5 +1,5 @@ error[E0658]: naming constants with `_` is unstable (see issue #54912) - --> $DIR/feature-gate-underscore_const_names.rs:8:1 + --> $DIR/feature-gate-underscore_const_names.rs:6:1 | LL | / const _ : () = { LL | | //~^ ERROR is unstable diff --git a/src/test/ui/issues/issue-18118.rs b/src/test/ui/issues/issue-18118.rs index 7bbea191cd167..f58a3de281f1a 100644 --- a/src/test/ui/issues/issue-18118.rs +++ b/src/test/ui/issues/issue-18118.rs @@ -1,11 +1,6 @@ pub fn main() { const z: &'static isize = { - //~^ ERROR let bindings in constants are unstable - //~| ERROR statements in constants are unstable let p = 3; - //~^ ERROR let bindings in constants are unstable - //~| ERROR statements in constants are unstable &p //~ ERROR `p` does not live long enough - //~^ ERROR let bindings in constants are unstable }; } diff --git a/src/test/ui/issues/issue-18118.stderr b/src/test/ui/issues/issue-18118.stderr index 1383cdb4438c9..9b21ece341a9f 100644 --- a/src/test/ui/issues/issue-18118.stderr +++ b/src/test/ui/issues/issue-18118.stderr @@ -1,67 +1,13 @@ -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:5:17 - | -LL | let p = 3; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:5:17 - | -LL | let p = 3; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:8:9 - | -LL | &p //~ ERROR `p` does not live long enough - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:2:5 - | -LL | / const z: &'static isize = { -LL | | //~^ ERROR let bindings in constants are unstable -LL | | //~| ERROR statements in constants are unstable -LL | | let p = 3; -... | -LL | | //~^ ERROR let bindings in constants are unstable -LL | | }; - | |______^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:2:5 - | -LL | / const z: &'static isize = { -LL | | //~^ ERROR let bindings in constants are unstable -LL | | //~| ERROR statements in constants are unstable -LL | | let p = 3; -... | -LL | | //~^ ERROR let bindings in constants are unstable -LL | | }; - | |______^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - error[E0597]: `p` does not live long enough - --> $DIR/issue-18118.rs:8:10 + --> $DIR/issue-18118.rs:4:10 | LL | &p //~ ERROR `p` does not live long enough | ^ borrowed value does not live long enough -LL | //~^ ERROR let bindings in constants are unstable LL | }; | - borrowed value only lives until here | = note: borrowed value must be valid for the static lifetime... -error: aborting due to 6 previous errors +error: aborting due to previous error -Some errors occurred: E0597, E0658. -For more information about an error, try `rustc --explain E0597`. +For more information about this error, try `rustc --explain E0597`. diff --git a/src/test/ui/issues/issue-32829-2.rs b/src/test/ui/issues/issue-32829-2.rs index 9db9d30411d6f..379f1ee0f388d 100644 --- a/src/test/ui/issues/issue-32829-2.rs +++ b/src/test/ui/issues/issue-32829-2.rs @@ -5,7 +5,6 @@ const bad : u32 = { { 5; - //~^ ERROR statements in constants are unstable 0 } }; @@ -13,8 +12,7 @@ const bad : u32 = { const bad_two : u32 = { { invalid(); - //~^ ERROR statements in constants are unstable - //~^^ ERROR: calls in constants are limited to constant functions, tuple structs and tuple variants + //~^ ERROR: calls in constants are limited to constant functions, tuple structs and tuple variants 0 } }; @@ -22,7 +20,6 @@ const bad_two : u32 = { const bad_three : u32 = { { valid(); - //~^ ERROR statements in constants are unstable 0 } }; @@ -30,7 +27,6 @@ const bad_three : u32 = { static bad_four : u32 = { { 5; - //~^ ERROR statements in statics are unstable 0 } }; @@ -39,7 +35,6 @@ static bad_five : u32 = { { invalid(); //~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants - //~| ERROR statements in statics are unstable 0 } }; @@ -47,7 +42,6 @@ static bad_five : u32 = { static bad_six : u32 = { { valid(); - //~^ ERROR statements in statics are unstable 0 } }; @@ -55,7 +49,6 @@ static bad_six : u32 = { static mut bad_seven : u32 = { { 5; - //~^ ERROR statements in statics are unstable 0 } }; @@ -63,8 +56,7 @@ static mut bad_seven : u32 = { static mut bad_eight : u32 = { { invalid(); - //~^ ERROR statements in statics are unstable - //~| ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants + //~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants 0 } }; @@ -72,7 +64,6 @@ static mut bad_eight : u32 = { static mut bad_nine : u32 = { { valid(); - //~^ ERROR statements in statics are unstable 0 } }; diff --git a/src/test/ui/issues/issue-32829-2.stderr b/src/test/ui/issues/issue-32829-2.stderr index 7fe0261281830..9b7fe71d9a7d6 100644 --- a/src/test/ui/issues/issue-32829-2.stderr +++ b/src/test/ui/issues/issue-32829-2.stderr @@ -1,94 +1,21 @@ -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:7:9 - | -LL | 5; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue-32829-2.rs:15:9 + --> $DIR/issue-32829-2.rs:14:9 | LL | invalid(); | ^^^^^^^^^ -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:15:9 - | -LL | invalid(); - | ^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:24:9 - | -LL | valid(); - | ^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:32:9 - | -LL | 5; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue-32829-2.rs:40:9 + --> $DIR/issue-32829-2.rs:36:9 | LL | invalid(); | ^^^^^^^^^ -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:40:9 - | -LL | invalid(); - | ^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:49:9 - | -LL | valid(); - | ^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:57:9 - | -LL | 5; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue-32829-2.rs:65:9 + --> $DIR/issue-32829-2.rs:58:9 | LL | invalid(); | ^^^^^^^^^ -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:65:9 - | -LL | invalid(); - | ^^^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue-32829-2.rs:74:9 - | -LL | valid(); - | ^^^^^^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error: aborting due to 12 previous errors +error: aborting due to 3 previous errors -Some errors occurred: E0015, E0658. -For more information about an error, try `rustc --explain E0015`. +For more information about this error, try `rustc --explain E0015`. diff --git a/src/test/ui/issues/issue-37550.rs b/src/test/ui/issues/issue-37550.rs index 12282f3e54887..505c030b96712 100644 --- a/src/test/ui/issues/issue-37550.rs +++ b/src/test/ui/issues/issue-37550.rs @@ -1,6 +1,6 @@ const fn x() { - let t = true; //~ ERROR local variables in const fn - let x = || t; + let t = true; + let x = || t; //~ ERROR function pointers in const fn are unstable } fn main() {} diff --git a/src/test/ui/issues/issue-37550.stderr b/src/test/ui/issues/issue-37550.stderr index d42f72ad3fac8..d2b03416cb73c 100644 --- a/src/test/ui/issues/issue-37550.stderr +++ b/src/test/ui/issues/issue-37550.stderr @@ -1,7 +1,7 @@ -error: local variables in const fn are unstable - --> $DIR/issue-37550.rs:2:9 +error: function pointers in const fn are unstable + --> $DIR/issue-37550.rs:3:9 | -LL | let t = true; //~ ERROR local variables in const fn +LL | let x = || t; //~ ERROR function pointers in const fn are unstable | ^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-7364.rs b/src/test/ui/issues/issue-7364.rs index 3f9c2ef48a7af..52ec9e42be782 100644 --- a/src/test/ui/issues/issue-7364.rs +++ b/src/test/ui/issues/issue-7364.rs @@ -6,5 +6,6 @@ use std::cell::RefCell; static boxed: Box> = box RefCell::new(0); //~^ ERROR allocations are not allowed in statics //~| ERROR `std::cell::RefCell` cannot be shared between threads safely [E0277] +//~| ERROR static contains unimplemented expression type fn main() { } diff --git a/src/test/ui/issues/issue-7364.stderr b/src/test/ui/issues/issue-7364.stderr index 0e4d6ff1d71fa..52a99ce36b870 100644 --- a/src/test/ui/issues/issue-7364.stderr +++ b/src/test/ui/issues/issue-7364.stderr @@ -4,6 +4,12 @@ error[E0010]: allocations are not allowed in statics LL | static boxed: Box> = box RefCell::new(0); | ^^^^^^^^^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/issue-7364.rs:6:41 + | +LL | static boxed: Box> = box RefCell::new(0); + | ^^^^^^^^^^^^^^^ + error[E0277]: `std::cell::RefCell` cannot be shared between threads safely --> $DIR/issue-7364.rs:6:1 | @@ -15,7 +21,7 @@ LL | static boxed: Box> = box RefCell::new(0); = note: required because it appears within the type `std::boxed::Box>` = note: shared static variables must have a type that implements `Sync` -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors -Some errors occurred: E0010, E0277. +Some errors occurred: E0010, E0019, E0277. For more information about an error, try `rustc --explain E0010`. diff --git a/src/test/ui/static/static-mut-not-constant.rs b/src/test/ui/static/static-mut-not-constant.rs index 2091fffd418ee..84d401c9fa61d 100644 --- a/src/test/ui/static/static-mut-not-constant.rs +++ b/src/test/ui/static/static-mut-not-constant.rs @@ -2,5 +2,6 @@ static mut a: Box = box 3; //~^ ERROR allocations are not allowed in statics +//~| ERROR static contains unimplemented expression type fn main() {} diff --git a/src/test/ui/static/static-mut-not-constant.stderr b/src/test/ui/static/static-mut-not-constant.stderr index a0fa245156f87..d2c6ba6a2f85a 100644 --- a/src/test/ui/static/static-mut-not-constant.stderr +++ b/src/test/ui/static/static-mut-not-constant.stderr @@ -4,6 +4,13 @@ error[E0010]: allocations are not allowed in statics LL | static mut a: Box = box 3; | ^^^^^ allocation not allowed in statics -error: aborting due to previous error +error[E0019]: static contains unimplemented expression type + --> $DIR/static-mut-not-constant.rs:3:32 + | +LL | static mut a: Box = box 3; + | ^ + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0010`. +Some errors occurred: E0010, E0019. +For more information about an error, try `rustc --explain E0010`. diff --git a/src/test/ui/underscore_const_names.rs b/src/test/ui/underscore_const_names.rs index 811d166ed65a7..1db022e886208 100644 --- a/src/test/ui/underscore_const_names.rs +++ b/src/test/ui/underscore_const_names.rs @@ -1,6 +1,5 @@ // compile-pass -#![feature(const_let)] #![feature(underscore_const_names)] trait Trt {} diff --git a/src/test/ui/unsafe/ranged_ints2_const.rs b/src/test/ui/unsafe/ranged_ints2_const.rs index a61e3329bdce8..c404f25911615 100644 --- a/src/test/ui/unsafe/ranged_ints2_const.rs +++ b/src/test/ui/unsafe/ranged_ints2_const.rs @@ -1,4 +1,4 @@ -#![feature(rustc_attrs, const_let, const_fn)] +#![feature(rustc_attrs, const_fn)] #[rustc_layout_scalar_valid_range_start(1)] #[repr(transparent)] diff --git a/src/test/ui/unsafe/ranged_ints3_const.rs b/src/test/ui/unsafe/ranged_ints3_const.rs index 6497b611224b6..f8ce81f0d1c37 100644 --- a/src/test/ui/unsafe/ranged_ints3_const.rs +++ b/src/test/ui/unsafe/ranged_ints3_const.rs @@ -1,4 +1,4 @@ -#![feature(rustc_attrs, const_let, const_fn)] +#![feature(rustc_attrs, const_fn)] use std::cell::Cell; diff --git a/src/test/ui/unsafe/ranged_ints4_const.rs b/src/test/ui/unsafe/ranged_ints4_const.rs index f589e4739baf1..9bda1f69652ec 100644 --- a/src/test/ui/unsafe/ranged_ints4_const.rs +++ b/src/test/ui/unsafe/ranged_ints4_const.rs @@ -1,4 +1,4 @@ -#![feature(rustc_attrs, const_let, const_fn)] +#![feature(rustc_attrs, const_fn)] #[rustc_layout_scalar_valid_range_start(1)] #[repr(transparent)] diff --git a/src/test/ui/write-to-static-mut-in-static.rs b/src/test/ui/write-to-static-mut-in-static.rs index 3c34a7704e0df..43c63fed8cef1 100644 --- a/src/test/ui/write-to-static-mut-in-static.rs +++ b/src/test/ui/write-to-static-mut-in-static.rs @@ -1,5 +1,3 @@ -#![feature(const_let)] - pub static mut A: u32 = 0; pub static mut B: () = unsafe { A = 1; }; //~^ ERROR could not evaluate static initializer diff --git a/src/test/ui/write-to-static-mut-in-static.stderr b/src/test/ui/write-to-static-mut-in-static.stderr index 7be83b8dafcfd..eba1c609d2f83 100644 --- a/src/test/ui/write-to-static-mut-in-static.stderr +++ b/src/test/ui/write-to-static-mut-in-static.stderr @@ -1,23 +1,23 @@ error[E0080]: could not evaluate static initializer - --> $DIR/write-to-static-mut-in-static.rs:4:33 + --> $DIR/write-to-static-mut-in-static.rs:2:33 | LL | pub static mut B: () = unsafe { A = 1; }; | ^^^^^ tried to modify a static's initial value from another static's initializer error[E0391]: cycle detected when const-evaluating `C` - --> $DIR/write-to-static-mut-in-static.rs:7:34 + --> $DIR/write-to-static-mut-in-static.rs:5:34 | LL | pub static mut C: u32 = unsafe { C = 1; 0 }; | ^^^^^ | note: ...which requires const-evaluating `C`... - --> $DIR/write-to-static-mut-in-static.rs:7:1 + --> $DIR/write-to-static-mut-in-static.rs:5:1 | LL | pub static mut C: u32 = unsafe { C = 1; 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: ...which again requires const-evaluating `C`, completing the cycle note: cycle used when const-evaluating + checking `C` - --> $DIR/write-to-static-mut-in-static.rs:7:1 + --> $DIR/write-to-static-mut-in-static.rs:5:1 | LL | pub static mut C: u32 = unsafe { C = 1; 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From a49acea80de0a78b421319ad340d4bc5e84a4dfe Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Sun, 30 Dec 2018 18:57:31 +0100 Subject: [PATCH 36/86] Clarify const_let comment --- src/libsyntax/feature_gate.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 15cf4334154da..a7b391f2d1a4c 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -685,7 +685,9 @@ declare_features! ( (accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None), // `#[cfg_attr(predicate, multiple, attributes, here)]` (accepted, cfg_attr_multi, "1.33.0", Some(54881), None), - // Allows let bindings and destructuring in `const` functions and constants. + // Allows let bindings, assignments and destructuring in `const` functions and constants. + // As long as control flow is not implemented in const eval, `&&` and `||` may not be used + // at the same time as let bindings. (accepted, const_let, "1.33.0", Some(48821), None), ); From aef6288d9ad2c5d9bba2525611ef1a3da703d4b5 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Sun, 30 Dec 2018 19:20:53 +0100 Subject: [PATCH 37/86] const fn feature gate is not needed anymore in a lot of tests --- .../ctfe/const-block-non-item-statement-3.rs | 4 +++- .../ctfe/const-block-non-item-statement.rs | 5 ++++- src/test/run-pass/ctfe/locals-in-const-fn.rs | 2 -- src/test/ui/consts/const_let_assign2.rs | 2 -- src/test/ui/consts/const_let_assign3.rs | 9 ++++++-- src/test/ui/consts/const_let_assign3.stderr | 12 +++++------ src/test/ui/consts/const_let_eq.rs | 2 -- src/test/ui/issues/issue-32829-2.rs | 2 -- src/test/ui/issues/issue-32829-2.stderr | 6 +++--- src/test/ui/unsafe/ranged_ints2_const.rs | 6 +++--- src/test/ui/unsafe/ranged_ints2_const.stderr | 21 +++++++++---------- src/test/ui/unsafe/ranged_ints3_const.rs | 2 +- src/test/ui/unsafe/ranged_ints4_const.rs | 2 +- 13 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs b/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs index 54ed2efa50bbd..10a4c31f24ed4 100644 --- a/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs +++ b/src/test/run-pass/ctfe/const-block-non-item-statement-3.rs @@ -3,4 +3,6 @@ type Array = [u32; { let x = 2; 5 }]; -pub fn main() {} +pub fn main() { + let _: Array = [0; 5]; +} diff --git a/src/test/run-pass/ctfe/const-block-non-item-statement.rs b/src/test/run-pass/ctfe/const-block-non-item-statement.rs index 92bf5ae7b97e7..a1b9b586ad038 100644 --- a/src/test/run-pass/ctfe/const-block-non-item-statement.rs +++ b/src/test/run-pass/ctfe/const-block-non-item-statement.rs @@ -1,8 +1,11 @@ // run-pass #![allow(dead_code)] +#[repr(u8)] enum Foo { Bar = { let x = 1; 3 } } -pub fn main() {} +pub fn main() { + assert_eq!(3, Foo::Bar as u8); +} diff --git a/src/test/run-pass/ctfe/locals-in-const-fn.rs b/src/test/run-pass/ctfe/locals-in-const-fn.rs index 27e93b913f844..95d50171a847b 100644 --- a/src/test/run-pass/ctfe/locals-in-const-fn.rs +++ b/src/test/run-pass/ctfe/locals-in-const-fn.rs @@ -2,8 +2,6 @@ // https://github.com/rust-lang/rust/issues/48821 -#![feature(const_fn)] - const fn foo(i: usize) -> usize { let x = i; x diff --git a/src/test/ui/consts/const_let_assign2.rs b/src/test/ui/consts/const_let_assign2.rs index 7839aafe5efa6..1c44237e49b7a 100644 --- a/src/test/ui/consts/const_let_assign2.rs +++ b/src/test/ui/consts/const_let_assign2.rs @@ -1,7 +1,5 @@ // compile-pass -#![feature(const_fn)] - pub struct AA { pub data: [u8; 10], } diff --git a/src/test/ui/consts/const_let_assign3.rs b/src/test/ui/consts/const_let_assign3.rs index dd0705edfe78d..cbe73923e9c42 100644 --- a/src/test/ui/consts/const_let_assign3.rs +++ b/src/test/ui/consts/const_let_assign3.rs @@ -17,9 +17,14 @@ const FOO: S = { s }; -type Array = [u32; { let mut x = 2; let y = &mut x; *y = 42; *y}]; +type Array = [u32; { + let mut x = 2; + let y = &mut x; //~^ ERROR references in constants may only refer to immutable values -//~| ERROR constant contains unimplemented expression type + *y = 42; +//~^ ERROR constant contains unimplemented expression type + *y +}]; fn main() { assert_eq!(FOO.state, 3); diff --git a/src/test/ui/consts/const_let_assign3.stderr b/src/test/ui/consts/const_let_assign3.stderr index ecf6625151dfe..6649fb997cce4 100644 --- a/src/test/ui/consts/const_let_assign3.stderr +++ b/src/test/ui/consts/const_let_assign3.stderr @@ -11,16 +11,16 @@ LL | s.foo(3); //~ ERROR references in constants may only refer to immutable | ^ constants require immutable values error[E0017]: references in constants may only refer to immutable values - --> $DIR/const_let_assign3.rs:20:45 + --> $DIR/const_let_assign3.rs:22:13 | -LL | type Array = [u32; { let mut x = 2; let y = &mut x; *y = 42; *y}]; - | ^^^^^^ constants require immutable values +LL | let y = &mut x; + | ^^^^^^ constants require immutable values error[E0019]: constant contains unimplemented expression type - --> $DIR/const_let_assign3.rs:20:53 + --> $DIR/const_let_assign3.rs:24:5 | -LL | type Array = [u32; { let mut x = 2; let y = &mut x; *y = 42; *y}]; - | ^^^^^^^ +LL | *y = 42; + | ^^^^^^^ error: aborting due to 4 previous errors diff --git a/src/test/ui/consts/const_let_eq.rs b/src/test/ui/consts/const_let_eq.rs index 106a45ee1d41f..a2364c392f26b 100644 --- a/src/test/ui/consts/const_let_eq.rs +++ b/src/test/ui/consts/const_let_eq.rs @@ -1,5 +1,3 @@ -#![feature(const_fn)] - // run-pass struct Foo(T); diff --git a/src/test/ui/issues/issue-32829-2.rs b/src/test/ui/issues/issue-32829-2.rs index 379f1ee0f388d..c93c84b5fb773 100644 --- a/src/test/ui/issues/issue-32829-2.rs +++ b/src/test/ui/issues/issue-32829-2.rs @@ -1,7 +1,5 @@ // ignore-tidy-linelength -#![feature(const_fn)] - const bad : u32 = { { 5; diff --git a/src/test/ui/issues/issue-32829-2.stderr b/src/test/ui/issues/issue-32829-2.stderr index 9b7fe71d9a7d6..8d7423f29ae97 100644 --- a/src/test/ui/issues/issue-32829-2.stderr +++ b/src/test/ui/issues/issue-32829-2.stderr @@ -1,17 +1,17 @@ error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue-32829-2.rs:14:9 + --> $DIR/issue-32829-2.rs:12:9 | LL | invalid(); | ^^^^^^^^^ error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue-32829-2.rs:36:9 + --> $DIR/issue-32829-2.rs:34:9 | LL | invalid(); | ^^^^^^^^^ error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue-32829-2.rs:58:9 + --> $DIR/issue-32829-2.rs:56:9 | LL | invalid(); | ^^^^^^^^^ diff --git a/src/test/ui/unsafe/ranged_ints2_const.rs b/src/test/ui/unsafe/ranged_ints2_const.rs index c404f25911615..788f49f743cda 100644 --- a/src/test/ui/unsafe/ranged_ints2_const.rs +++ b/src/test/ui/unsafe/ranged_ints2_const.rs @@ -1,4 +1,4 @@ -#![feature(rustc_attrs, const_fn)] +#![feature(rustc_attrs)] #[rustc_layout_scalar_valid_range_start(1)] #[repr(transparent)] @@ -8,13 +8,13 @@ fn main() { const fn foo() -> NonZero { let mut x = unsafe { NonZero(1) }; - let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable + let y = &mut x.0; //~ ERROR references in const fn are unstable //~^ ERROR mutation of layout constrained field is unsafe unsafe { NonZero(1) } } const fn bar() -> NonZero { let mut x = unsafe { NonZero(1) }; - let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut + let y = unsafe { &mut x.0 }; //~ ERROR mutable references in const fn are unstable unsafe { NonZero(1) } } diff --git a/src/test/ui/unsafe/ranged_ints2_const.stderr b/src/test/ui/unsafe/ranged_ints2_const.stderr index f79792ffba9be..39a55190b17de 100644 --- a/src/test/ui/unsafe/ranged_ints2_const.stderr +++ b/src/test/ui/unsafe/ranged_ints2_const.stderr @@ -1,24 +1,23 @@ -error[E0017]: references in constant functions may only refer to immutable values - --> $DIR/ranged_ints2_const.rs:11:13 +error: mutable references in const fn are unstable + --> $DIR/ranged_ints2_const.rs:11:9 | -LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable - | ^^^^^^^^ constant functions require immutable values +LL | let y = &mut x.0; //~ ERROR references in const fn are unstable + | ^ -error[E0017]: references in constant functions may only refer to immutable values - --> $DIR/ranged_ints2_const.rs:18:22 +error: mutable references in const fn are unstable + --> $DIR/ranged_ints2_const.rs:18:9 | -LL | let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut - | ^^^^^^^^ constant functions require immutable values +LL | let y = unsafe { &mut x.0 }; //~ ERROR mutable references in const fn are unstable + | ^ error[E0133]: mutation of layout constrained field is unsafe and requires unsafe function or block --> $DIR/ranged_ints2_const.rs:11:13 | -LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable +LL | let y = &mut x.0; //~ ERROR references in const fn are unstable | ^^^^^^^^ mutation of layout constrained field | = note: mutating layout constrained fields cannot statically be checked for valid values error: aborting due to 3 previous errors -Some errors occurred: E0017, E0133. -For more information about an error, try `rustc --explain E0017`. +For more information about this error, try `rustc --explain E0133`. diff --git a/src/test/ui/unsafe/ranged_ints3_const.rs b/src/test/ui/unsafe/ranged_ints3_const.rs index f8ce81f0d1c37..7b03d8eda9380 100644 --- a/src/test/ui/unsafe/ranged_ints3_const.rs +++ b/src/test/ui/unsafe/ranged_ints3_const.rs @@ -1,4 +1,4 @@ -#![feature(rustc_attrs, const_fn)] +#![feature(rustc_attrs)] use std::cell::Cell; diff --git a/src/test/ui/unsafe/ranged_ints4_const.rs b/src/test/ui/unsafe/ranged_ints4_const.rs index 9bda1f69652ec..f09168c3d3f9c 100644 --- a/src/test/ui/unsafe/ranged_ints4_const.rs +++ b/src/test/ui/unsafe/ranged_ints4_const.rs @@ -1,4 +1,4 @@ -#![feature(rustc_attrs, const_fn)] +#![feature(rustc_attrs)] #[rustc_layout_scalar_valid_range_start(1)] #[repr(transparent)] From 80262e6040675b9346816e2845a7fc81c64b82a0 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Wed, 9 Jan 2019 11:32:56 +0100 Subject: [PATCH 38/86] Fix irrefutable slice patterns in const fn --- src/librustc_mir/transform/qualify_consts.rs | 4 ++-- src/librustc_mir/transform/qualify_min_const_fn.rs | 5 +---- src/test/ui/consts/const_let_irrefutable.rs | 11 +++++++++++ src/test/ui/consts/const_let_refutable.rs | 5 +++++ src/test/ui/consts/const_let_refutable.stderr | 9 +++++++++ 5 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/test/ui/consts/const_let_irrefutable.rs create mode 100644 src/test/ui/consts/const_let_refutable.rs create mode 100644 src/test/ui/consts/const_let_refutable.stderr diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index 3d90e55f1e4e2..ddd714fd27e59 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -470,6 +470,8 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> { } } + ProjectionElem::ConstantIndex {..} | + ProjectionElem::Subslice {..} | ProjectionElem::Field(..) | ProjectionElem::Index(_) => { let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx); @@ -499,8 +501,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> { this.qualif.restrict(ty, this.tcx, this.param_env); } - ProjectionElem::ConstantIndex {..} | - ProjectionElem::Subslice {..} | ProjectionElem::Downcast(..) => { this.not_const() } diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index 6df6841f869f2..6935255098b67 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -264,13 +264,10 @@ fn check_place( Place::Static(_) => Err((span, "cannot access `static` items in const fn".into())), Place::Projection(proj) => { match proj.elem { + | ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } | ProjectionElem::Deref | ProjectionElem::Field(..) | ProjectionElem::Index(_) => { check_place(tcx, mir, &proj.base, span) } - // slice patterns are unstable - | ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => { - return Err((span, "slice patterns in const fn are unstable".into())) - } | ProjectionElem::Downcast(..) => { Err((span, "`match` or `if let` in `const fn` is unstable".into())) } diff --git a/src/test/ui/consts/const_let_irrefutable.rs b/src/test/ui/consts/const_let_irrefutable.rs new file mode 100644 index 0000000000000..424a16f7ed39b --- /dev/null +++ b/src/test/ui/consts/const_let_irrefutable.rs @@ -0,0 +1,11 @@ +// compile-pass + +fn main() {} + +const fn tup((a, b): (i32, i32)) -> i32 { + a + b +} + +const fn array([a, b]: [i32; 2]) -> i32 { + a + b +} diff --git a/src/test/ui/consts/const_let_refutable.rs b/src/test/ui/consts/const_let_refutable.rs new file mode 100644 index 0000000000000..345f682868fbc --- /dev/null +++ b/src/test/ui/consts/const_let_refutable.rs @@ -0,0 +1,5 @@ +fn main() {} + +const fn slice([a, b]: &[i32]) -> i32 { //~ ERROR refutable pattern in function argument + a + b +} diff --git a/src/test/ui/consts/const_let_refutable.stderr b/src/test/ui/consts/const_let_refutable.stderr new file mode 100644 index 0000000000000..c5d2ba02a70c6 --- /dev/null +++ b/src/test/ui/consts/const_let_refutable.stderr @@ -0,0 +1,9 @@ +error[E0005]: refutable pattern in function argument: `&[]` not covered + --> $DIR/const_let_refutable.rs:3:16 + | +LL | const fn slice([a, b]: &[i32]) -> i32 { //~ ERROR refutable pattern in function argument + | ^^^^^^ pattern `&[]` not covered + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0005`. From 0e56e13c1875c93df7eee4b0cccd05e82506d187 Mon Sep 17 00:00:00 2001 From: king6cong Date: Wed, 9 Jan 2019 19:42:25 +0800 Subject: [PATCH 39/86] Remove outdated comment --- config.toml.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml.example b/config.toml.example index c68d358b6a67e..23943d34b7ca8 100644 --- a/config.toml.example +++ b/config.toml.example @@ -288,7 +288,7 @@ #codegen-units-std = 1 # Whether or not debug assertions are enabled for the compiler and standard -# library. Also enables compilation of debug! and trace! logging macros. +# library. #debug-assertions = false # Whether or not debuginfo is emitted From 2e4766c3afcdac9f45edbd73723384b360ee4b68 Mon Sep 17 00:00:00 2001 From: Vardhan Thigle Date: Wed, 9 Jan 2019 17:20:37 +0530 Subject: [PATCH 40/86] Exposing enclave image-base to the enclave application image-base could be used by crates like backtrace to providing to make symbol resolution easier. --- src/libstd/sys/sgx/abi/mem.rs | 4 +++- src/libstd/sys/sgx/backtrace.rs | 8 ++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/libstd/sys/sgx/abi/mem.rs b/src/libstd/sys/sgx/abi/mem.rs index 09552d5b4af29..808f1ce3ff2c7 100644 --- a/src/libstd/sys/sgx/abi/mem.rs +++ b/src/libstd/sys/sgx/abi/mem.rs @@ -17,8 +17,10 @@ extern { // Do not remove inline: will result in relocation failure // For the same reason we use inline ASM here instead of an extern static to // locate the base +/// Returns address at which current enclave is loaded. #[inline(always)] -fn image_base() -> u64 { +#[unstable(feature = "sgx_platform", issue = "56975")] +pub fn image_base() -> u64 { let base; unsafe { asm!("lea IMAGE_BASE(%rip),$0":"=r"(base)) }; base diff --git a/src/libstd/sys/sgx/backtrace.rs b/src/libstd/sys/sgx/backtrace.rs index 7e792300f434c..2b8e1da05791d 100644 --- a/src/libstd/sys/sgx/backtrace.rs +++ b/src/libstd/sys/sgx/backtrace.rs @@ -3,6 +3,7 @@ use error::Error; use libc; use sys_common::backtrace::Frame; use unwind as uw; +use sys::sgx::abi::mem::image_base; pub struct BacktraceContext; @@ -75,11 +76,6 @@ extern "C" fn trace_fn( uw::_URC_NO_REASON } -extern { - static IMAGE_BASE: u8; -} - - // To reduce TCB size in Sgx enclave, we do not want to implement resolve_symname functionality. // Rather, we print the offset of the address here, which could be later mapped to correct function. pub fn resolve_symname(frame: Frame, @@ -88,7 +84,7 @@ pub fn resolve_symname(frame: Frame, where F: FnOnce(Option<&str>) -> io::Result<()> { callback(Some(&format!("0x{:x}", - (unsafe {frame.symbol_addr.wrapping_offset_from(&IMAGE_BASE)})))) + (frame.symbol_addr.wrapping_offset_from(image_base() as _))))) } pub fn foreach_symbol_fileline(_: Frame, From 4da3a1cb819a6475046715a9853fd78b327e323d Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 9 Jan 2019 16:03:01 +0100 Subject: [PATCH 41/86] update miri --- src/tools/miri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri b/src/tools/miri index 2e2a33aab8972..97f4cff8e904c 160000 --- a/src/tools/miri +++ b/src/tools/miri @@ -1 +1 @@ -Subproject commit 2e2a33aab897273a36498d526530f648d6113dc8 +Subproject commit 97f4cff8e904c268569d37922a27835209deff5d From f82ecff4d17ab0f90979294ccf5f5079d9df08eb Mon Sep 17 00:00:00 2001 From: Aaron Power Date: Wed, 9 Jan 2019 16:12:12 +0100 Subject: [PATCH 42/86] Updated RELEASES.md for 1.32.0 --- RELEASES.md | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index 7022a86a45c5b..887b6e9c39f70 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,266 @@ +Version 1.32.0 (2019-01-17) +========================== + +Language +-------- +#### 2018 edition +- [You can now use the `?` operator in macro definitions.][56245] The `?` + operator allows you to specify zero or one repetitions similar to the `*` and + `+` operators. + +#### All editions +- [You can now match against `PhantomData` types.][55837] +- [You can now match against literals in macros with the `literal` + specifier.][56072] This will match against a literal of any type. + E.g. `1`, `'A'`, `"Hello World"` +- [Self can now be used as a constructor and pattern.][56365] E.g. + ```rust + struct Point(i32, i32); + + impl Point { + pub fn new(x: i32, y: i32) -> Self { + Self(x, y) + } + + pub fn is_origin(&self) -> bool { + match self { + Self(0, 0) => true, + _ => false, + } + } + } + ``` +- [Self can also now be used in type definitions.][56366] E.g. + ```rust + enum List + where + Self: PartialOrd // can write `Self` instead of `List` + { + Nil, + Cons(T, Box) // likewise here + } + ``` + +Compiler +-------- +- [You can now mark traits with `#[must_use]`.][55663] Providing a warning if + they unused in a program. +- [The default allocator has changed from jemalloc to the default allocator on + your system.][55238] The compiler itself on Linux & macOS will still use + jemalloc, but programs compiled with them will use the system allocator. +- [Added the `aarch64-pc-windows-msvc` target.][55702] + +Libraries +--------- +- [`PathBuf` now implements `FromStr`.][55148] +- [`Box<[T]>` now implements `FromIterator`.][55843] +- [The `dbg!` macro has been stabilized.][56395] This macro enables you to + easily debug expressions in your rust program. E.g. + ```rust + let a = 2; + let b = dbg!(a * 2) + 1; + // ^-- prints: [src/main.rs:4] a * 2 = 4 + assert_eq!(b, 5); + ``` + +The following APIs are now `const` functions and can be used in a +`const` context. + +- [`Cell::as_ptr`] +- [`UnsafeCell::get`] +- [`char::is_ascii`] +- [`iter::empty`] +- [`ManuallyDrop::new`] +- [`ManuallyDrop::into_inner`] +- [`RangeInclusive::start`] +- [`RangeInclusive::end`] +- [`NonNull::as_ptr`] +- [`[T]::as_ptr`] +- [`str::as_ptr`] +- [`Duration::as_secs`] +- [`Duration::subsec_millis`] +- [`Duration::subsec_micros`] +- [`Duration::subsec_nanos`] +- [`CStr::as_ptr`] +- [`Ipv4Addr::is_unspecified`] +- [`Ipv6Addr::new`] +- [`Ipv6Addr::octets`] + +Stabilized APIs +--------------- +- [`i8::to_be_bytes`] +- [`i8::to_le_bytes`] +- [`i8::to_ne_bytes`] +- [`i8::from_be_bytes`] +- [`i8::from_le_bytes`] +- [`i8::from_ne_bytes`] +- [`i16::to_be_bytes`] +- [`i16::to_le_bytes`] +- [`i16::to_ne_bytes`] +- [`i16::from_be_bytes`] +- [`i16::from_le_bytes`] +- [`i16::from_ne_bytes`] +- [`i32::to_be_bytes`] +- [`i32::to_le_bytes`] +- [`i32::to_ne_bytes`] +- [`i32::from_be_bytes`] +- [`i32::from_le_bytes`] +- [`i32::from_ne_bytes`] +- [`i64::to_be_bytes`] +- [`i64::to_le_bytes`] +- [`i64::to_ne_bytes`] +- [`i64::from_be_bytes`] +- [`i64::from_le_bytes`] +- [`i64::from_ne_bytes`] +- [`isize::to_be_bytes`] +- [`isize::to_le_bytes`] +- [`isize::to_ne_bytes`] +- [`isize::from_be_bytes`] +- [`isize::from_le_bytes`] +- [`isize::from_ne_bytes`] +- [`u8::to_be_bytes`] +- [`u8::to_le_bytes`] +- [`u8::to_ne_bytes`] +- [`u8::from_be_bytes`] +- [`u8::from_le_bytes`] +- [`u8::from_ne_bytes`] +- [`u16::to_be_bytes`] +- [`u16::to_le_bytes`] +- [`u16::to_ne_bytes`] +- [`u16::from_be_bytes`] +- [`u16::from_le_bytes`] +- [`u16::from_ne_bytes`] +- [`u32::to_be_bytes`] +- [`u32::to_le_bytes`] +- [`u32::to_ne_bytes`] +- [`u32::from_be_bytes`] +- [`u32::from_le_bytes`] +- [`u32::from_ne_bytes`] +- [`u64::to_be_bytes`] +- [`u64::to_le_bytes`] +- [`u64::to_ne_bytes`] +- [`u64::from_be_bytes`] +- [`u64::from_le_bytes`] +- [`u64::from_ne_bytes`] +- [`usize::to_be_bytes`] +- [`usize::to_le_bytes`] +- [`usize::to_ne_bytes`] +- [`usize::from_be_bytes`] +- [`usize::from_le_bytes`] +- [`usize::from_ne_bytes`] + +Cargo +----- +- [You can now run `cargo c` as an alias for `cargo check`.][cargo/6218] +- [Usernames are now allowed in alt registry URLs.][cargo/6242] + +Misc +---- +- [`libproc_macro` has been added to the `rust-src` distribution.][55280] + +Compatibility Notes +------------------- +- [The argument types for AVX's + `_mm256_stream_si256`, `_mm256_stream_pd`, `_mm256_stream_ps`][55610] have + been changed from `*const` to `*mut` as the previous implementation + was unsound. + +[55148]: https://github.com/rust-lang/rust/pull/55148/ +[55238]: https://github.com/rust-lang/rust/pull/55238/ +[55280]: https://github.com/rust-lang/rust/pull/55280/ +[55610]: https://github.com/rust-lang/rust/pull/55610/ +[55663]: https://github.com/rust-lang/rust/pull/55663/ +[55702]: https://github.com/rust-lang/rust/pull/55702/ +[55837]: https://github.com/rust-lang/rust/pull/55837/ +[55843]: https://github.com/rust-lang/rust/pull/55843/ +[56072]: https://github.com/rust-lang/rust/pull/56072/ +[56245]: https://github.com/rust-lang/rust/pull/56245/ +[56365]: https://github.com/rust-lang/rust/pull/56365/ +[56366]: https://github.com/rust-lang/rust/pull/56366/ +[56395]: https://github.com/rust-lang/rust/pull/56395/ +[cargo/6218]: https://github.com/rust-lang/cargo/pull/6218/ +[cargo/6242]: https://github.com/rust-lang/cargo/pull/6242/ +[`CStr::as_ptr`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.as_ptr +[`Cell::as_ptr`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr +[`Duration::as_secs`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs +[`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros +[`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis +[`Duration::subsec_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_nanos +[`Ipv4Addr::is_unspecified`]: https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified +[`Ipv6Addr::new`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.new +[`Ipv6Addr::octets`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets +[`ManuallyDrop::into_inner`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.into_inner +[`ManuallyDrop::new`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.new +[`NonNull::as_ptr`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.as_ptr +[`RangeInclusive::end`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end +[`RangeInclusive::start`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start +[`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get +[`[T]::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr +[`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii +[`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes +[`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes +[`i16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes +[`i16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_be_bytes +[`i16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_le_bytes +[`i16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_ne_bytes +[`i32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_be_bytes +[`i32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_le_bytes +[`i32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_ne_bytes +[`i32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_be_bytes +[`i32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_le_bytes +[`i32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_ne_bytes +[`i64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_be_bytes +[`i64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_le_bytes +[`i64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_ne_bytes +[`i64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_be_bytes +[`i64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_le_bytes +[`i64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_ne_bytes +[`i8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_be_bytes +[`i8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_le_bytes +[`i8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_ne_bytes +[`i8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_be_bytes +[`i8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_le_bytes +[`i8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_ne_bytes +[`isize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_be_bytes +[`isize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_le_bytes +[`isize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_ne_bytes +[`isize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_be_bytes +[`isize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_le_bytes +[`isize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes +[`iter::empty`]: https://doc.rust-lang.org/std/iter/fn.empty.html +[`str::as_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_ptr +[`u16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes +[`u16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes +[`u16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes +[`u16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_be_bytes +[`u16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_le_bytes +[`u16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_ne_bytes +[`u32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_be_bytes +[`u32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_le_bytes +[`u32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_ne_bytes +[`u32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_be_bytes +[`u32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_le_bytes +[`u32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_ne_bytes +[`u64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_be_bytes +[`u64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_le_bytes +[`u64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_ne_bytes +[`u64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_be_bytes +[`u64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_le_bytes +[`u64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_ne_bytes +[`u8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_be_bytes +[`u8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_le_bytes +[`u8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_ne_bytes +[`u8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_be_bytes +[`u8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_le_bytes +[`u8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ne_bytes +[`usize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_be_bytes +[`usize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_le_bytes +[`usize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_ne_bytes +[`usize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_be_bytes +[`usize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_le_bytes +[`usize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_ne_bytes + + Version 1.31.1 (2018-12-20) =========================== From 4a454d629cfabe0501f8e5fe3586df313acea2d6 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Tue, 8 Jan 2019 14:58:29 -0500 Subject: [PATCH 43/86] actually take a slice in this example Fixes #45678 --- src/libstd/primitive_docs.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libstd/primitive_docs.rs b/src/libstd/primitive_docs.rs index 475c9b4aeaa4e..c2751508ce094 100644 --- a/src/libstd/primitive_docs.rs +++ b/src/libstd/primitive_docs.rs @@ -550,7 +550,6 @@ mod prim_array { } #[doc(alias = "[")] #[doc(alias = "]")] #[doc(alias = "[]")] -// /// A dynamically-sized view into a contiguous sequence, `[T]`. /// /// *[See also the `std::slice` module](slice/index.html).* @@ -572,11 +571,11 @@ mod prim_array { } /// points to: /// /// ``` -/// let x = &mut [1, 2, 3]; +/// let mut x = [1, 2, 3]; +/// let x = &mut x[..]; // Take a full slice of `x`. /// x[1] = 7; /// assert_eq!(x, &[1, 7, 3]); /// ``` -/// #[stable(feature = "rust1", since = "1.0.0")] mod prim_slice { } From 60677a86bfbdbf9134b618f84053eaa41add4994 Mon Sep 17 00:00:00 2001 From: Aaron Power Date: Thu, 10 Jan 2019 10:08:07 +0100 Subject: [PATCH 44/86] Update RELEASES.md --- RELEASES.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 887b6e9c39f70..fec9046a08326 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -40,11 +40,11 @@ Language Cons(T, Box) // likewise here } ``` +- [You can now mark traits with `#[must_use]`.][55663] This provides a warning if + a `impl Trait` or `dyn Trait` is returned and unused in the program. Compiler -------- -- [You can now mark traits with `#[must_use]`.][55663] Providing a warning if - they unused in a program. - [The default allocator has changed from jemalloc to the default allocator on your system.][55238] The compiler itself on Linux & macOS will still use jemalloc, but programs compiled with them will use the system allocator. @@ -75,7 +75,7 @@ The following APIs are now `const` functions and can be used in a - [`RangeInclusive::start`] - [`RangeInclusive::end`] - [`NonNull::as_ptr`] -- [`[T]::as_ptr`] +- [`slice::as_ptr`] - [`str::as_ptr`] - [`Duration::as_secs`] - [`Duration::subsec_millis`] @@ -165,6 +165,7 @@ Compatibility Notes been changed from `*const` to `*mut` as the previous implementation was unsound. + [55148]: https://github.com/rust-lang/rust/pull/55148/ [55238]: https://github.com/rust-lang/rust/pull/55238/ [55280]: https://github.com/rust-lang/rust/pull/55280/ @@ -195,7 +196,7 @@ Compatibility Notes [`RangeInclusive::end`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end [`RangeInclusive::start`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start [`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get -[`[T]::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr +[`slice::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr [`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii [`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes [`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes From 521031f1b8c9355aa508d243e8d4b2812c29c6ab Mon Sep 17 00:00:00 2001 From: Aaron Power Date: Thu, 10 Jan 2019 10:08:32 +0100 Subject: [PATCH 45/86] Apply suggestions from code review Co-Authored-By: Aaronepower --- RELEASES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index fec9046a08326..8179132c35521 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -13,7 +13,7 @@ Language - [You can now match against literals in macros with the `literal` specifier.][56072] This will match against a literal of any type. E.g. `1`, `'A'`, `"Hello World"` -- [Self can now be used as a constructor and pattern.][56365] E.g. +- [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g. ```rust struct Point(i32, i32); @@ -34,7 +34,7 @@ Language ```rust enum List where - Self: PartialOrd // can write `Self` instead of `List` + Self: PartialOrd // can write `Self` instead of `List` { Nil, Cons(T, Box) // likewise here @@ -47,7 +47,7 @@ Compiler -------- - [The default allocator has changed from jemalloc to the default allocator on your system.][55238] The compiler itself on Linux & macOS will still use - jemalloc, but programs compiled with them will use the system allocator. + jemalloc, but programs compiled with it will use the system allocator. - [Added the `aarch64-pc-windows-msvc` target.][55702] Libraries From dd326f84fb0acb10aaa18da23db56e92dc79afdb Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 9 Jan 2019 17:14:11 -0800 Subject: [PATCH 46/86] Integrate miri into build-manifest This fixes a mistake where miri was accidentally left out of the build-manifest parsing, meaning that today's nightly generated a manifest with invalid urls! --- src/bootstrap/dist.rs | 2 +- src/tools/build-manifest/src/main.rs | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index 3f9a093149423..df34dfe4544ae 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -1984,6 +1984,7 @@ impl Step for HashSign { cmd.arg(distdir(builder)); cmd.arg(today.trim()); cmd.arg(builder.rust_package_vers()); + cmd.arg(addr); cmd.arg(builder.package_vers(&builder.release_num("cargo"))); cmd.arg(builder.package_vers(&builder.release_num("rls"))); cmd.arg(builder.package_vers(&builder.release_num("clippy"))); @@ -1991,7 +1992,6 @@ impl Step for HashSign { cmd.arg(builder.package_vers(&builder.release_num("rustfmt"))); cmd.arg(builder.llvm_tools_package_vers()); cmd.arg(builder.lldb_package_vers()); - cmd.arg(addr); builder.create_dir(&distdir(builder)); diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index 574526c6a56a3..28c0b6ccb3187 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -192,6 +192,7 @@ struct Builder { rustfmt_release: String, llvm_tools_release: String, lldb_release: String, + miri_release: String, input: PathBuf, output: PathBuf, @@ -207,6 +208,7 @@ struct Builder { rustfmt_version: Option, llvm_tools_version: Option, lldb_version: Option, + miri_version: Option, rust_git_commit_hash: Option, cargo_git_commit_hash: Option, @@ -215,6 +217,7 @@ struct Builder { rustfmt_git_commit_hash: Option, llvm_tools_git_commit_hash: Option, lldb_git_commit_hash: Option, + miri_git_commit_hash: Option, should_sign: bool, } @@ -237,13 +240,14 @@ fn main() { let output = PathBuf::from(args.next().unwrap()); let date = args.next().unwrap(); let rust_release = args.next().unwrap(); + let s3_address = args.next().unwrap(); let cargo_release = args.next().unwrap(); let rls_release = args.next().unwrap(); let clippy_release = args.next().unwrap(); + let miri_release = args.next().unwrap(); let rustfmt_release = args.next().unwrap(); let llvm_tools_release = args.next().unwrap(); let lldb_release = args.next().unwrap(); - let s3_address = args.next().unwrap(); // Do not ask for a passphrase while manually testing let mut passphrase = String::new(); @@ -259,6 +263,7 @@ fn main() { rustfmt_release, llvm_tools_release, lldb_release, + miri_release, input, output, @@ -274,6 +279,7 @@ fn main() { rustfmt_version: None, llvm_tools_version: None, lldb_version: None, + miri_version: None, rust_git_commit_hash: None, cargo_git_commit_hash: None, @@ -282,6 +288,7 @@ fn main() { rustfmt_git_commit_hash: None, llvm_tools_git_commit_hash: None, lldb_git_commit_hash: None, + miri_git_commit_hash: None, should_sign, }.build(); @@ -297,6 +304,7 @@ impl Builder { self.llvm_tools_version = self.version("llvm-tools", "x86_64-unknown-linux-gnu"); // lldb is only built for macOS. self.lldb_version = self.version("lldb", "x86_64-apple-darwin"); + self.miri_version = self.version("miri", "x86_64-unknown-linux-gnu"); self.rust_git_commit_hash = self.git_commit_hash("rust", "x86_64-unknown-linux-gnu"); self.cargo_git_commit_hash = self.git_commit_hash("cargo", "x86_64-unknown-linux-gnu"); @@ -306,6 +314,7 @@ impl Builder { self.llvm_tools_git_commit_hash = self.git_commit_hash("llvm-tools", "x86_64-unknown-linux-gnu"); self.lldb_git_commit_hash = self.git_commit_hash("lldb", "x86_64-unknown-linux-gnu"); + self.miri_git_commit_hash = self.git_commit_hash("miri", "x86_64-unknown-linux-gnu"); self.digest_and_sign(); let manifest = self.build_manifest(); @@ -516,6 +525,8 @@ impl Builder { format!("llvm-tools-{}-{}.tar.gz", self.llvm_tools_release, target) } else if component == "lldb" || component == "lldb-preview" { format!("lldb-{}-{}.tar.gz", self.lldb_release, target) + } else if component == "miri" || component == "miri-preview" { + format!("miri-{}-{}.tar.gz", self.miri_release, target) } else { format!("{}-{}-{}.tar.gz", component, self.rust_release, target) } @@ -534,6 +545,8 @@ impl Builder { &self.llvm_tools_version } else if component == "lldb" || component == "lldb-preview" { &self.lldb_version + } else if component == "miri" || component == "miri-preview" { + &self.miri_version } else { &self.rust_version } @@ -552,6 +565,8 @@ impl Builder { &self.llvm_tools_git_commit_hash } else if component == "lldb" || component == "lldb-preview" { &self.lldb_git_commit_hash + } else if component == "miri" || component == "miri-preview" { + &self.miri_git_commit_hash } else { &self.rust_git_commit_hash } From 29a8386bb3b7ff8434f4b1b5be0fd51a48d93bb3 Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Thu, 10 Jan 2019 13:42:59 -0500 Subject: [PATCH 47/86] use structured suggestion when casting a reference --- src/librustc_typeck/check/cast.rs | 10 ++++++++-- src/test/ui/error-codes/E0606.stderr | 11 ++++------- src/test/ui/error-festival.stderr | 11 ++++------- src/test/ui/mismatched_types/cast-rfc0401.stderr | 11 ++++------- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/librustc_typeck/check/cast.rs b/src/librustc_typeck/check/cast.rs index 38f9adee0a48f..fbba89164e6db 100644 --- a/src/librustc_typeck/check/cast.rs +++ b/src/librustc_typeck/check/cast.rs @@ -213,8 +213,14 @@ impl<'a, 'gcx, 'tcx> CastCheck<'tcx> { fcx.ty_to_string(self.expr_ty), cast_ty)); if let Ok(snippet) = fcx.sess().source_map().span_to_snippet(self.expr.span) { - err.span_help(self.expr.span, - &format!("did you mean `*{}`?", snippet)); + err.span_suggestion_with_applicability( + self.expr.span, + "dereference the expression", + format!("*{}", snippet), + Applicability::MaybeIncorrect, + ); + } else { + err.span_help(self.expr.span, "dereference the expression with `*`"); } err.emit(); } diff --git a/src/test/ui/error-codes/E0606.stderr b/src/test/ui/error-codes/E0606.stderr index bc872b3b79cce..89ec4896a2b43 100644 --- a/src/test/ui/error-codes/E0606.stderr +++ b/src/test/ui/error-codes/E0606.stderr @@ -2,13 +2,10 @@ error[E0606]: casting `&u8` as `u8` is invalid --> $DIR/E0606.rs:2:5 | LL | &0u8 as u8; //~ ERROR E0606 - | ^^^^^^^^^^ cannot cast `&u8` as `u8` - | -help: did you mean `*&0u8`? - --> $DIR/E0606.rs:2:5 - | -LL | &0u8 as u8; //~ ERROR E0606 - | ^^^^ + | ----^^^^^^ + | | + | cannot cast `&u8` as `u8` + | help: dereference the expression: `*&0u8` error: aborting due to previous error diff --git a/src/test/ui/error-festival.stderr b/src/test/ui/error-festival.stderr index 2a48272216919..ef7b49399bf3a 100644 --- a/src/test/ui/error-festival.stderr +++ b/src/test/ui/error-festival.stderr @@ -60,13 +60,10 @@ error[E0606]: casting `&u8` as `u32` is invalid --> $DIR/error-festival.rs:37:18 | LL | let y: u32 = x as u32; - | ^^^^^^^^ cannot cast `&u8` as `u32` - | -help: did you mean `*x`? - --> $DIR/error-festival.rs:37:18 - | -LL | let y: u32 = x as u32; - | ^ + | -^^^^^^^ + | | + | cannot cast `&u8` as `u32` + | help: dereference the expression: `*x` error[E0607]: cannot cast thin pointer `*const u8` to fat pointer `*const [u8]` --> $DIR/error-festival.rs:41:5 diff --git a/src/test/ui/mismatched_types/cast-rfc0401.stderr b/src/test/ui/mismatched_types/cast-rfc0401.stderr index 158d114616979..fbe5e6d409934 100644 --- a/src/test/ui/mismatched_types/cast-rfc0401.stderr +++ b/src/test/ui/mismatched_types/cast-rfc0401.stderr @@ -240,13 +240,10 @@ error[E0606]: casting `&{float}` as `f32` is invalid --> $DIR/cast-rfc0401.rs:71:30 | LL | vec![0.0].iter().map(|s| s as f32).collect::>(); //~ ERROR is invalid - | ^^^^^^^^ cannot cast `&{float}` as `f32` - | -help: did you mean `*s`? - --> $DIR/cast-rfc0401.rs:71:30 - | -LL | vec![0.0].iter().map(|s| s as f32).collect::>(); //~ ERROR is invalid - | ^ + | -^^^^^^^ + | | + | cannot cast `&{float}` as `f32` + | help: dereference the expression: `*s` error: aborting due to 34 previous errors From f282f6b1f73f48e050028c121f1eb22a8cac9494 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Thu, 10 Jan 2019 15:30:36 -0500 Subject: [PATCH 48/86] make note of one more normalization that Paths do Fixes #29008 --- src/libstd/path.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libstd/path.rs b/src/libstd/path.rs index 317a7d817db43..d9ca6d3eb718a 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -2202,6 +2202,8 @@ impl Path { /// beginning of the path. For example, `a/./b`, `a/b/`, `a/b/.` and /// `a/b` all have `a` and `b` as components, but `./a/b` starts with /// an additional [`CurDir`] component. + /// + /// * A trailing slash is normalized away, `/a/b` and `/a/b/` are equivalent. /// /// Note that no other normalization takes place; in particular, `a/c` /// and `a/b/../c` are distinct, to account for the possibility that `b` From 359e6bf30be14dc6609d943e0304d5a05c477841 Mon Sep 17 00:00:00 2001 From: Aaron Power Date: Thu, 10 Jan 2019 23:07:38 +0100 Subject: [PATCH 49/86] Update RELEASES.md --- RELEASES.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index 8179132c35521..e82a8a613b955 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -7,6 +7,15 @@ Language - [You can now use the `?` operator in macro definitions.][56245] The `?` operator allows you to specify zero or one repetitions similar to the `*` and `+` operators. +- [Module paths with no leading keyword like `super`, `self`, or `crate`, will + now always resolve to the item (`enum`, `struct`, etc.) available in the + module if present, before resolving to a external crate or an item the prelude.][56759] + E.g. + ```rust + enum Color { Red, Green, Blue } + + use Color::*; + ``` #### All editions - [You can now match against `PhantomData` types.][55837] @@ -179,6 +188,7 @@ Compatibility Notes [56365]: https://github.com/rust-lang/rust/pull/56365/ [56366]: https://github.com/rust-lang/rust/pull/56366/ [56395]: https://github.com/rust-lang/rust/pull/56395/ +[56759]: https://github.com/rust-lang/rust/pull/56759/ [cargo/6218]: https://github.com/rust-lang/cargo/pull/6218/ [cargo/6242]: https://github.com/rust-lang/cargo/pull/6242/ [`CStr::as_ptr`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.as_ptr From beb6495862942903d71e39e328b62b58cd6d2bb2 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Thu, 10 Jan 2019 15:40:05 -0500 Subject: [PATCH 50/86] note that FromStr does not work for borrowed types Fixes #47757 --- src/libcore/str/mod.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs index 689d456d41246..bdde187d931cc 100644 --- a/src/libcore/str/mod.rs +++ b/src/libcore/str/mod.rs @@ -20,8 +20,7 @@ pub mod pattern; #[allow(missing_docs)] pub mod lossy; -/// A trait to abstract the idea of creating a new instance of a type from a -/// string. +/// Parse a value from a string /// /// `FromStr`'s [`from_str`] method is often used implicitly, through /// [`str`]'s [`parse`] method. See [`parse`]'s documentation for examples. @@ -30,6 +29,11 @@ pub mod lossy; /// [`str`]: ../../std/primitive.str.html /// [`parse`]: ../../std/primitive.str.html#method.parse /// +/// `FromStr` does not have a lifetime parameter, and so you can only parse types +/// that do not contain a lifetime parameter themselves. In other words, you can +/// parse an `i32` with `FromStr`, but not a `&i32`. You can parse a struct that +/// contains an `i32`, but not one that contains an `&i32`. +/// /// # Examples /// /// Basic implementation of `FromStr` on an example `Point` type: From e598ea83c88c5dfe203c5f39d391ed01626e4a17 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Thu, 10 Jan 2019 17:08:42 -0500 Subject: [PATCH 51/86] Update src/libstd/path.rs Co-Authored-By: steveklabnik --- src/libstd/path.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/path.rs b/src/libstd/path.rs index d9ca6d3eb718a..5c7bff70a0dcd 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -2202,7 +2202,7 @@ impl Path { /// beginning of the path. For example, `a/./b`, `a/b/`, `a/b/.` and /// `a/b` all have `a` and `b` as components, but `./a/b` starts with /// an additional [`CurDir`] component. - /// + /// /// * A trailing slash is normalized away, `/a/b` and `/a/b/` are equivalent. /// /// Note that no other normalization takes place; in particular, `a/c` From 890a8a45c2b3264cc487411e7d2878cb42149965 Mon Sep 17 00:00:00 2001 From: Aaron Power Date: Thu, 10 Jan 2019 23:28:18 +0100 Subject: [PATCH 52/86] Update RELEASES.md --- RELEASES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e82a8a613b955..aae25ab9988e9 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -45,8 +45,8 @@ Language where Self: PartialOrd // can write `Self` instead of `List` { - Nil, - Cons(T, Box) // likewise here + Nil, + Cons(T, Box) // likewise here } ``` - [You can now mark traits with `#[must_use]`.][55663] This provides a warning if From 27989ec30b0981ef0f972d793e43aa5ce0a2e799 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Fri, 11 Jan 2019 14:27:12 +1300 Subject: [PATCH 53/86] Remove submodule step from README Since the bootstrap does it now --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7eb5e8067eda2..cb1f06257ed15 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,6 @@ Read ["Installation"] from [The Book]. 3. Build and install: ```sh - $ git submodule update --init --recursive --progress $ ./x.py build && sudo ./x.py install ``` From 4103e5b34bcd5fff13afe79494d6955d7996c804 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Fri, 11 Jan 2019 18:13:45 +1300 Subject: [PATCH 54/86] Add a profiles section to the manifest --- src/tools/build-manifest/src/main.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index 28c0b6ccb3187..b00daa716777f 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -131,7 +131,8 @@ struct Manifest { manifest_version: String, date: String, pkg: BTreeMap, - renames: BTreeMap + renames: BTreeMap, + profiles: BTreeMap>, } #[derive(Serialize)] @@ -340,6 +341,7 @@ impl Builder { date: self.date.to_string(), pkg: BTreeMap::new(), renames: BTreeMap::new(), + profiles: BTreeMap::new(), }; self.package("rustc", &mut manifest.pkg, HOSTS); @@ -355,6 +357,20 @@ impl Builder { self.package("llvm-tools-preview", &mut manifest.pkg, TARGETS); self.package("lldb-preview", &mut manifest.pkg, TARGETS); + self.profile("minimal", + &mut manifest.profiles, + &["rustc", "cargo", "rust-std", "rust-mingw"]); + self.profile("default", + &mut manifest.profiles, + &["rustc", "cargo", "rust-std", "rust-mingw", + "rust-docs", "rustfmt-preview", "clippy-preview"]); + self.profile("complete", + &mut manifest.profiles, + &["rustc", "cargo", "rust-std", "rust-mingw", + "rust-docs", "rustfmt-preview", "clippy-preview", + "rls-preview", "rust-src", "llvm-tools-preview", + "lldb-preview", "rust-analysis"]); + manifest.renames.insert("rls".to_owned(), Rename { to: "rls-preview".to_owned() }); manifest.renames.insert("rustfmt".to_owned(), Rename { to: "rustfmt-preview".to_owned() }); manifest.renames.insert("clippy".to_owned(), Rename { to: "clippy-preview".to_owned() }); @@ -453,6 +469,13 @@ impl Builder { return manifest; } + fn profile(&mut self, + profile_name: &str, + dst: &mut BTreeMap>, + pkgs: &[&str]) { + dst.insert(profile_name.to_owned(), pkgs.iter().map(|s| (*s).to_owned()).collect()); + } + fn package(&mut self, pkgname: &str, dst: &mut BTreeMap, From 928efca151b0afcff90771ef94e09f7634646082 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Fri, 11 Jan 2019 15:00:08 +0530 Subject: [PATCH 55/86] Fix undefined behavior --- src/libstd/sys/sgx/ext/arch.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/sys/sgx/ext/arch.rs b/src/libstd/sys/sgx/ext/arch.rs index ba6f9e622ad35..3bd87b5d26574 100644 --- a/src/libstd/sys/sgx/ext/arch.rs +++ b/src/libstd/sys/sgx/ext/arch.rs @@ -36,7 +36,7 @@ pub fn egetkey(request: &Align512<[u8; 512]>) -> Result, u32> : "={eax}"(error) : "{eax}"(ENCLU_EGETKEY), "{rbx}"(request), - "{rcx}"(out.get_mut()) + "{rcx}"(out.as_mut_ptr()) : "flags" ); @@ -66,7 +66,7 @@ pub fn ereport( : "{eax}"(ENCLU_EREPORT), "{rbx}"(targetinfo), "{rcx}"(reportdata), - "{rdx}"(report.get_mut()) + "{rdx}"(report.as_mut_ptr()) ); report.into_inner() From 16a4e477d8f5c3950238aa083781e21d5ef671fb Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Fri, 11 Jan 2019 12:19:08 +0100 Subject: [PATCH 56/86] Remove unneeded but benign change --- src/librustc_mir/transform/qualify_consts.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index ddd714fd27e59..193b0fe05f002 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -359,7 +359,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> { LocalKind::ReturnPointer => { self.not_const(); } - LocalKind::Arg | LocalKind::Var if self.mode == Mode::Fn => { self.add(Qualif::NOT_CONST); } From 434fe4e3569298ea4855f3024466764cc317542c Mon Sep 17 00:00:00 2001 From: Alexander Ronald Altman Date: Fri, 11 Jan 2019 11:06:56 -0600 Subject: [PATCH 57/86] Correct RELEASES.md for 1.32.0 The `into_to_from_bytes` feature was stabilized for `i128` and `u128` just like for the other integer types, but they seem to have been missed. --- RELEASES.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index aae25ab9988e9..a8979b5ea9c83 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -121,6 +121,12 @@ Stabilized APIs - [`i64::from_be_bytes`] - [`i64::from_le_bytes`] - [`i64::from_ne_bytes`] +- [`i128::to_be_bytes`] +- [`i128::to_le_bytes`] +- [`i128::to_ne_bytes`] +- [`i128::from_be_bytes`] +- [`i128::from_le_bytes`] +- [`i128::from_ne_bytes`] - [`isize::to_be_bytes`] - [`isize::to_le_bytes`] - [`isize::to_ne_bytes`] @@ -151,6 +157,12 @@ Stabilized APIs - [`u64::from_be_bytes`] - [`u64::from_le_bytes`] - [`u64::from_ne_bytes`] +- [`u128::to_be_bytes`] +- [`u128::to_le_bytes`] +- [`u128::to_ne_bytes`] +- [`u128::from_be_bytes`] +- [`u128::from_le_bytes`] +- [`u128::from_ne_bytes`] - [`usize::to_be_bytes`] - [`usize::to_le_bytes`] - [`usize::to_ne_bytes`] From 020e1f5b60d406524599bff35b43167f2af4302f Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Fri, 11 Jan 2019 12:40:05 -0500 Subject: [PATCH 58/86] don't unwrap unexpected tokens in `format!` Fixes #57512. --- src/libsyntax_ext/format.rs | 2 +- src/test/ui/macros/format-parse-errors.rs | 1 + src/test/ui/macros/format-parse-errors.stderr | 14 ++++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index 61722ba551653..3e3bca7080fb6 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -159,7 +159,7 @@ fn parse_args<'a>( }; let name: &str = &ident.as_str(); - p.expect(&token::Eq).unwrap(); + p.expect(&token::Eq)?; let e = p.parse_expr()?; if let Some(prev) = names.get(name) { ecx.struct_span_err(e.span, &format!("duplicate argument named `{}`", name)) diff --git a/src/test/ui/macros/format-parse-errors.rs b/src/test/ui/macros/format-parse-errors.rs index ba1e441fe339f..96aee5e6aeed5 100644 --- a/src/test/ui/macros/format-parse-errors.rs +++ b/src/test/ui/macros/format-parse-errors.rs @@ -2,6 +2,7 @@ fn main() { format!(); //~ ERROR requires at least a format string argument format!(struct); //~ ERROR expected expression format!("s", name =); //~ ERROR expected expression + format!("s", foo = foo, bar); //~ ERROR expected `=` format!("s", foo = struct); //~ ERROR expected expression format!("s", struct); //~ ERROR expected expression diff --git a/src/test/ui/macros/format-parse-errors.stderr b/src/test/ui/macros/format-parse-errors.stderr index 0463c54890177..a3d2786bce111 100644 --- a/src/test/ui/macros/format-parse-errors.stderr +++ b/src/test/ui/macros/format-parse-errors.stderr @@ -18,20 +18,26 @@ error: expected expression, found `` LL | format!("s", name =); //~ ERROR expected expression | ^ expected expression +error: expected `=`, found `` + --> $DIR/format-parse-errors.rs:5:29 + | +LL | format!("s", foo = foo, bar); //~ ERROR expected `=` + | ^^^ expected `=` + error: expected expression, found keyword `struct` - --> $DIR/format-parse-errors.rs:5:24 + --> $DIR/format-parse-errors.rs:6:24 | LL | format!("s", foo = struct); //~ ERROR expected expression | ^^^^^^ expected expression error: expected expression, found keyword `struct` - --> $DIR/format-parse-errors.rs:6:18 + --> $DIR/format-parse-errors.rs:7:18 | LL | format!("s", struct); //~ ERROR expected expression | ^^^^^^ expected expression error: format argument must be a string literal - --> $DIR/format-parse-errors.rs:9:13 + --> $DIR/format-parse-errors.rs:10:13 | LL | format!(123); //~ ERROR format argument must be a string literal | ^^^ @@ -40,5 +46,5 @@ help: you might be missing a string literal to format with LL | format!("{}", 123); //~ ERROR format argument must be a string literal | ^^^^^ -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors From fdd2f0d8235bb492c9895fb07f677dfab08dc868 Mon Sep 17 00:00:00 2001 From: Alexander Ronald Altman Date: Fri, 11 Jan 2019 13:59:04 -0600 Subject: [PATCH 59/86] Fix new hyperlinks in RELEASES.md --- RELEASES.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index a8979b5ea9c83..83c44774da283 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -220,6 +220,12 @@ Compatibility Notes [`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get [`slice::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr [`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii +[`i128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_be_bytes +[`i128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_le_bytes +[`i128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_ne_bytes +[`i128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_be_bytes +[`i128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_le_bytes +[`i128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_ne_bytes [`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes [`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes [`i16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes @@ -252,6 +258,12 @@ Compatibility Notes [`isize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes [`iter::empty`]: https://doc.rust-lang.org/std/iter/fn.empty.html [`str::as_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_ptr +[`u128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_be_bytes +[`u128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_le_bytes +[`u128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_ne_bytes +[`u128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_be_bytes +[`u128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_le_bytes +[`u128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_ne_bytes [`u16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes [`u16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes [`u16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes From 49e8318b0c4329b668b97b496e3cc044923e4504 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Fri, 11 Jan 2019 13:58:13 -0800 Subject: [PATCH 60/86] Fixing a typographical error. --- src/librustc_mir/diagnostics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_mir/diagnostics.rs b/src/librustc_mir/diagnostics.rs index 7e8ac3fb72006..212edaaa1ba66 100644 --- a/src/librustc_mir/diagnostics.rs +++ b/src/librustc_mir/diagnostics.rs @@ -2334,7 +2334,7 @@ local variable that already exists, and hence no temporary is created. Temporaries are not always dropped at the end of the enclosing statement. In simple cases where the `&` expression is immediately stored into a variable, the compiler will automatically extend -the lifetime of the temporary until the end of the enclosinb +the lifetime of the temporary until the end of the enclosing block. Therefore, an alternative way to fix the original program is to write `let tmp = &foo()` and not `let tmp = foo()`: From 561483e4e84405f832ada8f9435cd8c471139afb Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Fri, 11 Jan 2019 23:57:04 +0100 Subject: [PATCH 61/86] stabilize top level or-pats in if/while let. --- src/librustc_mir/lib.rs | 2 +- src/libsyntax/feature_gate.rs | 11 ++------- src/libsyntax/parse/parser.rs | 5 ++-- .../rfcs/rfc-2175-or-if-while-let/basic.rs | 13 ++++++++++- .../feature-gate-if_while_or_patterns.rs | 8 ------- .../feature-gate-if_while_or_patterns.stderr | 23 ------------------- 6 files changed, 18 insertions(+), 44 deletions(-) delete mode 100644 src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index 4735ebae9d42e..9395da60b3886 100644 --- a/src/librustc_mir/lib.rs +++ b/src/librustc_mir/lib.rs @@ -24,7 +24,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! #![feature(unicode_internals)] #![feature(step_trait)] #![feature(slice_concat_ext)] -#![feature(if_while_or_patterns)] +#![cfg_attr(stage0, feature(if_while_or_patterns))] #![feature(try_from)] #![feature(reverse_bits)] #![cfg_attr(stage0, feature(underscore_imports))] diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index cddec3eb23a5a..45b3ba604c62f 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -384,9 +384,6 @@ declare_features! ( // Infer static outlives requirements (RFC 2093). (active, infer_static_outlives_requirements, "1.26.0", Some(54185), None), - // Multiple patterns with `|` in `if let` and `while let`. - (active, if_while_or_patterns, "1.26.0", Some(48215), None), - // Allows macro invocations in `extern {}` blocks. (active, macros_in_extern, "1.27.0", Some(49476), None), @@ -688,6 +685,8 @@ declare_features! ( (accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None), // `#[cfg_attr(predicate, multiple, attributes, here)]` (accepted, cfg_attr_multi, "1.33.0", Some(54881), None), + // Top level or-patterns (`p | q`) in `if let` and `while let`. + (accepted, if_while_or_patterns, "1.33.0", Some(48215), None), ); // If you change this, please modify `src/doc/unstable-book` as well. You must @@ -1701,12 +1700,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { ast::ExprKind::TryBlock(_) => { gate_feature_post!(&self, try_blocks, e.span, "`try` expression is experimental"); } - ast::ExprKind::IfLet(ref pats, ..) | ast::ExprKind::WhileLet(ref pats, ..) => { - if pats.len() > 1 { - gate_feature_post!(&self, if_while_or_patterns, e.span, - "multiple patterns in `if let` and `while let` are unstable"); - } - } ast::ExprKind::Block(_, opt_label) => { if let Some(label) = opt_label { gate_feature_post!(&self, label_break_value, label.ident.span, diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 1e4a26b353759..b90eeaca54b97 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3660,8 +3660,6 @@ impl<'a> Parser<'a> { maybe_whole!(self, NtArm, |x| x); let attrs = self.parse_outer_attributes()?; - // Allow a '|' before the pats (RFC 1925) - self.eat(&token::BinOp(token::Or)); let pats = self.parse_pats()?; let guard = if self.eat_keyword(keywords::If) { Some(Guard::If(self.parse_expr()?)) @@ -3768,6 +3766,9 @@ impl<'a> Parser<'a> { /// Parse patterns, separated by '|' s fn parse_pats(&mut self) -> PResult<'a, Vec>> { + // Allow a '|' before the pats (RFC 1925 + RFC 2530) + self.eat(&token::BinOp(token::Or)); + let mut pats = Vec::new(); loop { pats.push(self.parse_top_level_pat()?); diff --git a/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs b/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs index f9bd2f471ae9d..22f04c58f3b3c 100644 --- a/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs +++ b/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs @@ -1,6 +1,5 @@ // run-pass #![allow(dead_code)] -#![feature(if_while_or_patterns)] enum E { V(u8), @@ -19,4 +18,16 @@ fn main() { assert_eq!(x, 10); e = W; } + + // Accept leading `|`: + + let mut e = V(10); + + if let | V(x) | U(x) = e { + assert_eq!(x, 10); + } + while let | V(x) | U(x) = e { + assert_eq!(x, 10); + e = W; + } } diff --git a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs b/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs deleted file mode 100644 index 233185f92e3f5..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs +++ /dev/null @@ -1,8 +0,0 @@ -fn main() { - if let 0 | 1 = 0 { //~ ERROR multiple patterns in `if let` and `while let` are unstable - ; - } - while let 0 | 1 = 1 { //~ ERROR multiple patterns in `if let` and `while let` are unstable - break; - } -} diff --git a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr b/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr deleted file mode 100644 index ff991819a9218..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr +++ /dev/null @@ -1,23 +0,0 @@ -error[E0658]: multiple patterns in `if let` and `while let` are unstable (see issue #48215) - --> $DIR/feature-gate-if_while_or_patterns.rs:2:5 - | -LL | / if let 0 | 1 = 0 { //~ ERROR multiple patterns in `if let` and `while let` are unstable -LL | | ; -LL | | } - | |_____^ - | - = help: add #![feature(if_while_or_patterns)] to the crate attributes to enable - -error[E0658]: multiple patterns in `if let` and `while let` are unstable (see issue #48215) - --> $DIR/feature-gate-if_while_or_patterns.rs:5:5 - | -LL | / while let 0 | 1 = 1 { //~ ERROR multiple patterns in `if let` and `while let` are unstable -LL | | break; -LL | | } - | |_____^ - | - = help: add #![feature(if_while_or_patterns)] to the crate attributes to enable - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0658`. From afcb93811650252f1533d4a1453ab697f787cfec Mon Sep 17 00:00:00 2001 From: varkor Date: Sat, 12 Jan 2019 03:10:59 +0000 Subject: [PATCH 62/86] Stabilise irrefutable if-let and while-let patterns This stabilises RFC 2086 (https://github.com/rust-lang/rust/issues/44495). Co-Authored-By: Sebastian Malton --- .../irrefutable-let-patterns.md | 28 ------- src/librustc/lint/builtin.rs | 2 +- src/librustc_mir/diagnostics.rs | 8 +- src/librustc_mir/hair/pattern/check_match.rs | 49 +++--------- src/libsyntax/feature_gate.rs | 5 +- .../binding/allow_irrefutable_let_patterns.rs | 12 --- src/test/ui/error-codes/E0162.rs | 8 -- src/test/ui/error-codes/E0162.stderr | 9 --- src/test/ui/error-codes/E0165.rs | 9 --- src/test/ui/error-codes/E0165.stderr | 9 --- ...e-gate-without_gate_irrefutable_pattern.rs | 8 -- ...te-without_gate_irrefutable_pattern.stderr | 9 --- src/test/ui/if/if-let.rs | 14 ++-- src/test/ui/if/if-let.stderr | 77 ++++++++++++------- src/test/ui/issues/issue-51714.rs | 2 +- src/test/ui/issues/issue-51714.stderr | 13 ++-- .../pattern/deny-irrefutable-let-patterns.rs | 9 +++ .../deny-irrefutable-let-patterns.stderr | 22 ++++++ .../pattern}/enum-variant-generic-args.rs | 3 +- .../ui/pattern/irrefutable-let-patterns.rs | 11 +++ .../syntax-ambiguity-2015.rs | 1 - .../syntax-ambiguity-2015.stderr | 12 +-- .../syntax-ambiguity-2018.rs | 1 - .../syntax-ambiguity-2018.stderr | 12 +-- ...fail-no_gate_irrefutable_if_let_pattern.rs | 5 -- ...-no_gate_irrefutable_if_let_pattern.stderr | 9 --- ...fail-with_gate_irrefutable_pattern_deny.rs | 7 -- ...-with_gate_irrefutable_pattern_deny.stderr | 10 --- src/test/ui/while-let.rs | 9 ++- src/test/ui/while-let.stderr | 41 ++++++---- 30 files changed, 175 insertions(+), 239 deletions(-) delete mode 100644 src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md delete mode 100644 src/test/run-pass/binding/allow_irrefutable_let_patterns.rs delete mode 100644 src/test/ui/error-codes/E0162.rs delete mode 100644 src/test/ui/error-codes/E0162.stderr delete mode 100644 src/test/ui/error-codes/E0165.rs delete mode 100644 src/test/ui/error-codes/E0165.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr create mode 100644 src/test/ui/pattern/deny-irrefutable-let-patterns.rs create mode 100644 src/test/ui/pattern/deny-irrefutable-let-patterns.stderr rename src/test/{run-pass => ui/pattern}/enum-variant-generic-args.rs (97%) create mode 100644 src/test/ui/pattern/irrefutable-let-patterns.rs delete mode 100644 src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs delete mode 100644 src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr delete mode 100644 src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs delete mode 100644 src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr diff --git a/src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md b/src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md deleted file mode 100644 index 46b843778e810..0000000000000 --- a/src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md +++ /dev/null @@ -1,28 +0,0 @@ -# `irrefutable_let_patterns` - -The tracking issue for this feature is: [#44495] - -[#44495]: https://github.com/rust-lang/rust/issues/44495 - ------------------------- - -This feature changes the way that "irrefutable patterns" are handled -in the `if let` and `while let` forms. An *irrefutable pattern* is one -that cannot fail to match -- for example, the `_` pattern matches any -value, and hence it is "irrefutable". Without this feature, using an -irrefutable pattern in an `if let` gives a hard error (since often -this indicates programmer error). But when the feature is enabled, the -error becomes a lint (since in some cases irrefutable patterns are -expected). This means you can use `#[allow]` to silence the lint: - -```rust -#![feature(irrefutable_let_patterns)] - -#[allow(irrefutable_let_patterns)] -fn main() { - // These two examples used to be errors, but now they - // trigger a lint (that is allowed): - if let _ = 5 {} - while let _ = 5 { break; } -} -``` diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 22854382df15c..c428ff1bd1b37 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -286,7 +286,7 @@ declare_lint! { declare_lint! { pub IRREFUTABLE_LET_PATTERNS, - Deny, + Warn, "detects irrefutable patterns in if-let and while-let statements" } diff --git a/src/librustc_mir/diagnostics.rs b/src/librustc_mir/diagnostics.rs index 7e8ac3fb72006..b045b1a6913c9 100644 --- a/src/librustc_mir/diagnostics.rs +++ b/src/librustc_mir/diagnostics.rs @@ -325,11 +325,13 @@ match Some(42) { "##, E0162: r##" +#### Note: this error code is no longer emitted by the compiler. + An if-let pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding instead. For instance: -```compile_fail,E0162 +```compile_pass struct Irrefutable(i32); let irr = Irrefutable(0); @@ -352,11 +354,13 @@ println!("{}", x); "##, E0165: r##" +#### Note: this error code is no longer emitted by the compiler. + A while-let pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding inside a `loop` instead. For instance: -```compile_fail,E0165 +```compile_pass,no_run struct Irrefutable(i32); let irr = Irrefutable(0); diff --git a/src/librustc_mir/hair/pattern/check_match.rs b/src/librustc_mir/hair/pattern/check_match.rs index c104af7a7d81b..10213beba2a6d 100644 --- a/src/librustc_mir/hair/pattern/check_match.rs +++ b/src/librustc_mir/hair/pattern/check_match.rs @@ -350,7 +350,6 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>, { let mut seen = Matrix::empty(); let mut catchall = None; - let mut printed_if_let_err = false; for (arm_index, &(ref pats, guard)) in arms.iter().enumerate() { for &(pat, hir_pat) in pats { let v = smallvec![pat]; @@ -359,27 +358,12 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>, NotUseful => { match source { hir::MatchSource::IfLetDesugar { .. } => { - if cx.tcx.features().irrefutable_let_patterns { - cx.tcx.lint_node( - lint::builtin::IRREFUTABLE_LET_PATTERNS, - hir_pat.id, pat.span, - "irrefutable if-let pattern"); - } else { - if printed_if_let_err { - // we already printed an irrefutable if-let pattern error. - // We don't want two, that's just confusing. - } else { - // find the first arm pattern so we can use its span - let &(ref first_arm_pats, _) = &arms[0]; - let first_pat = &first_arm_pats[0]; - let span = first_pat.0.span; - struct_span_err!(cx.tcx.sess, span, E0162, - "irrefutable if-let pattern") - .span_label(span, "irrefutable pattern") - .emit(); - printed_if_let_err = true; - } - } + cx.tcx.lint_node( + lint::builtin::IRREFUTABLE_LET_PATTERNS, + hir_pat.id, + pat.span, + "irrefutable if-let pattern", + ); } hir::MatchSource::WhileLetDesugar => { @@ -394,21 +378,12 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>, }, // The arm with the wildcard pattern. 1 => { - if cx.tcx.features().irrefutable_let_patterns { - cx.tcx.lint_node( - lint::builtin::IRREFUTABLE_LET_PATTERNS, - hir_pat.id, pat.span, - "irrefutable while-let pattern"); - } else { - // find the first arm pattern so we can use its span - let &(ref first_arm_pats, _) = &arms[0]; - let first_pat = &first_arm_pats[0]; - let span = first_pat.0.span; - struct_span_err!(cx.tcx.sess, span, E0165, - "irrefutable while-let pattern") - .span_label(span, "irrefutable pattern") - .emit(); - } + cx.tcx.lint_node( + lint::builtin::IRREFUTABLE_LET_PATTERNS, + hir_pat.id, + pat.span, + "irrefutable while-let pattern", + ); }, _ => bug!(), } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index cddec3eb23a5a..f31871913f0d2 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -414,9 +414,6 @@ declare_features! ( // `#[doc(alias = "...")]` (active, doc_alias, "1.27.0", Some(50146), None), - // Allows irrefutable patterns in `if let` and `while let` statements (RFC 2086). - (active, irrefutable_let_patterns, "1.27.0", Some(44495), None), - // inconsistent bounds in where clauses (active, trivial_bounds, "1.28.0", Some(48214), None), @@ -684,6 +681,8 @@ declare_features! ( (accepted, underscore_imports, "1.33.0", Some(48216), None), // Allows `#[repr(packed(N))]` attribute on structs. (accepted, repr_packed, "1.33.0", Some(33158), None), + // Allows irrefutable patterns in `if let` and `while let` statements (RFC 2086). + (accepted, irrefutable_let_patterns, "1.33.0", Some(44495), None), // Allows calling `const unsafe fn` inside `unsafe` blocks in `const fn` functions. (accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None), // `#[cfg_attr(predicate, multiple, attributes, here)]` diff --git a/src/test/run-pass/binding/allow_irrefutable_let_patterns.rs b/src/test/run-pass/binding/allow_irrefutable_let_patterns.rs deleted file mode 100644 index d9a42a2963998..0000000000000 --- a/src/test/run-pass/binding/allow_irrefutable_let_patterns.rs +++ /dev/null @@ -1,12 +0,0 @@ -// run-pass -#![feature(irrefutable_let_patterns)] - -// must-compile-successfully-irrefutable_let_patterns_with_gate -#[allow(irrefutable_let_patterns)] -fn main() { - if let _ = 5 {} - - while let _ = 5 { - break; - } -} diff --git a/src/test/ui/error-codes/E0162.rs b/src/test/ui/error-codes/E0162.rs deleted file mode 100644 index d3221f8e1769a..0000000000000 --- a/src/test/ui/error-codes/E0162.rs +++ /dev/null @@ -1,8 +0,0 @@ -struct Irrefutable(i32); - -fn main() { - let irr = Irrefutable(0); - if let Irrefutable(x) = irr { //~ ERROR E0162 - println!("{}", x); - } -} diff --git a/src/test/ui/error-codes/E0162.stderr b/src/test/ui/error-codes/E0162.stderr deleted file mode 100644 index ca5c56cd59d31..0000000000000 --- a/src/test/ui/error-codes/E0162.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/E0162.rs:5:12 - | -LL | if let Irrefutable(x) = irr { //~ ERROR E0162 - | ^^^^^^^^^^^^^^ irrefutable pattern - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/error-codes/E0165.rs b/src/test/ui/error-codes/E0165.rs deleted file mode 100644 index 952071c8b9e77..0000000000000 --- a/src/test/ui/error-codes/E0165.rs +++ /dev/null @@ -1,9 +0,0 @@ -struct Irrefutable(i32); - -fn main() { - let irr = Irrefutable(0); - while let Irrefutable(x) = irr { //~ ERROR E0165 - //~| irrefutable pattern - // ... - } -} diff --git a/src/test/ui/error-codes/E0165.stderr b/src/test/ui/error-codes/E0165.stderr deleted file mode 100644 index e0d192ea15290..0000000000000 --- a/src/test/ui/error-codes/E0165.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0165]: irrefutable while-let pattern - --> $DIR/E0165.rs:5:15 - | -LL | while let Irrefutable(x) = irr { //~ ERROR E0165 - | ^^^^^^^^^^^^^^ irrefutable pattern - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0165`. diff --git a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs b/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs deleted file mode 100644 index cae2f1d2793df..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs +++ /dev/null @@ -1,8 +0,0 @@ -// gate-test-irrefutable_let_patterns - - -#[allow(irrefutable_let_patterns)] -fn main() { - if let _ = 5 {} - //~^ ERROR irrefutable if-let pattern [E0162] -} diff --git a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr b/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr deleted file mode 100644 index fa8b74ffecf3a..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/feature-gate-without_gate_irrefutable_pattern.rs:6:12 - | -LL | if let _ = 5 {} - | ^ irrefutable pattern - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/if/if-let.rs b/src/test/ui/if/if-let.rs index 304de457059f3..741685fe9b649 100644 --- a/src/test/ui/if/if-let.rs +++ b/src/test/ui/if/if-let.rs @@ -1,3 +1,5 @@ +// compile-pass + fn macros() { macro_rules! foo{ ($p:pat, $e:expr, $b:block) => {{ @@ -10,20 +12,20 @@ fn macros() { }} } - foo!(a, 1, { //~ ERROR irrefutable if-let + foo!(a, 1, { //~ WARN irrefutable if-let println!("irrefutable pattern"); }); - bar!(a, 1, { //~ ERROR irrefutable if-let + bar!(a, 1, { //~ WARN irrefutable if-let println!("irrefutable pattern"); }); } pub fn main() { - if let a = 1 { //~ ERROR irrefutable if-let + if let a = 1 { //~ WARN irrefutable if-let println!("irrefutable pattern"); } - if let a = 1 { //~ ERROR irrefutable if-let + if let a = 1 { //~ WARN irrefutable if-let println!("irrefutable pattern"); } else if true { println!("else-if in irrefutable if-let"); @@ -33,13 +35,13 @@ pub fn main() { if let 1 = 2 { println!("refutable pattern"); - } else if let a = 1 { //~ ERROR irrefutable if-let + } else if let a = 1 { //~ WARN irrefutable if-let println!("irrefutable pattern"); } if true { println!("if"); - } else if let a = 1 { //~ ERROR irrefutable if-let + } else if let a = 1 { //~ WARN irrefutable if-let println!("irrefutable pattern"); } } diff --git a/src/test/ui/if/if-let.stderr b/src/test/ui/if/if-let.stderr index 3802d7828ae7d..b2a104bfacffc 100644 --- a/src/test/ui/if/if-let.stderr +++ b/src/test/ui/if/if-let.stderr @@ -1,39 +1,62 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:13:10 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:6:13 | -LL | foo!(a, 1, { //~ ERROR irrefutable if-let - | ^ irrefutable pattern - -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:16:10 +LL | if let $p = $e $b + | ^^ +... +LL | / foo!(a, 1, { //~ WARN irrefutable if-let +LL | | println!("irrefutable pattern"); +LL | | }); + | |_______- in this macro invocation | -LL | bar!(a, 1, { //~ ERROR irrefutable if-let - | ^ irrefutable pattern + = note: #[warn(irrefutable_let_patterns)] on by default -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:22:12 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:6:13 | -LL | if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | if let $p = $e $b + | ^^ +... +LL | / bar!(a, 1, { //~ WARN irrefutable if-let +LL | | println!("irrefutable pattern"); +LL | | }); + | |_______- in this macro invocation -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:26:12 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:24:5 | -LL | if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | / if let a = 1 { //~ WARN irrefutable if-let +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:36:19 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:28:5 | -LL | } else if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | / if let a = 1 { //~ WARN irrefutable if-let +LL | | println!("irrefutable pattern"); +LL | | } else if true { +LL | | println!("else-if in irrefutable if-let"); +LL | | } else { +LL | | println!("else in irrefutable if-let"); +LL | | } + | |_____^ -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:42:19 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:38:12 | -LL | } else if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | } else if let a = 1 { //~ WARN irrefutable if-let + | ____________^ +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -error: aborting due to 6 previous errors +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:44:12 + | +LL | } else if let a = 1 { //~ WARN irrefutable if-let + | ____________^ +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/issues/issue-51714.rs b/src/test/ui/issues/issue-51714.rs index b52e3ac6abd84..4885e4a2db7d5 100644 --- a/src/test/ui/issues/issue-51714.rs +++ b/src/test/ui/issues/issue-51714.rs @@ -10,5 +10,5 @@ fn main() { [(); return while let Some(n) = Some(0) {}]; //~^ ERROR return statement outside of function body - //~^^ ERROR irrefutable while-let pattern + //~^^ WARN irrefutable while-let pattern } diff --git a/src/test/ui/issues/issue-51714.stderr b/src/test/ui/issues/issue-51714.stderr index 47a8b415b0cf0..df11f6b7f5a53 100644 --- a/src/test/ui/issues/issue-51714.stderr +++ b/src/test/ui/issues/issue-51714.stderr @@ -22,13 +22,14 @@ error[E0572]: return statement outside of function body LL | [(); return while let Some(n) = Some(0) {}]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0165]: irrefutable while-let pattern - --> $DIR/issue-51714.rs:11:27 +warning: irrefutable while-let pattern + --> $DIR/issue-51714.rs:11:17 | LL | [(); return while let Some(n) = Some(0) {}]; - | ^^^^^^^ irrefutable pattern + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(irrefutable_let_patterns)] on by default -error: aborting due to 5 previous errors +error: aborting due to 4 previous errors -Some errors occurred: E0165, E0572. -For more information about an error, try `rustc --explain E0165`. +For more information about this error, try `rustc --explain E0572`. diff --git a/src/test/ui/pattern/deny-irrefutable-let-patterns.rs b/src/test/ui/pattern/deny-irrefutable-let-patterns.rs new file mode 100644 index 0000000000000..14040c8ada67d --- /dev/null +++ b/src/test/ui/pattern/deny-irrefutable-let-patterns.rs @@ -0,0 +1,9 @@ +#![deny(irrefutable_let_patterns)] + +fn main() { + if let _ = 5 {} //~ ERROR irrefutable if-let pattern + + while let _ = 5 { //~ ERROR irrefutable while-let pattern + break; + } +} diff --git a/src/test/ui/pattern/deny-irrefutable-let-patterns.stderr b/src/test/ui/pattern/deny-irrefutable-let-patterns.stderr new file mode 100644 index 0000000000000..ad8cc2ef8973b --- /dev/null +++ b/src/test/ui/pattern/deny-irrefutable-let-patterns.stderr @@ -0,0 +1,22 @@ +error: irrefutable if-let pattern + --> $DIR/deny-irrefutable-let-patterns.rs:4:5 + | +LL | if let _ = 5 {} //~ ERROR irrefutable if-let pattern + | ^^^^^^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/deny-irrefutable-let-patterns.rs:1:9 + | +LL | #![deny(irrefutable_let_patterns)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: irrefutable while-let pattern + --> $DIR/deny-irrefutable-let-patterns.rs:6:5 + | +LL | / while let _ = 5 { //~ ERROR irrefutable while-let pattern +LL | | break; +LL | | } + | |_____^ + +error: aborting due to 2 previous errors + diff --git a/src/test/run-pass/enum-variant-generic-args.rs b/src/test/ui/pattern/enum-variant-generic-args.rs similarity index 97% rename from src/test/run-pass/enum-variant-generic-args.rs rename to src/test/ui/pattern/enum-variant-generic-args.rs index 0743f99897922..85599530ea6a4 100644 --- a/src/test/run-pass/enum-variant-generic-args.rs +++ b/src/test/ui/pattern/enum-variant-generic-args.rs @@ -1,4 +1,5 @@ -#![feature(irrefutable_let_patterns)] +// run-pass + #![feature(type_alias_enum_variants)] #![allow(irrefutable_let_patterns)] diff --git a/src/test/ui/pattern/irrefutable-let-patterns.rs b/src/test/ui/pattern/irrefutable-let-patterns.rs new file mode 100644 index 0000000000000..d400ef0bbd64c --- /dev/null +++ b/src/test/ui/pattern/irrefutable-let-patterns.rs @@ -0,0 +1,11 @@ +// run-pass + +#![allow(irrefutable_let_patterns)] + +fn main() { + if let _ = 5 {} + + while let _ = 5 { + break; + } +} diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs index 3814fc02745a7..d79798d57e820 100644 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs +++ b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs @@ -2,7 +2,6 @@ // Enabling `ireffutable_let_patterns` isn't necessary for what this tests, but it makes coming up // with examples easier. -#![feature(irrefutable_let_patterns)] #[allow(irrefutable_let_patterns)] fn main() { diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr index 1d518215c2c36..2cd59fe56cf2d 100644 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr +++ b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr @@ -1,5 +1,5 @@ error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:11:47 + --> $DIR/syntax-ambiguity-2015.rs:10:47 | LL | if let Range { start: _, end: _ } = true..true && false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` @@ -8,7 +8,7 @@ LL | if let Range { start: _, end: _ } = true..true && false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2015.rs:14:47 + --> $DIR/syntax-ambiguity-2015.rs:13:47 | LL | if let Range { start: _, end: _ } = true..true || false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` @@ -17,7 +17,7 @@ LL | if let Range { start: _, end: _ } = true..true || false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:17:50 + --> $DIR/syntax-ambiguity-2015.rs:16:50 | LL | while let Range { start: _, end: _ } = true..true && false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` @@ -26,7 +26,7 @@ LL | while let Range { start: _, end: _ } = true..true && false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2015.rs:20:50 + --> $DIR/syntax-ambiguity-2015.rs:19:50 | LL | while let Range { start: _, end: _ } = true..true || false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` @@ -35,7 +35,7 @@ LL | while let Range { start: _, end: _ } = true..true || false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:23:19 + --> $DIR/syntax-ambiguity-2015.rs:22:19 | LL | if let true = false && false { } | ^^^^^^^^^^^^^^ help: consider adding parentheses: `(false && false)` @@ -44,7 +44,7 @@ LL | if let true = false && false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:26:22 + --> $DIR/syntax-ambiguity-2015.rs:25:22 | LL | while let true = (1 == 2) && false { } | ^^^^^^^^^^^^^^^^^ help: consider adding parentheses: `((1 == 2) && false)` diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs index 311953a283e37..687bf659416ab 100644 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs +++ b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs @@ -2,7 +2,6 @@ // Enabling `ireffutable_let_patterns` isn't necessary for what this tests, but it makes coming up // with examples easier. -#![feature(irrefutable_let_patterns)] #[allow(irrefutable_let_patterns)] fn main() { diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr index b3579973ca2bd..cbba2d7473334 100644 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr +++ b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr @@ -1,5 +1,5 @@ error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:11:47 + --> $DIR/syntax-ambiguity-2018.rs:10:47 | LL | if let Range { start: _, end: _ } = true..true && false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` @@ -8,7 +8,7 @@ LL | if let Range { start: _, end: _ } = true..true && false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2018.rs:14:47 + --> $DIR/syntax-ambiguity-2018.rs:13:47 | LL | if let Range { start: _, end: _ } = true..true || false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` @@ -17,7 +17,7 @@ LL | if let Range { start: _, end: _ } = true..true || false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:17:50 + --> $DIR/syntax-ambiguity-2018.rs:16:50 | LL | while let Range { start: _, end: _ } = true..true && false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` @@ -26,7 +26,7 @@ LL | while let Range { start: _, end: _ } = true..true && false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2018.rs:20:50 + --> $DIR/syntax-ambiguity-2018.rs:19:50 | LL | while let Range { start: _, end: _ } = true..true || false { } | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` @@ -35,7 +35,7 @@ LL | while let Range { start: _, end: _ } = true..true || false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:23:19 + --> $DIR/syntax-ambiguity-2018.rs:22:19 | LL | if let true = false && false { } | ^^^^^^^^^^^^^^ help: consider adding parentheses: `(false && false)` @@ -44,7 +44,7 @@ LL | if let true = false && false { } = note: see rust-lang/rust#53668 for more information error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:26:22 + --> $DIR/syntax-ambiguity-2018.rs:25:22 | LL | while let true = (1 == 2) && false { } | ^^^^^^^^^^^^^^^^^ help: consider adding parentheses: `((1 == 2) && false)` diff --git a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs b/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs deleted file mode 100644 index 2899298a0cb1d..0000000000000 --- a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs +++ /dev/null @@ -1,5 +0,0 @@ -// should-fail-irrefutable_let_patterns -fn main() { - if let _ = 5 {} - //~^ ERROR irrefutable if-let pattern [E0162] -} diff --git a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr b/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr deleted file mode 100644 index 9c9ebc6659b73..0000000000000 --- a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/should-fail-no_gate_irrefutable_if_let_pattern.rs:3:12 - | -LL | if let _ = 5 {} - | ^ irrefutable pattern - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs b/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs deleted file mode 100644 index 1b9b3dc1a4cbe..0000000000000 --- a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs +++ /dev/null @@ -1,7 +0,0 @@ -#![feature(irrefutable_let_patterns)] - -// should-fail-irrefutable_let_patterns_with_gate -fn main() { - if let _ = 5 {} - //~^ ERROR irrefutable if-let pattern [irrefutable_let_patterns] -} diff --git a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr b/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr deleted file mode 100644 index dc670f0e59081..0000000000000 --- a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr +++ /dev/null @@ -1,10 +0,0 @@ -error: irrefutable if-let pattern - --> $DIR/should-fail-with_gate_irrefutable_pattern_deny.rs:5:5 - | -LL | if let _ = 5 {} - | ^^^^^^^^^^^^^^^ - | - = note: #[deny(irrefutable_let_patterns)] on by default - -error: aborting due to previous error - diff --git a/src/test/ui/while-let.rs b/src/test/ui/while-let.rs index 348edc15aca4c..69f9de9497740 100644 --- a/src/test/ui/while-let.rs +++ b/src/test/ui/while-let.rs @@ -1,3 +1,5 @@ +// run-pass + fn macros() { macro_rules! foo{ ($p:pat, $e:expr, $b:block) => {{ @@ -10,16 +12,17 @@ fn macros() { }} } - foo!(a, 1, { //~ ERROR irrefutable while-let + foo!(a, 1, { //~ WARN irrefutable while-let println!("irrefutable pattern"); }); - bar!(a, 1, { //~ ERROR irrefutable while-let + bar!(a, 1, { //~ WARN irrefutable while-let println!("irrefutable pattern"); }); } pub fn main() { - while let a = 1 { //~ ERROR irrefutable while-let + while let a = 1 { //~ WARN irrefutable while-let println!("irrefutable pattern"); + break; } } diff --git a/src/test/ui/while-let.stderr b/src/test/ui/while-let.stderr index 838dd8c14d7b5..3f584006bc1fd 100644 --- a/src/test/ui/while-let.stderr +++ b/src/test/ui/while-let.stderr @@ -1,21 +1,32 @@ -error[E0165]: irrefutable while-let pattern - --> $DIR/while-let.rs:13:10 +warning: irrefutable while-let pattern + --> $DIR/while-let.rs:6:13 | -LL | foo!(a, 1, { //~ ERROR irrefutable while-let - | ^ irrefutable pattern - -error[E0165]: irrefutable while-let pattern - --> $DIR/while-let.rs:16:10 +LL | while let $p = $e $b + | ^^^^^ +... +LL | / foo!(a, 1, { //~ WARN irrefutable while-let +LL | | println!("irrefutable pattern"); +LL | | }); + | |_______- in this macro invocation | -LL | bar!(a, 1, { //~ ERROR irrefutable while-let - | ^ irrefutable pattern + = note: #[warn(irrefutable_let_patterns)] on by default -error[E0165]: irrefutable while-let pattern - --> $DIR/while-let.rs:22:15 +warning: irrefutable while-let pattern + --> $DIR/while-let.rs:6:13 | -LL | while let a = 1 { //~ ERROR irrefutable while-let - | ^ irrefutable pattern +LL | while let $p = $e $b + | ^^^^^ +... +LL | / bar!(a, 1, { //~ WARN irrefutable while-let +LL | | println!("irrefutable pattern"); +LL | | }); + | |_______- in this macro invocation -error: aborting due to 3 previous errors +warning: irrefutable while-let pattern + --> $DIR/while-let.rs:24:5 + | +LL | / while let a = 1 { //~ WARN irrefutable while-let +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -For more information about this error, try `rustc --explain E0165`. From 0e1402dcdad5ad0fd5fef161e2dc8c8aed801891 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 12 Jan 2019 08:59:12 +0100 Subject: [PATCH 63/86] bless ui/while-let --- src/test/ui/while-let.stderr | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/ui/while-let.stderr b/src/test/ui/while-let.stderr index 3f584006bc1fd..6d61143d33c84 100644 --- a/src/test/ui/while-let.stderr +++ b/src/test/ui/while-let.stderr @@ -27,6 +27,7 @@ warning: irrefutable while-let pattern | LL | / while let a = 1 { //~ WARN irrefutable while-let LL | | println!("irrefutable pattern"); +LL | | break; LL | | } | |_____^ From 3dc08ed0688a07004693415155bae18c3e077992 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 12 Jan 2019 10:31:52 +0100 Subject: [PATCH 64/86] move const_let accepted gate to avoid future conflict. --- src/libsyntax/feature_gate.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index a7b391f2d1a4c..6c5c7defd4354 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -683,12 +683,12 @@ declare_features! ( (accepted, repr_packed, "1.33.0", Some(33158), None), // Allows calling `const unsafe fn` inside `unsafe` blocks in `const fn` functions. (accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None), - // `#[cfg_attr(predicate, multiple, attributes, here)]` - (accepted, cfg_attr_multi, "1.33.0", Some(54881), None), // Allows let bindings, assignments and destructuring in `const` functions and constants. // As long as control flow is not implemented in const eval, `&&` and `||` may not be used // at the same time as let bindings. (accepted, const_let, "1.33.0", Some(48821), None), + // `#[cfg_attr(predicate, multiple, attributes, here)]` + (accepted, cfg_attr_multi, "1.33.0", Some(54881), None), ); // If you change this, please modify `src/doc/unstable-book` as well. You must From 6c623224dcf6f7cf06afd46b17ce7f665e6b4fda Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 12 Jan 2019 10:32:27 +0100 Subject: [PATCH 65/86] const_let: --bless with --compare-mode=nll --- ...check-static-values-constraints.nll.stderr | 62 ++++++++++++++++--- .../min_const_fn/min_const_fn.nll.stderr | 8 +-- .../ui/consts/promote_const_let.nll.stderr | 21 ++++++- src/test/ui/issues/issue-18118.nll.stderr | 60 +----------------- 4 files changed, 74 insertions(+), 77 deletions(-) diff --git a/src/test/ui/check-static-values-constraints.nll.stderr b/src/test/ui/check-static-values-constraints.nll.stderr index d2f6c7510a91d..f1a2312490813 100644 --- a/src/test/ui/check-static-values-constraints.nll.stderr +++ b/src/test/ui/check-static-values-constraints.nll.stderr @@ -13,44 +13,80 @@ error[E0010]: allocations are not allowed in statics LL | static STATIC11: Box = box MyOwned; | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:79:37 + | +LL | static STATIC11: Box = box MyOwned; + | ^^^^^^^ + error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/check-static-values-constraints.rs:89:32 + --> $DIR/check-static-values-constraints.rs:90:32 | LL | field2: SafeEnum::Variant4("str".to_string()) | ^^^^^^^^^^^^^^^^^ error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:94:5 + --> $DIR/check-static-values-constraints.rs:95:5 | LL | box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:95:9 + | +LL | box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:95:5 + --> $DIR/check-static-values-constraints.rs:97:5 | LL | box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:97:9 + | +LL | box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:99:6 + --> $DIR/check-static-values-constraints.rs:102:6 | LL | &box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:102:10 + | +LL | &box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:100:6 + --> $DIR/check-static-values-constraints.rs:104:6 | LL | &box MyOwned, //~ ERROR allocations are not allowed in statics | ^^^^^^^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:104:10 + | +LL | &box MyOwned, //~ ERROR allocations are not allowed in statics + | ^^^^^^^ + error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:106:5 + --> $DIR/check-static-values-constraints.rs:111:5 | LL | box 3; | ^^^^^ allocation not allowed in statics +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:111:9 + | +LL | box 3; + | ^ + error[E0507]: cannot move out of static item - --> $DIR/check-static-values-constraints.rs:110:45 + --> $DIR/check-static-values-constraints.rs:116:45 | LL | let y = { static x: Box = box 3; x }; | ^ @@ -59,12 +95,18 @@ LL | let y = { static x: Box = box 3; x }; | help: consider borrowing here: `&x` error[E0010]: allocations are not allowed in statics - --> $DIR/check-static-values-constraints.rs:110:38 + --> $DIR/check-static-values-constraints.rs:116:38 | LL | let y = { static x: Box = box 3; x }; | ^^^^^ allocation not allowed in statics -error: aborting due to 10 previous errors +error[E0019]: static contains unimplemented expression type + --> $DIR/check-static-values-constraints.rs:116:42 + | +LL | let y = { static x: Box = box 3; x }; + | ^ + +error: aborting due to 17 previous errors -Some errors occurred: E0010, E0015, E0493, E0507. +Some errors occurred: E0010, E0015, E0019, E0493, E0507. For more information about an error, try `rustc --explain E0010`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr index 551bc57e5ae7d..91b076097b018 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr +++ b/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr @@ -112,12 +112,6 @@ error: `if`, `match`, `&&` and `||` are not stable in const fn LL | const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn | ^^^^^^^^^^^ -error: local variables in const fn are unstable - --> $DIR/min_const_fn.rs:99:34 - | -LL | const fn foo30_6() -> bool { let x = true; x } //~ ERROR local variables in const fn - | ^ - error: `if`, `match`, `&&` and `||` are not stable in const fn --> $DIR/min_const_fn.rs:100:44 | @@ -220,7 +214,7 @@ error: function pointers in const fn are unstable LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo } | ^^^^ -error: aborting due to 35 previous errors +error: aborting due to 34 previous errors Some errors occurred: E0493, E0515. For more information about an error, try `rustc --explain E0493`. diff --git a/src/test/ui/consts/promote_const_let.nll.stderr b/src/test/ui/consts/promote_const_let.nll.stderr index d8749bb5fd90b..e6ee1523a3b28 100644 --- a/src/test/ui/consts/promote_const_let.nll.stderr +++ b/src/test/ui/consts/promote_const_let.nll.stderr @@ -1,5 +1,5 @@ error[E0597]: `y` does not live long enough - --> $DIR/promote_const_let.rs:6:9 + --> $DIR/promote_const_let.rs:4:9 | LL | let x: &'static u32 = { | ------------ type annotation requires that `y` is borrowed for `'static` @@ -9,6 +9,21 @@ LL | &y //~ ERROR does not live long enough LL | }; | - `y` dropped here while still borrowed -error: aborting due to previous error +error[E0716]: temporary value dropped while borrowed + --> $DIR/promote_const_let.rs:6:28 + | +LL | let x: &'static u32 = &{ //~ ERROR does not live long enough + | ____________------------____^ + | | | + | | type annotation requires that borrow lasts for `'static` +LL | | let y = 42; +LL | | y +LL | | }; + | |_____^ creates a temporary which is freed while still in use +LL | } + | - temporary value is freed at the end of this statement + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0597`. +Some errors occurred: E0597, E0716. +For more information about an error, try `rustc --explain E0597`. diff --git a/src/test/ui/issues/issue-18118.nll.stderr b/src/test/ui/issues/issue-18118.nll.stderr index d3084b0616776..1920e1637d149 100644 --- a/src/test/ui/issues/issue-18118.nll.stderr +++ b/src/test/ui/issues/issue-18118.nll.stderr @@ -1,68 +1,14 @@ -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:5:17 - | -LL | let p = 3; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:5:17 - | -LL | let p = 3; - | ^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:8:9 - | -LL | &p //~ ERROR `p` does not live long enough - | ^^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: let bindings in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:2:5 - | -LL | / const z: &'static isize = { -LL | | //~^ ERROR let bindings in constants are unstable -LL | | //~| ERROR statements in constants are unstable -LL | | let p = 3; -... | -LL | | //~^ ERROR let bindings in constants are unstable -LL | | }; - | |______^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - -error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue-18118.rs:2:5 - | -LL | / const z: &'static isize = { -LL | | //~^ ERROR let bindings in constants are unstable -LL | | //~| ERROR statements in constants are unstable -LL | | let p = 3; -... | -LL | | //~^ ERROR let bindings in constants are unstable -LL | | }; - | |______^ - | - = help: add #![feature(const_let)] to the crate attributes to enable - error[E0597]: `p` does not live long enough - --> $DIR/issue-18118.rs:8:9 + --> $DIR/issue-18118.rs:4:9 | LL | &p //~ ERROR `p` does not live long enough | ^^ | | | borrowed value does not live long enough | using this value as a constant requires that `p` is borrowed for `'static` -LL | //~^ ERROR let bindings in constants are unstable LL | }; | - `p` dropped here while still borrowed -error: aborting due to 6 previous errors +error: aborting due to previous error -Some errors occurred: E0597, E0658. -For more information about an error, try `rustc --explain E0597`. +For more information about this error, try `rustc --explain E0597`. From 099b3d86f92166ca5974a103e6998fdbaf6a9872 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 9 Dec 2018 21:49:21 +0300 Subject: [PATCH 66/86] resolve: Assign `pub` and `pub(crate)` visibilities to `macro_rules` items --- src/librustc_resolve/macros.rs | 10 ++++-- .../ui/rust-2018/uniform-paths/macro-rules.rs | 19 +++++------ .../uniform-paths/macro-rules.stderr | 34 +++---------------- 3 files changed, 20 insertions(+), 43 deletions(-) diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index e5e6c7a994b7a..7856661741da7 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -1073,7 +1073,12 @@ impl<'a> Resolver<'a> { let ident = ident.modern(); self.macro_names.insert(ident); let def = Def::Macro(def_id, MacroKind::Bang); - let vis = ty::Visibility::Invisible; // Doesn't matter for legacy bindings + let is_macro_export = attr::contains_name(&item.attrs, "macro_export"); + let vis = if is_macro_export { + ty::Visibility::Public + } else { + ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)) + }; let binding = (def, vis, item.span, expansion).to_name_binding(self.arenas); self.set_binding_parent_module(binding, self.current_module); let legacy_binding = self.arenas.alloc_legacy_binding(LegacyBinding { @@ -1081,9 +1086,8 @@ impl<'a> Resolver<'a> { }); *current_legacy_scope = LegacyScope::Binding(legacy_binding); self.all_macros.insert(ident.name, def); - if attr::contains_name(&item.attrs, "macro_export") { + if is_macro_export { let module = self.graph_root; - let vis = ty::Visibility::Public; self.define(module, ident, MacroNS, (def, vis, item.span, expansion, IsMacroExport)); } else { diff --git a/src/test/ui/rust-2018/uniform-paths/macro-rules.rs b/src/test/ui/rust-2018/uniform-paths/macro-rules.rs index 69f6a8668add3..e3c1b4e8ab33a 100644 --- a/src/test/ui/rust-2018/uniform-paths/macro-rules.rs +++ b/src/test/ui/rust-2018/uniform-paths/macro-rules.rs @@ -1,15 +1,14 @@ // edition:2018 -// For the time being `macro_rules` items are treated as *very* private... - #![feature(decl_macro, uniform_paths)] -#![allow(non_camel_case_types)] mod m1 { + // Non-exported legacy macros are treated as `pub(crate)`. macro_rules! legacy_macro { () => () } - // ... so they can't be imported by themselves, ... - use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported + use legacy_macro as _; // OK + pub(crate) use legacy_macro as _; // OK + pub use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported } mod m2 { @@ -17,7 +16,7 @@ mod m2 { type legacy_macro = u8; - // ... but don't prevent names from other namespaces from being imported, ... + // Legacy macro imports don't prevent names from other namespaces from being imported. use legacy_macro as _; // OK } @@ -27,19 +26,17 @@ mod m3 { fn f() { macro_rules! legacy_macro { () => () } - // ... but still create ambiguities with other names in the same namespace. + // Legacy macro imports create ambiguities with other names in the same namespace. use legacy_macro as _; //~ ERROR `legacy_macro` is ambiguous - //~| ERROR `legacy_macro` is private, and cannot be re-exported } } mod exported { - // Exported macros are treated as private as well, - // some better rules need to be figured out later. + // Exported legacy macros are treated as `pub`. #[macro_export] macro_rules! legacy_macro { () => () } - use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported + pub use legacy_macro as _; // OK } fn main() {} diff --git a/src/test/ui/rust-2018/uniform-paths/macro-rules.stderr b/src/test/ui/rust-2018/uniform-paths/macro-rules.stderr index be7bbd314df31..684f5fceac15f 100644 --- a/src/test/ui/rust-2018/uniform-paths/macro-rules.stderr +++ b/src/test/ui/rust-2018/uniform-paths/macro-rules.stderr @@ -1,39 +1,15 @@ error[E0364]: `legacy_macro` is private, and cannot be re-exported - --> $DIR/macro-rules.rs:12:9 + --> $DIR/macro-rules.rs:11:13 | -LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported - | ^^^^^^^^^^^^^^^^^ - | -note: consider marking `legacy_macro` as `pub` in the imported module - --> $DIR/macro-rules.rs:12:9 - | -LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported - | ^^^^^^^^^^^^^^^^^ - -error[E0364]: `legacy_macro` is private, and cannot be re-exported - --> $DIR/macro-rules.rs:31:13 - | -LL | use legacy_macro as _; //~ ERROR `legacy_macro` is ambiguous +LL | pub use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported | ^^^^^^^^^^^^^^^^^ | note: consider marking `legacy_macro` as `pub` in the imported module - --> $DIR/macro-rules.rs:31:13 + --> $DIR/macro-rules.rs:11:13 | -LL | use legacy_macro as _; //~ ERROR `legacy_macro` is ambiguous +LL | pub use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported | ^^^^^^^^^^^^^^^^^ -error[E0364]: `legacy_macro` is private, and cannot be re-exported - --> $DIR/macro-rules.rs:42:9 - | -LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported - | ^^^^^^^^^^^^^^^^^ - | -note: consider marking `legacy_macro` as `pub` in the imported module - --> $DIR/macro-rules.rs:42:9 - | -LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported - | ^^^^^^^^^^^^^^^^^ - error[E0659]: `legacy_macro` is ambiguous (name vs any other name during import resolution) --> $DIR/macro-rules.rs:31:13 | @@ -52,7 +28,7 @@ LL | macro legacy_macro() {} | ^^^^^^^^^^^^^^^^^^^^^^^ = help: use `self::legacy_macro` to refer to this macro unambiguously -error: aborting due to 4 previous errors +error: aborting due to 2 previous errors Some errors occurred: E0364, E0659. For more information about an error, try `rustc --explain E0364`. From e1d1487fc44104d59f3faa550b91d5e248d2bce1 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 9 Dec 2018 22:58:51 +0300 Subject: [PATCH 67/86] resolve: Prohibit use of uniform paths in macros originating from 2015 edition ...while still keeping ambiguity errors future-proofing for uniform paths. This corner case is not going to be stabilized for 1.32 and needs some more general experiments about retrofitting 2018 import rules to 2015 edition --- src/librustc_resolve/macros.rs | 13 +++++++++---- .../edition-imports-virtual-2015-gated.stderr | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 7856661741da7..b2b794c6925cf 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -828,7 +828,7 @@ impl<'a> Resolver<'a> { // but its `Def` should coincide with a crate passed with `--extern` // (otherwise there would be ambiguity) and we can skip feature error in this case. 'ok: { - if !is_import || self.session.features_untracked().uniform_paths { + if !is_import || (!rust_2015 && self.session.features_untracked().uniform_paths) { break 'ok; } if ns == TypeNS && use_prelude && self.extern_prelude_get(ident, true).is_some() { @@ -844,10 +844,15 @@ impl<'a> Resolver<'a> { } } - let msg = "imports can only refer to extern crate names \ - passed with `--extern` on stable channel"; + let reason = if rust_2015 { + "in macros originating from 2015 edition" + } else { + "on stable channel" + }; + let msg = format!("imports can only refer to extern crate names \ + passed with `--extern` {}", reason); let mut err = feature_err(&self.session.parse_sess, "uniform_paths", - ident.span, GateIssue::Language, msg); + ident.span, GateIssue::Language, &msg); let what = self.binding_description(binding, ident, flags.contains(Flags::MISC_FROM_PRELUDE)); diff --git a/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr b/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr index 7c1837e3f56e3..3cf967dbf70e9 100644 --- a/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr +++ b/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr @@ -1,4 +1,4 @@ -error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130) +error[E0658]: imports can only refer to extern crate names passed with `--extern` in macros originating from 2015 edition (see issue #53130) --> <::edition_imports_2015::gen_gated macros>:1:50 | LL | ( ) => { fn check_gated ( ) { enum E { A } use E :: * ; } } From bf1e70cd1f39c0879b36bead3b07a0fdfcfc4c32 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Wed, 12 Dec 2018 04:11:46 +0300 Subject: [PATCH 68/86] resolve: Prohibit use of imported non-macro attributes --- src/librustc/hir/def.rs | 2 +- src/librustc_resolve/macros.rs | 19 ++++++++++++++++++- .../rust-2018/uniform-paths/prelude-fail-2.rs | 9 +++++++++ .../uniform-paths/prelude-fail-2.stderr | 14 ++++++++++++++ .../ui/rust-2018/uniform-paths/prelude.rs | 4 ---- 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs create mode 100644 src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr diff --git a/src/librustc/hir/def.rs b/src/librustc/hir/def.rs index 20ec620a281fd..2382a2ea50bba 100644 --- a/src/librustc/hir/def.rs +++ b/src/librustc/hir/def.rs @@ -240,7 +240,7 @@ impl CtorKind { } impl NonMacroAttrKind { - fn descr(self) -> &'static str { + pub fn descr(self) -> &'static str { match self { NonMacroAttrKind::Builtin => "built-in attribute", NonMacroAttrKind::Tool => "tool attribute", diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index b2b794c6925cf..037ade13c2087 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -376,6 +376,7 @@ impl<'a> Resolver<'a> { .push((path, path_span, kind, parent_scope.clone(), def.ok())); } + self.prohibit_imported_non_macro_attrs(None, def.ok(), path_span); def } else { let binding = self.early_resolve_ident_in_lexical_scope( @@ -390,7 +391,9 @@ impl<'a> Resolver<'a> { .push((path[0].ident, kind, parent_scope.clone(), binding.ok())); } - binding.map(|binding| binding.def()) + let def = binding.map(|binding| binding.def()); + self.prohibit_imported_non_macro_attrs(binding.ok(), def.ok(), path_span); + def } } @@ -982,6 +985,20 @@ impl<'a> Resolver<'a> { } } + fn prohibit_imported_non_macro_attrs(&self, binding: Option<&'a NameBinding<'a>>, + def: Option, span: Span) { + if let Some(Def::NonMacroAttr(kind)) = def { + if kind != NonMacroAttrKind::Tool && binding.map_or(true, |b| b.is_import()) { + let msg = format!("cannot use a {} through an import", kind.descr()); + let mut err = self.session.struct_span_err(span, &msg); + if let Some(binding) = binding { + err.span_note(binding.span, &format!("the {} imported here", kind.descr())); + } + err.emit(); + } + } + } + fn suggest_macro_name(&mut self, name: &str, kind: MacroKind, err: &mut DiagnosticBuilder<'a>, span: Span) { // First check if this is a locally-defined bang macro. diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs new file mode 100644 index 0000000000000..6488b89f36984 --- /dev/null +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs @@ -0,0 +1,9 @@ +// edition:2018 + +#![feature(uniform_paths)] + +// Built-in attribute +use inline as imported_inline; + +#[imported_inline] //~ ERROR cannot use a built-in attribute through an import +fn main() {} diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr new file mode 100644 index 0000000000000..10dd303aa2831 --- /dev/null +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr @@ -0,0 +1,14 @@ +error: cannot use a built-in attribute through an import + --> $DIR/prelude-fail-2.rs:8:3 + | +LL | #[imported_inline] //~ ERROR cannot use a built-in attribute through an import + | ^^^^^^^^^^^^^^^ + | +note: the built-in attribute imported here + --> $DIR/prelude-fail-2.rs:6:5 + | +LL | use inline as imported_inline; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rust-2018/uniform-paths/prelude.rs b/src/test/ui/rust-2018/uniform-paths/prelude.rs index 5aab5fc3a4018..46ce725fdba93 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude.rs @@ -6,9 +6,6 @@ // Macro imported with `#[macro_use] extern crate` use vec as imported_vec; -// Built-in attribute -use inline as imported_inline; - // Tool module use rustfmt as imported_rustfmt; @@ -20,7 +17,6 @@ use u8 as imported_u8; type A = imported_u8; -#[imported_inline] #[imported_rustfmt::skip] fn main() { imported_vec![0]; From 2f3db49c3d99d0338b4a47b62079da71c26db458 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Thu, 13 Dec 2018 01:43:44 +0300 Subject: [PATCH 69/86] resolve: Prohibit use of imported tool modules --- src/librustc_resolve/lib.rs | 7 ++++ .../rust-2018/uniform-paths/prelude-fail-2.rs | 12 +++++++ .../uniform-paths/prelude-fail-2.stderr | 34 +++++++++++++++++-- .../ui/rust-2018/uniform-paths/prelude.rs | 4 --- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index cf949b62a634e..e656e5329b5a5 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -3874,6 +3874,13 @@ impl<'a> Resolver<'a> { module = Some(ModuleOrUniformRoot::Module(next_module)); record_segment_def(self, def); } else if def == Def::ToolMod && i + 1 != path.len() { + if binding.is_import() { + self.session.struct_span_err( + ident.span, "cannot use a tool module through an import" + ).span_note( + binding.span, "the tool module imported here" + ).emit(); + } let def = Def::NonMacroAttr(NonMacroAttrKind::Tool); return PathResult::NonModule(PathResolution::new(def)); } else if def == Def::Err { diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs index 6488b89f36984..e153e868b3113 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs @@ -4,6 +4,18 @@ // Built-in attribute use inline as imported_inline; +mod builtin { + pub use inline as imported_inline; +} + +// Tool module +use rustfmt as imported_rustfmt; +mod tool_mod { + pub use rustfmt as imported_rustfmt; +} #[imported_inline] //~ ERROR cannot use a built-in attribute through an import +#[builtin::imported_inline] //~ ERROR cannot use a built-in attribute through an import +#[imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import +#[tool_mod::imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import fn main() {} diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr index 10dd303aa2831..4c49cd89bdcb9 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr @@ -1,5 +1,5 @@ error: cannot use a built-in attribute through an import - --> $DIR/prelude-fail-2.rs:8:3 + --> $DIR/prelude-fail-2.rs:17:3 | LL | #[imported_inline] //~ ERROR cannot use a built-in attribute through an import | ^^^^^^^^^^^^^^^ @@ -10,5 +10,35 @@ note: the built-in attribute imported here LL | use inline as imported_inline; | ^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to previous error +error: cannot use a built-in attribute through an import + --> $DIR/prelude-fail-2.rs:18:3 + | +LL | #[builtin::imported_inline] //~ ERROR cannot use a built-in attribute through an import + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: cannot use a tool module through an import + --> $DIR/prelude-fail-2.rs:19:3 + | +LL | #[imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import + | ^^^^^^^^^^^^^^^^ + | +note: the tool module imported here + --> $DIR/prelude-fail-2.rs:12:5 + | +LL | use rustfmt as imported_rustfmt; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: cannot use a tool module through an import + --> $DIR/prelude-fail-2.rs:20:13 + | +LL | #[tool_mod::imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import + | ^^^^^^^^^^^^^^^^ + | +note: the tool module imported here + --> $DIR/prelude-fail-2.rs:14:13 + | +LL | pub use rustfmt as imported_rustfmt; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors diff --git a/src/test/ui/rust-2018/uniform-paths/prelude.rs b/src/test/ui/rust-2018/uniform-paths/prelude.rs index 46ce725fdba93..1a6027f30d786 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude.rs @@ -6,9 +6,6 @@ // Macro imported with `#[macro_use] extern crate` use vec as imported_vec; -// Tool module -use rustfmt as imported_rustfmt; - // Standard library prelude use Vec as ImportedVec; @@ -17,7 +14,6 @@ use u8 as imported_u8; type A = imported_u8; -#[imported_rustfmt::skip] fn main() { imported_vec![0]; ImportedVec::::new(); From 79134c051702f71cb4ef13a283dc3689eec9466d Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Thu, 27 Dec 2018 03:38:43 +0300 Subject: [PATCH 70/86] Stabilize `uniform_paths` --- src/librustc_resolve/macros.rs | 29 ++++------- src/libsyntax/feature_gate.rs | 5 +- .../uniform-paths/auxiliary/issue-53691.rs | 2 - .../run-pass/uniform-paths/basic-nested.rs | 10 ++-- src/test/run-pass/uniform-paths/basic.rs | 6 +-- .../run-pass/uniform-paths/macros-nested.rs | 8 ++- src/test/run-pass/uniform-paths/macros.rs | 8 ++- src/test/run-pass/uniform-paths/same-crate.rs | 3 -- src/test/ui/editions/edition-imports-2015.rs | 2 - .../ui/editions/edition-imports-2015.stderr | 2 +- .../edition-imports-virtual-2015-gated.stderr | 4 +- .../feature-gate-uniform-paths.rs | 19 ------- .../feature-gate-uniform-paths.stderr | 50 ------------------- src/test/ui/imports/issue-56125.rs | 2 - src/test/ui/imports/issue-56125.stderr | 14 +++--- .../not-whitelisted.rs | 2 - .../not-whitelisted.stderr | 4 +- .../ui/rust-2018/future-proofing-locals.rs | 1 - .../rust-2018/future-proofing-locals.stderr | 16 +++--- .../rust-2018/local-path-suggestions-2018.rs | 2 - .../local-path-suggestions-2018.stderr | 4 +- .../block-scoped-shadow-nested.rs | 2 - .../block-scoped-shadow-nested.stderr | 6 +-- .../rust-2018/uniform-paths/fn-local-enum.rs | 2 - .../ui/rust-2018/uniform-paths/issue-54390.rs | 11 ---- .../uniform-paths/issue-54390.stderr | 32 ------------ .../ui/rust-2018/uniform-paths/macro-rules.rs | 3 +- .../rust-2018/uniform-paths/prelude-fail-2.rs | 2 - .../uniform-paths/prelude-fail-2.stderr | 14 +++--- .../rust-2018/uniform-paths/prelude-fail.rs | 2 - .../uniform-paths/prelude-fail.stderr | 4 +- .../ui/rust-2018/uniform-paths/prelude.rs | 2 - 32 files changed, 60 insertions(+), 213 deletions(-) delete mode 100644 src/test/ui/feature-gates/feature-gate-uniform-paths.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-uniform-paths.stderr delete mode 100644 src/test/ui/rust-2018/uniform-paths/issue-54390.rs delete mode 100644 src/test/ui/rust-2018/uniform-paths/issue-54390.stderr diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 037ade13c2087..bb679d340eae7 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -831,32 +831,23 @@ impl<'a> Resolver<'a> { // but its `Def` should coincide with a crate passed with `--extern` // (otherwise there would be ambiguity) and we can skip feature error in this case. 'ok: { - if !is_import || (!rust_2015 && self.session.features_untracked().uniform_paths) { + if !is_import || !rust_2015 { break 'ok; } if ns == TypeNS && use_prelude && self.extern_prelude_get(ident, true).is_some() { break 'ok; } - if rust_2015 { - let root_ident = Ident::new(keywords::PathRoot.name(), orig_ident.span); - let root_module = self.resolve_crate_root(root_ident); - if self.resolve_ident_in_module_ext(ModuleOrUniformRoot::Module(root_module), - orig_ident, ns, None, false, path_span) - .is_ok() { - break 'ok; - } + let root_ident = Ident::new(keywords::PathRoot.name(), orig_ident.span); + let root_module = self.resolve_crate_root(root_ident); + if self.resolve_ident_in_module_ext(ModuleOrUniformRoot::Module(root_module), + orig_ident, ns, None, false, path_span) + .is_ok() { + break 'ok; } - let reason = if rust_2015 { - "in macros originating from 2015 edition" - } else { - "on stable channel" - }; - let msg = format!("imports can only refer to extern crate names \ - passed with `--extern` {}", reason); - let mut err = feature_err(&self.session.parse_sess, "uniform_paths", - ident.span, GateIssue::Language, &msg); - + let msg = "imports can only refer to extern crate names passed with \ + `--extern` in macros originating from 2015 edition"; + let mut err = self.session.struct_span_err(ident.span, msg); let what = self.binding_description(binding, ident, flags.contains(Flags::MISC_FROM_PRELUDE)); let note_msg = format!("this import refers to {what}", what = what); diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 45b3ba604c62f..19b8df80a6ab2 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -440,9 +440,6 @@ declare_features! ( // support for arbitrary delimited token streams in non-macro attributes (active, unrestricted_attribute_tokens, "1.30.0", Some(55208), None), - // Allows `use x::y;` to resolve through `self::x`, not just `::x`. - (active, uniform_paths, "1.30.0", Some(53130), None), - // Allows unsized rvalues at arguments and parameters. (active, unsized_locals, "1.30.0", Some(48055), None), @@ -687,6 +684,8 @@ declare_features! ( (accepted, cfg_attr_multi, "1.33.0", Some(54881), None), // Top level or-patterns (`p | q`) in `if let` and `while let`. (accepted, if_while_or_patterns, "1.33.0", Some(48215), None), + // Allows `use x::y;` to search `x` in the current scope. + (accepted, uniform_paths, "1.32.0", Some(53130), None), ); // If you change this, please modify `src/doc/unstable-book` as well. You must diff --git a/src/test/run-pass/uniform-paths/auxiliary/issue-53691.rs b/src/test/run-pass/uniform-paths/auxiliary/issue-53691.rs index e8e25d877477a..a46533178609b 100644 --- a/src/test/run-pass/uniform-paths/auxiliary/issue-53691.rs +++ b/src/test/run-pass/uniform-paths/auxiliary/issue-53691.rs @@ -1,7 +1,5 @@ // edition:2018 -#![feature(uniform_paths)] - mod m { pub fn f() {} } mod n { pub fn g() {} } diff --git a/src/test/run-pass/uniform-paths/basic-nested.rs b/src/test/run-pass/uniform-paths/basic-nested.rs index 0b95618ded5d3..e4e8b32c70ee9 100644 --- a/src/test/run-pass/uniform-paths/basic-nested.rs +++ b/src/test/run-pass/uniform-paths/basic-nested.rs @@ -1,12 +1,12 @@ -// run-pass -#![allow(unused_imports)] -#![allow(non_camel_case_types)] +// This test is similar to `basic.rs`, but nested in modules. +// run-pass // edition:2018 -#![feature(decl_macro, uniform_paths)] +#![feature(decl_macro)] -// This test is similar to `basic.rs`, but nested in modules. +#![allow(unused_imports)] +#![allow(non_camel_case_types)] mod foo { // Test that ambiguity errors are not emitted between `self::test` and diff --git a/src/test/run-pass/uniform-paths/basic.rs b/src/test/run-pass/uniform-paths/basic.rs index 347e0bc00f118..4e2e2dedef679 100644 --- a/src/test/run-pass/uniform-paths/basic.rs +++ b/src/test/run-pass/uniform-paths/basic.rs @@ -1,10 +1,8 @@ // run-pass -#![allow(unused_imports)] -#![allow(non_camel_case_types)] - // edition:2018 -#![feature(uniform_paths)] +#![allow(unused_imports)] +#![allow(non_camel_case_types)] // Test that ambiguity errors are not emitted between `self::test` and // `::test`, assuming the latter (crate) is not in `extern_prelude`. diff --git a/src/test/run-pass/uniform-paths/macros-nested.rs b/src/test/run-pass/uniform-paths/macros-nested.rs index cf33c4860a1b4..a62a28bb94d12 100644 --- a/src/test/run-pass/uniform-paths/macros-nested.rs +++ b/src/test/run-pass/uniform-paths/macros-nested.rs @@ -1,11 +1,9 @@ -// run-pass -#![allow(non_camel_case_types)] +// This test is similar to `macros.rs`, but nested in modules. +// run-pass // edition:2018 -#![feature(uniform_paths)] - -// This test is similar to `macros.rs`, but nested in modules. +#![allow(non_camel_case_types)] mod foo { // Test that ambiguity errors are not emitted between `self::test` and diff --git a/src/test/run-pass/uniform-paths/macros.rs b/src/test/run-pass/uniform-paths/macros.rs index 332c2266e322b..31b809f0cfdc5 100644 --- a/src/test/run-pass/uniform-paths/macros.rs +++ b/src/test/run-pass/uniform-paths/macros.rs @@ -1,11 +1,9 @@ -// run-pass -#![allow(non_camel_case_types)] +// This test is similar to `basic.rs`, but with macros defining local items. +// run-pass // edition:2018 -#![feature(uniform_paths)] - -// This test is similar to `basic.rs`, but with macros defining local items. +#![allow(non_camel_case_types)] // Test that ambiguity errors are not emitted between `self::test` and // `::test`, assuming the latter (crate) is not in `extern_prelude`. diff --git a/src/test/run-pass/uniform-paths/same-crate.rs b/src/test/run-pass/uniform-paths/same-crate.rs index 18a7d089a9b0c..ce4cc13d9ecd7 100644 --- a/src/test/run-pass/uniform-paths/same-crate.rs +++ b/src/test/run-pass/uniform-paths/same-crate.rs @@ -1,9 +1,6 @@ // run-pass - // edition:2018 -#![feature(uniform_paths)] - pub const A: usize = 0; pub mod foo { diff --git a/src/test/ui/editions/edition-imports-2015.rs b/src/test/ui/editions/edition-imports-2015.rs index b89ca28e279db..5ba45b19dded0 100644 --- a/src/test/ui/editions/edition-imports-2015.rs +++ b/src/test/ui/editions/edition-imports-2015.rs @@ -3,8 +3,6 @@ // aux-build:edition-imports-2018.rs // aux-build:absolute.rs -#![feature(uniform_paths)] - #[macro_use] extern crate edition_imports_2018; diff --git a/src/test/ui/editions/edition-imports-2015.stderr b/src/test/ui/editions/edition-imports-2015.stderr index fb6b2e64ef5b8..816ab21d81426 100644 --- a/src/test/ui/editions/edition-imports-2015.stderr +++ b/src/test/ui/editions/edition-imports-2015.stderr @@ -1,5 +1,5 @@ error: cannot glob-import all possible crates - --> $DIR/edition-imports-2015.rs:25:5 + --> $DIR/edition-imports-2015.rs:23:5 | LL | gen_glob!(); //~ ERROR cannot glob-import all possible crates | ^^^^^^^^^^^^ diff --git a/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr b/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr index 3cf967dbf70e9..7c78fbb26a1b8 100644 --- a/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr +++ b/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr @@ -1,4 +1,4 @@ -error[E0658]: imports can only refer to extern crate names passed with `--extern` in macros originating from 2015 edition (see issue #53130) +error: imports can only refer to extern crate names passed with `--extern` in macros originating from 2015 edition --> <::edition_imports_2015::gen_gated macros>:1:50 | LL | ( ) => { fn check_gated ( ) { enum E { A } use E :: * ; } } @@ -9,7 +9,6 @@ LL | ( ) => { fn check_gated ( ) { enum E { A } use E :: * ; } } LL | gen_gated!(); | ------------- not an extern crate passed with `--extern` | - = help: add #![feature(uniform_paths)] to the crate attributes to enable note: this import refers to the enum defined here --> $DIR/edition-imports-virtual-2015-gated.rs:9:5 | @@ -19,4 +18,3 @@ LL | gen_gated!(); error: aborting due to previous error -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-uniform-paths.rs b/src/test/ui/feature-gates/feature-gate-uniform-paths.rs deleted file mode 100644 index 71f880aae2cec..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-uniform-paths.rs +++ /dev/null @@ -1,19 +0,0 @@ -// edition:2018 - -pub mod foo { - pub use bar::Bar; //~ ERROR imports can only refer to extern crate names - - pub mod bar { - pub struct Bar; - } -} - -use inline; //~ ERROR imports can only refer to extern crate names - -use Vec; //~ ERROR imports can only refer to extern crate names - -use vec; //~ ERROR imports can only refer to extern crate names - -fn main() { - let _ = foo::Bar; -} diff --git a/src/test/ui/feature-gates/feature-gate-uniform-paths.stderr b/src/test/ui/feature-gates/feature-gate-uniform-paths.stderr deleted file mode 100644 index 8b79e597e63fe..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-uniform-paths.stderr +++ /dev/null @@ -1,50 +0,0 @@ -error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130) - --> $DIR/feature-gate-uniform-paths.rs:4:13 - | -LL | pub use bar::Bar; //~ ERROR imports can only refer to extern crate names - | ^^^ -LL | -LL | / pub mod bar { -LL | | pub struct Bar; -LL | | } - | |_____- not an extern crate passed with `--extern` - | - = help: add #![feature(uniform_paths)] to the crate attributes to enable -note: this import refers to the module defined here - --> $DIR/feature-gate-uniform-paths.rs:6:5 - | -LL | / pub mod bar { -LL | | pub struct Bar; -LL | | } - | |_____^ - -error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130) - --> $DIR/feature-gate-uniform-paths.rs:11:5 - | -LL | use inline; //~ ERROR imports can only refer to extern crate names - | ^^^^^^ not an extern crate passed with `--extern` - | - = help: add #![feature(uniform_paths)] to the crate attributes to enable - = note: this import refers to a built-in attribute - -error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130) - --> $DIR/feature-gate-uniform-paths.rs:13:5 - | -LL | use Vec; //~ ERROR imports can only refer to extern crate names - | ^^^ not an extern crate passed with `--extern` - | - = help: add #![feature(uniform_paths)] to the crate attributes to enable - = note: this import refers to a struct from prelude - -error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130) - --> $DIR/feature-gate-uniform-paths.rs:15:5 - | -LL | use vec; //~ ERROR imports can only refer to extern crate names - | ^^^ not an extern crate passed with `--extern` - | - = help: add #![feature(uniform_paths)] to the crate attributes to enable - = note: this import refers to a macro from prelude - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/imports/issue-56125.rs b/src/test/ui/imports/issue-56125.rs index 0327522e4b8d6..ec5747b4bca8c 100644 --- a/src/test/ui/imports/issue-56125.rs +++ b/src/test/ui/imports/issue-56125.rs @@ -2,8 +2,6 @@ // compile-flags:--extern issue_56125 // aux-build:issue-56125.rs -#![feature(uniform_paths)] - mod m1 { use issue_56125::last_segment::*; //~^ ERROR `issue_56125` is ambiguous diff --git a/src/test/ui/imports/issue-56125.stderr b/src/test/ui/imports/issue-56125.stderr index 210f6a4399635..13d4068b5628d 100644 --- a/src/test/ui/imports/issue-56125.stderr +++ b/src/test/ui/imports/issue-56125.stderr @@ -1,11 +1,11 @@ error[E0432]: unresolved import `empty::issue_56125` - --> $DIR/issue-56125.rs:19:9 + --> $DIR/issue-56125.rs:17:9 | LL | use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125` | ^^^^^^^^^^^^^^^^^^ no `issue_56125` in `m3::empty` error[E0659]: `issue_56125` is ambiguous (name vs any other name during import resolution) - --> $DIR/issue-56125.rs:8:9 + --> $DIR/issue-56125.rs:6:9 | LL | use issue_56125::last_segment::*; | ^^^^^^^^^^^ ambiguous name @@ -13,14 +13,14 @@ LL | use issue_56125::last_segment::*; = note: `issue_56125` could refer to an extern crate passed with `--extern` = help: use `::issue_56125` to refer to this extern crate unambiguously note: `issue_56125` could also refer to the module imported here - --> $DIR/issue-56125.rs:8:9 + --> $DIR/issue-56125.rs:6:9 | LL | use issue_56125::last_segment::*; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: use `self::issue_56125` to refer to this module unambiguously error[E0659]: `issue_56125` is ambiguous (name vs any other name during import resolution) - --> $DIR/issue-56125.rs:13:9 + --> $DIR/issue-56125.rs:11:9 | LL | use issue_56125::non_last_segment::non_last_segment::*; | ^^^^^^^^^^^ ambiguous name @@ -28,14 +28,14 @@ LL | use issue_56125::non_last_segment::non_last_segment::*; = note: `issue_56125` could refer to an extern crate passed with `--extern` = help: use `::issue_56125` to refer to this extern crate unambiguously note: `issue_56125` could also refer to the module imported here - --> $DIR/issue-56125.rs:13:9 + --> $DIR/issue-56125.rs:11:9 | LL | use issue_56125::non_last_segment::non_last_segment::*; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: use `self::issue_56125` to refer to this module unambiguously error[E0659]: `issue_56125` is ambiguous (name vs any other name during import resolution) - --> $DIR/issue-56125.rs:20:9 + --> $DIR/issue-56125.rs:18:9 | LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous | ^^^^^^^^^^^ ambiguous name @@ -43,7 +43,7 @@ LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous = note: `issue_56125` could refer to an extern crate passed with `--extern` = help: use `::issue_56125` to refer to this extern crate unambiguously note: `issue_56125` could also refer to the module imported here - --> $DIR/issue-56125.rs:20:9 + --> $DIR/issue-56125.rs:17:9 | LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.rs b/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.rs index 1dd428b7c83f6..dd21de75aaf75 100644 --- a/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.rs +++ b/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.rs @@ -1,7 +1,5 @@ // edition:2018 -#![feature(uniform_paths)] - // Tests that arbitrary crates (other than `core`, `std` and `meta`) // aren't allowed without `--extern`, even if they're in the sysroot. use alloc; //~ ERROR unresolved import `alloc` diff --git a/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.stderr b/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.stderr index e4eaa1dc3d2b3..3bea7816b3061 100644 --- a/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.stderr +++ b/src/test/ui/rfc-2126-extern-absolute-paths/not-whitelisted.stderr @@ -1,11 +1,11 @@ error: cannot import a built-in macro - --> $DIR/not-whitelisted.rs:8:5 + --> $DIR/not-whitelisted.rs:6:5 | LL | use test; //~ ERROR cannot import a built-in macro | ^^^^ error[E0432]: unresolved import `alloc` - --> $DIR/not-whitelisted.rs:7:5 + --> $DIR/not-whitelisted.rs:5:5 | LL | use alloc; //~ ERROR unresolved import `alloc` | ^^^^^ no `alloc` external crate diff --git a/src/test/ui/rust-2018/future-proofing-locals.rs b/src/test/ui/rust-2018/future-proofing-locals.rs index d777b1165f30b..5c377dda7c67c 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.rs +++ b/src/test/ui/rust-2018/future-proofing-locals.rs @@ -1,6 +1,5 @@ // edition:2018 -#![feature(uniform_paths)] #![allow(non_camel_case_types)] mod T { diff --git a/src/test/ui/rust-2018/future-proofing-locals.stderr b/src/test/ui/rust-2018/future-proofing-locals.stderr index 594b22496e74a..68354b332a9c6 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.stderr +++ b/src/test/ui/rust-2018/future-proofing-locals.stderr @@ -1,47 +1,47 @@ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:14:9 + --> $DIR/future-proofing-locals.rs:13:9 | LL | use T as _; //~ ERROR imports cannot refer to type parameters | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:15:9 + --> $DIR/future-proofing-locals.rs:14:9 | LL | use T::U; //~ ERROR imports cannot refer to type parameters | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:16:9 + --> $DIR/future-proofing-locals.rs:15:9 | LL | use T::*; //~ ERROR imports cannot refer to type parameters | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:26:9 + --> $DIR/future-proofing-locals.rs:25:9 | LL | use x as _; //~ ERROR imports cannot refer to local variables | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:32:9 + --> $DIR/future-proofing-locals.rs:31:9 | LL | use x; //~ ERROR imports cannot refer to local variables | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:38:17 + --> $DIR/future-proofing-locals.rs:37:17 | LL | use x; //~ ERROR imports cannot refer to local variables | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:46:10 + --> $DIR/future-proofing-locals.rs:45:10 | LL | use {T as _, x}; //~ ERROR imports cannot refer to type parameters | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:46:18 + --> $DIR/future-proofing-locals.rs:45:18 | LL | use {T as _, x}; //~ ERROR imports cannot refer to type parameters | ^ diff --git a/src/test/ui/rust-2018/local-path-suggestions-2018.rs b/src/test/ui/rust-2018/local-path-suggestions-2018.rs index 824405074abe3..5eafbb2c2fc66 100644 --- a/src/test/ui/rust-2018/local-path-suggestions-2018.rs +++ b/src/test/ui/rust-2018/local-path-suggestions-2018.rs @@ -2,8 +2,6 @@ // compile-flags:--extern baz // edition:2018 -#![feature(uniform_paths)] - mod foo { pub type Bar = u32; } diff --git a/src/test/ui/rust-2018/local-path-suggestions-2018.stderr b/src/test/ui/rust-2018/local-path-suggestions-2018.stderr index 8425ee0752e8b..71c8289264ffe 100644 --- a/src/test/ui/rust-2018/local-path-suggestions-2018.stderr +++ b/src/test/ui/rust-2018/local-path-suggestions-2018.stderr @@ -1,5 +1,5 @@ error[E0432]: unresolved import `foo` - --> $DIR/local-path-suggestions-2018.rs:12:9 + --> $DIR/local-path-suggestions-2018.rs:10:9 | LL | use foo::Bar; //~ ERROR unresolved import `foo` | ^^^ did you mean `crate::foo`? @@ -7,7 +7,7 @@ LL | use foo::Bar; //~ ERROR unresolved import `foo` = note: `use` statements changed in Rust 2018; read more at error[E0432]: unresolved import `foobar` - --> $DIR/local-path-suggestions-2018.rs:21:5 + --> $DIR/local-path-suggestions-2018.rs:19:5 | LL | use foobar::Baz; //~ ERROR unresolved import `foobar` | ^^^^^^ did you mean `baz::foobar`? diff --git a/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.rs b/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.rs index 19be7dc964040..3f5897901a056 100644 --- a/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.rs +++ b/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.rs @@ -1,7 +1,5 @@ // edition:2018 -#![feature(uniform_paths)] - mod my { pub mod sub { pub fn bar() {} diff --git a/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.stderr b/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.stderr index 0088296b1a471..4a01ba5088f62 100644 --- a/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.stderr +++ b/src/test/ui/rust-2018/uniform-paths/block-scoped-shadow-nested.stderr @@ -1,16 +1,16 @@ error[E0659]: `sub` is ambiguous (name vs any other name during import resolution) - --> $DIR/block-scoped-shadow-nested.rs:18:13 + --> $DIR/block-scoped-shadow-nested.rs:16:13 | LL | use sub::bar; //~ ERROR `sub` is ambiguous | ^^^ ambiguous name | note: `sub` could refer to the module imported here - --> $DIR/block-scoped-shadow-nested.rs:16:9 + --> $DIR/block-scoped-shadow-nested.rs:14:9 | LL | use my::sub; | ^^^^^^^ note: `sub` could also refer to the module defined here - --> $DIR/block-scoped-shadow-nested.rs:11:1 + --> $DIR/block-scoped-shadow-nested.rs:9:1 | LL | / mod sub { LL | | pub fn bar() {} diff --git a/src/test/ui/rust-2018/uniform-paths/fn-local-enum.rs b/src/test/ui/rust-2018/uniform-paths/fn-local-enum.rs index a7bc625bbf0a4..0c2da1884b758 100644 --- a/src/test/ui/rust-2018/uniform-paths/fn-local-enum.rs +++ b/src/test/ui/rust-2018/uniform-paths/fn-local-enum.rs @@ -1,8 +1,6 @@ // compile-pass // edition:2018 -#![feature(uniform_paths)] - fn main() { enum E { A, B, C } diff --git a/src/test/ui/rust-2018/uniform-paths/issue-54390.rs b/src/test/ui/rust-2018/uniform-paths/issue-54390.rs deleted file mode 100644 index 536cc25e35ac1..0000000000000 --- a/src/test/ui/rust-2018/uniform-paths/issue-54390.rs +++ /dev/null @@ -1,11 +0,0 @@ -// edition:2018 - -#![deny(unused)] - -use std::fmt; - -// No "unresolved import" + "unused import" combination here. -use fmt::Write; //~ ERROR imports can only refer to extern crate names - //~| ERROR unused import: `fmt::Write` - -fn main() {} diff --git a/src/test/ui/rust-2018/uniform-paths/issue-54390.stderr b/src/test/ui/rust-2018/uniform-paths/issue-54390.stderr deleted file mode 100644 index 8f86698c9c11a..0000000000000 --- a/src/test/ui/rust-2018/uniform-paths/issue-54390.stderr +++ /dev/null @@ -1,32 +0,0 @@ -error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130) - --> $DIR/issue-54390.rs:8:5 - | -LL | use std::fmt; - | -------- not an extern crate passed with `--extern` -... -LL | use fmt::Write; //~ ERROR imports can only refer to extern crate names - | ^^^ - | - = help: add #![feature(uniform_paths)] to the crate attributes to enable -note: this import refers to the module imported here - --> $DIR/issue-54390.rs:5:5 - | -LL | use std::fmt; - | ^^^^^^^^ - -error: unused import: `fmt::Write` - --> $DIR/issue-54390.rs:8:5 - | -LL | use fmt::Write; //~ ERROR imports can only refer to extern crate names - | ^^^^^^^^^^ - | -note: lint level defined here - --> $DIR/issue-54390.rs:3:9 - | -LL | #![deny(unused)] - | ^^^^^^ - = note: #[deny(unused_imports)] implied by #[deny(unused)] - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rust-2018/uniform-paths/macro-rules.rs b/src/test/ui/rust-2018/uniform-paths/macro-rules.rs index e3c1b4e8ab33a..6c3f1892cb369 100644 --- a/src/test/ui/rust-2018/uniform-paths/macro-rules.rs +++ b/src/test/ui/rust-2018/uniform-paths/macro-rules.rs @@ -1,6 +1,6 @@ // edition:2018 -#![feature(decl_macro, uniform_paths)] +#![feature(decl_macro)] mod m1 { // Non-exported legacy macros are treated as `pub(crate)`. @@ -14,6 +14,7 @@ mod m1 { mod m2 { macro_rules! legacy_macro { () => () } + #[allow(non_camel_case_types)] type legacy_macro = u8; // Legacy macro imports don't prevent names from other namespaces from being imported. diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs index e153e868b3113..541fc1be4e82f 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs @@ -1,7 +1,5 @@ // edition:2018 -#![feature(uniform_paths)] - // Built-in attribute use inline as imported_inline; mod builtin { diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr index 4c49cd89bdcb9..40b8fcf7158eb 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr @@ -1,41 +1,41 @@ error: cannot use a built-in attribute through an import - --> $DIR/prelude-fail-2.rs:17:3 + --> $DIR/prelude-fail-2.rs:15:3 | LL | #[imported_inline] //~ ERROR cannot use a built-in attribute through an import | ^^^^^^^^^^^^^^^ | note: the built-in attribute imported here - --> $DIR/prelude-fail-2.rs:6:5 + --> $DIR/prelude-fail-2.rs:4:5 | LL | use inline as imported_inline; | ^^^^^^^^^^^^^^^^^^^^^^^^^ error: cannot use a built-in attribute through an import - --> $DIR/prelude-fail-2.rs:18:3 + --> $DIR/prelude-fail-2.rs:16:3 | LL | #[builtin::imported_inline] //~ ERROR cannot use a built-in attribute through an import | ^^^^^^^^^^^^^^^^^^^^^^^^ error: cannot use a tool module through an import - --> $DIR/prelude-fail-2.rs:19:3 + --> $DIR/prelude-fail-2.rs:17:3 | LL | #[imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import | ^^^^^^^^^^^^^^^^ | note: the tool module imported here - --> $DIR/prelude-fail-2.rs:12:5 + --> $DIR/prelude-fail-2.rs:10:5 | LL | use rustfmt as imported_rustfmt; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: cannot use a tool module through an import - --> $DIR/prelude-fail-2.rs:20:13 + --> $DIR/prelude-fail-2.rs:18:13 | LL | #[tool_mod::imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import | ^^^^^^^^^^^^^^^^ | note: the tool module imported here - --> $DIR/prelude-fail-2.rs:14:13 + --> $DIR/prelude-fail-2.rs:12:13 | LL | pub use rustfmt as imported_rustfmt; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail.rs b/src/test/ui/rust-2018/uniform-paths/prelude-fail.rs index c5bd50f2f567f..d717884c901b3 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail.rs @@ -1,7 +1,5 @@ // edition:2018 -#![feature(uniform_paths)] - // Built-in macro use env as env_imported; //~ ERROR cannot import a built-in macro diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail.stderr b/src/test/ui/rust-2018/uniform-paths/prelude-fail.stderr index 794d986b82ef1..fdfea416b12f1 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail.stderr +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail.stderr @@ -1,11 +1,11 @@ error: cannot import a built-in macro - --> $DIR/prelude-fail.rs:6:5 + --> $DIR/prelude-fail.rs:4:5 | LL | use env as env_imported; //~ ERROR cannot import a built-in macro | ^^^^^^^^^^^^^^^^^^^ error[E0432]: unresolved import `rustfmt` - --> $DIR/prelude-fail.rs:9:5 + --> $DIR/prelude-fail.rs:7:5 | LL | use rustfmt::skip as imported_rustfmt_skip; //~ ERROR unresolved import `rustfmt` | ^^^^^^^ not a module `rustfmt` diff --git a/src/test/ui/rust-2018/uniform-paths/prelude.rs b/src/test/ui/rust-2018/uniform-paths/prelude.rs index 1a6027f30d786..9a326b4c728bd 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude.rs @@ -1,8 +1,6 @@ // compile-pass // edition:2018 -#![feature(uniform_paths)] - // Macro imported with `#[macro_use] extern crate` use vec as imported_vec; From 250935d0c7c23b4d80703f5b660a92d6591d8649 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 30 Dec 2018 20:07:43 +0300 Subject: [PATCH 71/86] Fix a hole in generic parameter import future-proofing Add some tests for buggy derive helpers --- src/librustc_resolve/lib.rs | 26 +++++++++++++++---- src/librustc_resolve/resolve_imports.rs | 5 ++++ src/test/ui/imports/issue-56125.stderr | 2 +- .../ui/proc-macro/derive-helper-shadowing.rs | 24 +++++++++++++++-- .../proc-macro/derive-helper-shadowing.stderr | 13 ++++++++-- .../ui/rust-2018/future-proofing-locals.rs | 2 +- .../rust-2018/future-proofing-locals.stderr | 8 +++++- 7 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index e656e5329b5a5..7c05913467c54 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -67,7 +67,7 @@ use syntax_pos::{Span, DUMMY_SP, MultiSpan}; use errors::{Applicability, DiagnosticBuilder, DiagnosticId}; use std::cell::{Cell, RefCell}; -use std::{cmp, fmt, iter, ptr}; +use std::{cmp, fmt, iter, mem, ptr}; use std::collections::BTreeSet; use std::mem::replace; use rustc_data_structures::ptr_key::PtrKey; @@ -2375,11 +2375,27 @@ impl<'a> Resolver<'a> { ast::UseTreeKind::Simple(..) if segments.len() == 1 => &[TypeNS, ValueNS][..], _ => &[TypeNS], }; + let report_error = |this: &Self, ns| { + let what = if ns == TypeNS { "type parameters" } else { "local variables" }; + this.session.span_err(ident.span, &format!("imports cannot refer to {}", what)); + }; + for &ns in nss { - if let Some(LexicalScopeBinding::Def(..)) = - self.resolve_ident_in_lexical_scope(ident, ns, None, use_tree.prefix.span) { - let what = if ns == TypeNS { "type parameters" } else { "local variables" }; - self.session.span_err(ident.span, &format!("imports cannot refer to {}", what)); + match self.resolve_ident_in_lexical_scope(ident, ns, None, use_tree.prefix.span) { + Some(LexicalScopeBinding::Def(..)) => { + report_error(self, ns); + } + Some(LexicalScopeBinding::Item(binding)) => { + let orig_blacklisted_binding = + mem::replace(&mut self.blacklisted_binding, Some(binding)); + if let Some(LexicalScopeBinding::Def(..)) = + self.resolve_ident_in_lexical_scope(ident, ns, None, + use_tree.prefix.span) { + report_error(self, ns); + } + self.blacklisted_binding = orig_blacklisted_binding; + } + None => {} } } } else if let ast::UseTreeKind::Nested(use_trees) = &use_tree.kind { diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index c84dbd2974624..fd55897522bf7 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -223,6 +223,11 @@ impl<'a> Resolver<'a> { } let check_usable = |this: &mut Self, binding: &'a NameBinding<'a>| { + if let Some(blacklisted_binding) = this.blacklisted_binding { + if ptr::eq(binding, blacklisted_binding) { + return Err((Determined, Weak::No)); + } + } // `extern crate` are always usable for backwards compatibility, see issue #37020, // remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`. let usable = this.is_accessible(binding.vis) || binding.is_extern_crate(); diff --git a/src/test/ui/imports/issue-56125.stderr b/src/test/ui/imports/issue-56125.stderr index 13d4068b5628d..844962b910a69 100644 --- a/src/test/ui/imports/issue-56125.stderr +++ b/src/test/ui/imports/issue-56125.stderr @@ -43,7 +43,7 @@ LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous = note: `issue_56125` could refer to an extern crate passed with `--extern` = help: use `::issue_56125` to refer to this extern crate unambiguously note: `issue_56125` could also refer to the module imported here - --> $DIR/issue-56125.rs:17:9 + --> $DIR/issue-56125.rs:18:9 | LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/proc-macro/derive-helper-shadowing.rs b/src/test/ui/proc-macro/derive-helper-shadowing.rs index aa9eae0ba317a..f6fe9f9fd8b30 100644 --- a/src/test/ui/proc-macro/derive-helper-shadowing.rs +++ b/src/test/ui/proc-macro/derive-helper-shadowing.rs @@ -5,6 +5,26 @@ use derive_helper_shadowing::*; #[my_attr] //~ ERROR `my_attr` is ambiguous #[derive(MyTrait)] -struct S; +struct S { + // FIXME No ambiguity, attributes in non-macro positions are not resolved properly + #[my_attr] + field: [u8; { + // FIXME No ambiguity, derive helpers are not put into scope for non-attributes + use my_attr; -fn main() {} + // FIXME No ambiguity, derive helpers are not put into scope for inner items + #[my_attr] + struct U; + + mod inner { + #[my_attr] //~ ERROR attribute `my_attr` is currently unknown + struct V; + } + + 0 + }] +} + +fn main() { + let s = S { field: [] }; +} diff --git a/src/test/ui/proc-macro/derive-helper-shadowing.stderr b/src/test/ui/proc-macro/derive-helper-shadowing.stderr index cc50fefc46453..8180c84d3f6eb 100644 --- a/src/test/ui/proc-macro/derive-helper-shadowing.stderr +++ b/src/test/ui/proc-macro/derive-helper-shadowing.stderr @@ -1,3 +1,11 @@ +error[E0658]: The attribute `my_attr` is currently unknown to the compiler and may have meaning added to it in the future (see issue #29642) + --> $DIR/derive-helper-shadowing.rs:20:15 + | +LL | #[my_attr] //~ ERROR attribute `my_attr` is currently unknown + | ^^^^^^^ + | + = help: add #![feature(custom_attribute)] to the crate attributes to enable + error[E0659]: `my_attr` is ambiguous (derive helper attribute vs any other name) --> $DIR/derive-helper-shadowing.rs:6:3 | @@ -16,6 +24,7 @@ LL | use derive_helper_shadowing::*; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: use `crate::my_attr` to refer to this attribute macro unambiguously -error: aborting due to previous error +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0659`. +Some errors occurred: E0658, E0659. +For more information about an error, try `rustc --explain E0658`. diff --git a/src/test/ui/rust-2018/future-proofing-locals.rs b/src/test/ui/rust-2018/future-proofing-locals.rs index 5c377dda7c67c..1e53c2d1daca4 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.rs +++ b/src/test/ui/rust-2018/future-proofing-locals.rs @@ -16,7 +16,7 @@ fn type_param() { } fn self_import() { - use T; // FIXME Should be an error, but future-proofing fails due to `T` being "self-shadowed" + use T; //~ ERROR imports cannot refer to type parameters } fn let_binding() { diff --git a/src/test/ui/rust-2018/future-proofing-locals.stderr b/src/test/ui/rust-2018/future-proofing-locals.stderr index 68354b332a9c6..413e199cd646c 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.stderr +++ b/src/test/ui/rust-2018/future-proofing-locals.stderr @@ -16,6 +16,12 @@ error: imports cannot refer to type parameters LL | use T::*; //~ ERROR imports cannot refer to type parameters | ^ +error: imports cannot refer to type parameters + --> $DIR/future-proofing-locals.rs:19:9 + | +LL | use T; //~ ERROR imports cannot refer to type parameters + | ^ + error: imports cannot refer to local variables --> $DIR/future-proofing-locals.rs:25:9 | @@ -46,5 +52,5 @@ error: imports cannot refer to local variables LL | use {T as _, x}; //~ ERROR imports cannot refer to type parameters | ^ -error: aborting due to 8 previous errors +error: aborting due to 9 previous errors From e9faf401691aacd26b2792273ca41c9052fc9a93 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Sat, 12 Jan 2019 17:04:33 -0800 Subject: [PATCH 72/86] Replacing the slice of upvar type parameters with tuple for closure substitutions. Related to sub issue #57482, main issue #53488. --- Cargo.lock | 1 + src/librustc/Cargo.toml | 1 + src/librustc/lib.rs | 1 + src/librustc/traits/query/dropck_outlives.rs | 7 +- src/librustc/traits/select.rs | 6 +- src/librustc/ty/outlives.rs | 4 +- src/librustc/ty/sty.rs | 88 ++++++++++++-------- src/librustc/ty/util.rs | 3 +- src/librustc/ty/wf.rs | 4 +- src/librustc/util/ppaux.rs | 2 + src/librustc_traits/dropck_outlives.rs | 11 ++- 11 files changed, 78 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1fde5ac8cb15a..dbac1258dcfc9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2067,6 +2067,7 @@ dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "chalk-engine 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fmt_macros 0.0.0", "graphviz 0.0.0", diff --git a/src/librustc/Cargo.toml b/src/librustc/Cargo.toml index 504e016e5b803..ec3df1ac62b3b 100644 --- a/src/librustc/Cargo.toml +++ b/src/librustc/Cargo.toml @@ -11,6 +11,7 @@ crate-type = ["dylib"] [dependencies] arena = { path = "../libarena" } bitflags = "1.0" +either = "1.5.0" fmt_macros = { path = "../libfmt_macros" } graphviz = { path = "../libgraphviz" } jobserver = "0.1" diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index b2a924ac19895..3f3cf501c9754 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -69,6 +69,7 @@ extern crate arena; #[macro_use] extern crate bitflags; extern crate core; +extern crate either; extern crate fmt_macros; extern crate getopts; extern crate graphviz; diff --git a/src/librustc/traits/query/dropck_outlives.rs b/src/librustc/traits/query/dropck_outlives.rs index 1fd2172212d3c..7c7a98c60654d 100644 --- a/src/librustc/traits/query/dropck_outlives.rs +++ b/src/librustc/traits/query/dropck_outlives.rs @@ -218,10 +218,9 @@ pub fn trivial_dropck_outlives<'tcx>(tcx: TyCtxt<'_, '_, 'tcx>, ty: Ty<'tcx>) -> // (T1..Tn) and closures have same properties as T1..Tn -- // check if *any* of those are trivial. ty::Tuple(ref tys) => tys.iter().all(|t| trivial_dropck_outlives(tcx, t)), - ty::Closure(def_id, ref substs) => substs - .upvar_tys(def_id, tcx) - .all(|t| trivial_dropck_outlives(tcx, t)), - + ty::Closure(def_id, ref substs) => { + trivial_dropck_outlives(tcx, substs.upvar_tuple_ty_or_infer_var(def_id, tcx)) + } ty::Adt(def, _) => { if Some(def.did) == tcx.lang_items().manually_drop() { // `ManuallyDrop` never has a dtor. diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 6db6fe31fba70..e227cef765735 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -2437,7 +2437,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { let is_clone_trait = Some(trait_id) == self.tcx().lang_items().clone_trait(); if is_copy_trait || is_clone_trait { Where(ty::Binder::bind( - substs.upvar_tys(def_id, self.tcx()).collect(), + vec![substs.upvar_tuple_ty_or_infer_var(def_id, self.tcx())] )) } else { None @@ -2524,7 +2524,9 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { tys.to_vec() } - ty::Closure(def_id, ref substs) => substs.upvar_tys(def_id, self.tcx()).collect(), + ty::Closure(def_id, ref substs) => { + vec![substs.upvar_tuple_ty_or_infer_var(def_id, self.tcx())] + }, ty::Generator(def_id, ref substs, _) => { let witness = substs.witness(def_id, self.tcx()); diff --git a/src/librustc/ty/outlives.rs b/src/librustc/ty/outlives.rs index ca2d5cd718c64..3a0b343d76df5 100644 --- a/src/librustc/ty/outlives.rs +++ b/src/librustc/ty/outlives.rs @@ -62,9 +62,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { // projection). match ty.sty { ty::Closure(def_id, ref substs) => { - for upvar_ty in substs.upvar_tys(def_id, *self) { - self.compute_components(upvar_ty, out); - } + self.compute_components(substs.upvar_tuple_ty_or_infer_var(def_id, *self), out) } ty::Generator(def_id, ref substs, _) => { diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index b98369b62ea37..c52501242a69f 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -1,5 +1,6 @@ //! This module contains `TyKind` and its major components. +use either::Either; use hir; use hir::def_id::DefId; use infer::canonical::Canonical; @@ -314,43 +315,71 @@ pub struct ClosureSubsts<'tcx> { /// Struct returned by `split()`. Note that these are subslices of the /// parent slice and not canonical substs themselves. struct SplitClosureSubsts<'tcx> { + // Tells you whether the closure implements Fn or FnMut or FnOnce also known + // as the kind of the closure in the rustc lingo. closure_kind_ty: Ty<'tcx>, + + // Gives the type of the closure signature as a function. So the inputs and + // the outputs to the closure. closure_sig_ty: Ty<'tcx>, - upvar_kinds: &'tcx [Kind<'tcx>], + + // This represents all the upvars to the closure packed in a tuple. Its type + // is tuple with the arity of the number of upvars referred by the closure. + upvar_tuple_ty: Ty<'tcx>, } impl<'tcx> ClosureSubsts<'tcx> { /// Divides the closure substs into their respective /// components. Single source of truth with respect to the /// ordering. - fn split(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> SplitClosureSubsts<'tcx> { + fn split(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> SplitClosureSubsts<'tcx> { let generics = tcx.generics_of(def_id); let parent_len = generics.parent_count; + + // create a tuple of the type parameters representing the types of the + // upvars. In the light of the opening comments above,taking the + // U0 .. Uk and creating one (U0, .., Uk) + let upvar_subts = &self.substs[parent_len + 2..]; + let upvar_tys_iter = upvar_subts.iter().map(|t| { + if let UnpackedKind::Type(ty) = t.unpack() { + ty + } else { + bug!("Expected upvar type here.") + } + }); SplitClosureSubsts { closure_kind_ty: self.substs.type_at(parent_len), closure_sig_ty: self.substs.type_at(parent_len + 1), - upvar_kinds: &self.substs[parent_len + 2..], + upvar_tuple_ty: tcx.mk_tup(upvar_tys_iter), } } + /// This returns an iterator to the type parameters of the upvars that are + /// used by the closure. If the type of the upvar_tuple_ty is not yet known + /// then it means it is being called too early during inference stage and + /// hence a panic will occur. #[inline] - pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> + pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { - let SplitClosureSubsts { upvar_kinds, .. } = self.split(def_id, tcx); - upvar_kinds.iter().map(|t| { - if let UnpackedKind::Type(ty) = t.unpack() { - ty - } else { - bug!("upvar should be type") - } - }) + match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + ty::Tuple(tys) => tys.iter().cloned(), + ref t => bug!("upvar_tuple_ty is not a valid tuple: {:?}", t), + } + } + + /// Returns the tuple of the upvar type parameters. If invoked during type + /// inference, may return an unresolved inference variable, in which case + /// the type of parameters representing types of the upvars is not known + /// yet. + pub fn upvar_tuple_ty_or_infer_var(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { + self.split(def_id, tcx).upvar_tuple_ty } /// Returns the closure kind for this closure; may return a type /// variable during inference. To get the closure kind during /// inference, use `infcx.closure_kind(def_id, substs)`. - pub fn closure_kind_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> Ty<'tcx> { + pub fn closure_kind_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).closure_kind_ty } @@ -358,7 +387,7 @@ impl<'tcx> ClosureSubsts<'tcx> { /// closure; may contain type variables during inference. To get /// the closure signature during inference, use /// `infcx.fn_sig(def_id)`. - pub fn closure_sig_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> Ty<'tcx> { + pub fn closure_sig_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).closure_sig_ty } @@ -397,7 +426,7 @@ struct SplitGeneratorSubsts<'tcx> { } impl<'tcx> GeneratorSubsts<'tcx> { - fn split(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> SplitGeneratorSubsts<'tcx> { + fn split(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> SplitGeneratorSubsts<'tcx> { let generics = tcx.generics_of(def_id); let parent_len = generics.parent_count; SplitGeneratorSubsts { @@ -413,12 +442,12 @@ impl<'tcx> GeneratorSubsts<'tcx> { /// It contains a tuple of all the types that could end up on a generator frame. /// The state transformation MIR pass may only produce layouts which mention types /// in this tuple. Upvars are not counted here. - pub fn witness(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> Ty<'tcx> { + pub fn witness(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).witness } #[inline] - pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> + pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { let SplitGeneratorSubsts { upvar_kinds, .. } = self.split(def_id, tcx); @@ -432,12 +461,12 @@ impl<'tcx> GeneratorSubsts<'tcx> { } /// Returns the type representing the yield type of the generator. - pub fn yield_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> Ty<'tcx> { + pub fn yield_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).yield_ty } /// Returns the type representing the return type of the generator. - pub fn return_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> Ty<'tcx> { + pub fn return_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).return_ty } @@ -447,13 +476,13 @@ impl<'tcx> GeneratorSubsts<'tcx> { /// NB. Some bits of the code prefers to see this wrapped in a /// binder, but it never contains bound regions. Probably this /// function should be removed. - pub fn poly_sig(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> PolyGenSig<'tcx> { + pub fn poly_sig(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> PolyGenSig<'tcx> { ty::Binder::dummy(self.sig(def_id, tcx)) } /// Return the "generator signature", which consists of its yield /// and return types. - pub fn sig(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> GenSig<'tcx> { + pub fn sig(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> GenSig<'tcx> { ty::GenSig { yield_ty: self.yield_ty(def_id, tcx), return_ty: self.return_ty(def_id, tcx), @@ -500,20 +529,13 @@ pub enum UpvarSubsts<'tcx> { impl<'tcx> UpvarSubsts<'tcx> { #[inline] - pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> + pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { - let upvar_kinds = match self { - UpvarSubsts::Closure(substs) => substs.split(def_id, tcx).upvar_kinds, - UpvarSubsts::Generator(substs) => substs.split(def_id, tcx).upvar_kinds, - }; - upvar_kinds.iter().map(|t| { - if let UnpackedKind::Type(ty) = t.unpack() { - ty - } else { - bug!("upvar should be type") - } - }) + match self { + UpvarSubsts::Closure(subts) => Either::Left(subts.upvar_tys(def_id, tcx)), + UpvarSubsts::Generator(substs) => Either::Right(substs.upvar_tys(def_id, tcx)), + } } } diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index e989ef823e979..d87ea73f40870 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -1045,7 +1045,8 @@ fn needs_drop_raw<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, // Structural recursion. ty::Array(ty, _) | ty::Slice(ty) => needs_drop(ty), - ty::Closure(def_id, ref substs) => substs.upvar_tys(def_id, tcx).any(needs_drop), + ty::Closure(def_id, ref substs) => + needs_drop(substs.upvar_tuple_ty_or_infer_var(def_id, tcx)), // Pessimistically assume that all generators will require destructors // as we don't know if a destructor is a noop or not until after the MIR diff --git a/src/librustc/ty/wf.rs b/src/librustc/ty/wf.rs index ef68394029680..95b5e4b6782ed 100644 --- a/src/librustc/ty/wf.rs +++ b/src/librustc/ty/wf.rs @@ -346,9 +346,7 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> { // anyway, except via auto trait matching (which // only inspects the upvar types). subtys.skip_current_subtree(); // subtree handled by compute_projection - for upvar_ty in substs.upvar_tys(def_id, self.infcx.tcx) { - self.compute(upvar_ty); - } + self.compute(substs.upvar_tuple_ty_or_infer_var(def_id, self.infcx.tcx)); } ty::FnPtr(_) => { diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 04e571863d42f..230cafbe2df6e 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -1354,6 +1354,7 @@ define_print! { } Str => write!(f, "str"), Generator(did, substs, movability) => ty::tls::with(|tcx| { + let substs = tcx.lift(&substs).unwrap(); let upvar_tys = substs.upvar_tys(did, tcx); let witness = substs.witness(did, tcx); if movability == hir::GeneratorMovability::Movable { @@ -1395,6 +1396,7 @@ define_print! { ty::tls::with(|tcx| cx.in_binder(f, tcx, &types, tcx.lift(&types))) } Closure(did, substs) => ty::tls::with(|tcx| { + let substs = tcx.lift(&substs).unwrap(); let upvar_tys = substs.upvar_tys(did, tcx); write!(f, "[closure")?; diff --git a/src/librustc_traits/dropck_outlives.rs b/src/librustc_traits/dropck_outlives.rs index 7979fe4a75073..8696fc82abc69 100644 --- a/src/librustc_traits/dropck_outlives.rs +++ b/src/librustc_traits/dropck_outlives.rs @@ -194,10 +194,13 @@ fn dtorck_constraint_for_ty<'a, 'gcx, 'tcx>( .map(|ty| dtorck_constraint_for_ty(tcx, span, for_ty, depth + 1, ty)) .collect(), - ty::Closure(def_id, substs) => substs - .upvar_tys(def_id, tcx) - .map(|ty| dtorck_constraint_for_ty(tcx, span, for_ty, depth + 1, ty)) - .collect(), + ty::Closure(def_id, substs) => + dtorck_constraint_for_ty( + tcx, + span, + for_ty, + depth+1, + substs.upvar_tuple_ty_or_infer_var(def_id, tcx)), ty::Generator(def_id, substs, _movability) => { // rust-lang/rust#49918: types can be constructed, stored From 7fa36f4f63518e466e3823cf1ba5a35306b995f2 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Sat, 12 Jan 2019 19:23:32 -0800 Subject: [PATCH 73/86] Replacing the slice of upvar type parameters with tuple for Generator substitutions. Related to sub issue #57482, main issue #53488. --- src/librustc/traits/select.rs | 6 +----- src/librustc/ty/outlives.rs | 5 +---- src/librustc/ty/sty.rs | 33 ++++++++++++++++++++++----------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index e227cef765735..9a84c475f1e56 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -2529,11 +2529,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { }, ty::Generator(def_id, ref substs, _) => { - let witness = substs.witness(def_id, self.tcx()); - substs - .upvar_tys(def_id, self.tcx()) - .chain(iter::once(witness)) - .collect() + vec![substs.upvar_tuple_ty_or_infer_var(def_id, self.tcx())] } ty::GeneratorWitness(types) => { diff --git a/src/librustc/ty/outlives.rs b/src/librustc/ty/outlives.rs index 3a0b343d76df5..b50cb2b3287aa 100644 --- a/src/librustc/ty/outlives.rs +++ b/src/librustc/ty/outlives.rs @@ -66,10 +66,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { } ty::Generator(def_id, ref substs, _) => { - // Same as the closure case - for upvar_ty in substs.upvar_tys(def_id, *self) { - self.compute_components(upvar_ty, out); - } + self.compute_components(substs.upvar_tuple_ty_or_infer_var(def_id, *self), out) // We ignore regions in the generator interior as we don't // want these to affect region inference diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index c52501242a69f..d1bd52d407fd3 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -8,7 +8,7 @@ use mir::interpret::ConstValue; use middle::region; use polonius_engine::Atom; use rustc_data_structures::indexed_vec::Idx; -use ty::subst::{Substs, Subst, Kind, UnpackedKind}; +use ty::subst::{Substs, Subst, UnpackedKind}; use ty::{self, AdtDef, TypeFlags, Ty, TyCtxt, TypeFoldable}; use ty::{List, TyS, ParamEnvAnd, ParamEnv}; use util::captures::Captures; @@ -422,18 +422,26 @@ struct SplitGeneratorSubsts<'tcx> { yield_ty: Ty<'tcx>, return_ty: Ty<'tcx>, witness: Ty<'tcx>, - upvar_kinds: &'tcx [Kind<'tcx>], + upvar_tuple_ty: Ty<'tcx>, } impl<'tcx> GeneratorSubsts<'tcx> { fn split(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> SplitGeneratorSubsts<'tcx> { let generics = tcx.generics_of(def_id); let parent_len = generics.parent_count; + let upvar_substs = &self.substs[parent_len + 3..]; + let upvar_tys = upvar_substs.iter().map(|t| { + if let UnpackedKind::Type(ty) = t.unpack() { + ty + } else { + bug!("Upvar type expecetd.") + } + }); SplitGeneratorSubsts { yield_ty: self.substs.type_at(parent_len), return_ty: self.substs.type_at(parent_len + 1), witness: self.substs.type_at(parent_len + 2), - upvar_kinds: &self.substs[parent_len + 3..], + upvar_tuple_ty: tcx.mk_tup(upvar_tys), } } @@ -446,18 +454,21 @@ impl<'tcx> GeneratorSubsts<'tcx> { self.split(def_id, tcx).witness } + /// It gives you a tuple containing the type parameters of all the upvars + /// captured by the closure. This should not be called at the time of the + /// type inference as the arity of the tuple will not be known at the time. #[inline] pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { - let SplitGeneratorSubsts { upvar_kinds, .. } = self.split(def_id, tcx); - upvar_kinds.iter().map(|t| { - if let UnpackedKind::Type(ty) = t.unpack() { - ty - } else { - bug!("upvar should be type") - } - }) + match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + ty::Tuple(tys) => tys.iter().cloned(), + ref t => bug!("Upvar_tuple_ty is not a tuple {:?}", t), + } + } + + pub fn upvar_tuple_ty_or_infer_var(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { + self.split(def_id, tcx).upvar_tuple_ty } /// Returns the type representing the yield type of the generator. From 8b32d9215324e66c0cbf39e0da17c5038ca04749 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Sun, 13 Jan 2019 09:27:34 -0800 Subject: [PATCH 74/86] Make the ppaux code to print error and move on if the upvar types are not inferred It was safe for the ppaux code to call the upvar_tys but not anymore after the change wraping the upvar types in a tuple as this can panic if called from parts when the types are yet to be bound. This patch therefore creates a helper, that returns an Option and ppaux can call the new helper instead. Main issue #53488, sub-issue #57482 --- src/librustc/ty/sty.rs | 26 ++++++++ src/librustc/util/ppaux.rs | 126 ++++++++++++++++++++----------------- 2 files changed, 96 insertions(+), 56 deletions(-) diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index d1bd52d407fd3..e51ec9c5e1359 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -376,6 +376,19 @@ impl<'tcx> ClosureSubsts<'tcx> { self.split(def_id, tcx).upvar_tuple_ty } + /// This is safe to be called even when the upvar type parameters are not + /// bound and is exactly called for that same reason. + pub fn opt_tuple_tys( + self, + def_id: DefId, + tcx: TyCtxt<'_, '_, 'tcx>, + ) -> Option> + 'tcx> { + match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + ty::Tuple(tys) => Some(tys.iter().cloned()), + ref _t => None, + } + } + /// Returns the closure kind for this closure; may return a type /// variable during inference. To get the closure kind during /// inference, use `infcx.closure_kind(def_id, substs)`. @@ -467,6 +480,19 @@ impl<'tcx> GeneratorSubsts<'tcx> { } } + /// This is safe to be called even when the upvar type parameters are not + /// bound and is exactly called for that same reason. + pub fn opt_tuple_tys( + self, + def_id: DefId, + tcx: TyCtxt<'_, '_, 'tcx>, + ) -> Option> + 'tcx> { + match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + ty::Tuple(tys) => Some(tys.iter().cloned()), + ref _t => None, + } + } + pub fn upvar_tuple_ty_or_infer_var(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).upvar_tuple_ty } diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 230cafbe2df6e..9c128c7d706e9 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -1355,83 +1355,97 @@ define_print! { Str => write!(f, "str"), Generator(did, substs, movability) => ty::tls::with(|tcx| { let substs = tcx.lift(&substs).unwrap(); - let upvar_tys = substs.upvar_tys(did, tcx); - let witness = substs.witness(did, tcx); - if movability == hir::GeneratorMovability::Movable { - write!(f, "[generator")?; - } else { - write!(f, "[static generator")?; - } + if let Some(upvar_tys) = substs.opt_tuple_tys(did, tcx) { + let witness = substs.witness(did, tcx); + if movability == hir::GeneratorMovability::Movable { + write!(f, "[generator")?; + } else { + write!(f, "[static generator")?; + } - if let Some(node_id) = tcx.hir().as_local_node_id(did) { - write!(f, "@{:?}", tcx.hir().span(node_id))?; - let mut sep = " "; - tcx.with_freevars(node_id, |freevars| { - for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { + if let Some(node_id) = tcx.hir().as_local_node_id(did) { + write!(f, "@{:?}", tcx.hir().span(node_id))?; + let mut sep = " "; + tcx.with_freevars(node_id, |freevars| { + for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { + print!(f, cx, + write("{}{}:", + sep, + tcx.hir().name(freevar.var_id())), + print(upvar_ty))?; + sep = ", "; + } + Ok(()) + })? + } else { + // cross-crate closure types should only be + // visible in codegen bug reports, I imagine. + write!(f, "@{:?}", did)?; + let mut sep = " "; + for (index, upvar_ty) in upvar_tys.enumerate() { print!(f, cx, - write("{}{}:", - sep, - tcx.hir().name(freevar.var_id())), + write("{}{}:", sep, index), print(upvar_ty))?; sep = ", "; } - Ok(()) - })? - } else { - // cross-crate closure types should only be - // visible in codegen bug reports, I imagine. - write!(f, "@{:?}", did)?; - let mut sep = " "; - for (index, upvar_ty) in upvar_tys.enumerate() { - print!(f, cx, - write("{}{}:", sep, index), - print(upvar_ty))?; - sep = ", "; } - } - print!(f, cx, write(" "), print(witness), write("]")) + print!(f, cx, write(" "), print(witness), write("]")) + } else { + // If we are here that mens that the type of upvars + // captured by this generator is not known and hence + // during pretty printing this sort of error will be + // shown. + write!(f, "Upvar type not bound yet.") + } }), GeneratorWitness(types) => { ty::tls::with(|tcx| cx.in_binder(f, tcx, &types, tcx.lift(&types))) } Closure(did, substs) => ty::tls::with(|tcx| { let substs = tcx.lift(&substs).unwrap(); - let upvar_tys = substs.upvar_tys(did, tcx); - write!(f, "[closure")?; + if let Some(upvar_tys) = substs.opt_tuple_tys(did, tcx) { + write!(f, "[closure")?; - if let Some(node_id) = tcx.hir().as_local_node_id(did) { - if tcx.sess.opts.debugging_opts.span_free_formats { - write!(f, "@{:?}", node_id)?; + if let Some(node_id) = tcx.hir().as_local_node_id(did) { + if tcx.sess.opts.debugging_opts.span_free_formats { + write!(f, "@{:?}", node_id)?; + } else { + write!(f, "@{:?}", tcx.hir().span(node_id))?; + } + let mut sep = " "; + tcx.with_freevars(node_id, |freevars| { + for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { + print!(f, cx, + write("{}{}:", + sep, + tcx.hir().name(freevar.var_id())), + print(upvar_ty))?; + sep = ", "; + } + Ok(()) + })? } else { - write!(f, "@{:?}", tcx.hir().span(node_id))?; - } - let mut sep = " "; - tcx.with_freevars(node_id, |freevars| { - for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { + // cross-crate closure types should only be + // visible in codegen bug reports, I imagine. + write!(f, "@{:?}", did)?; + let mut sep = " "; + for (index, upvar_ty) in upvar_tys.enumerate() { print!(f, cx, - write("{}{}:", - sep, - tcx.hir().name(freevar.var_id())), + write("{}{}:", sep, index), print(upvar_ty))?; sep = ", "; } - Ok(()) - })? - } else { - // cross-crate closure types should only be - // visible in codegen bug reports, I imagine. - write!(f, "@{:?}", did)?; - let mut sep = " "; - for (index, upvar_ty) in upvar_tys.enumerate() { - print!(f, cx, - write("{}{}:", sep, index), - print(upvar_ty))?; - sep = ", "; } - } - write!(f, "]") + write!(f, "]") + } else { + // If we are here that mens that the type of upvars + // captured by this generator is not known and hence + // during pretty printing this sort of error will be + // shown. + write!(f, "Upvar type not bound yet.") + } }), Array(ty, sz) => { print!(f, cx, write("["), print(ty), write("; "))?; From 61a1d2c75dc918e5cd19781c07a29a7bcc736180 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Wed, 16 Jan 2019 09:38:16 -0800 Subject: [PATCH 75/86] Addressing Niko's comments. Related to #57482 --- src/librustc/traits/query/dropck_outlives.rs | 2 +- src/librustc/traits/select.rs | 6 ++-- src/librustc/ty/outlives.rs | 4 +-- src/librustc/ty/sty.rs | 30 +++++++++++--------- src/librustc/ty/util.rs | 2 +- src/librustc/ty/wf.rs | 2 +- src/librustc/util/ppaux.rs | 14 ++++++--- src/librustc_traits/dropck_outlives.rs | 2 +- 8 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/librustc/traits/query/dropck_outlives.rs b/src/librustc/traits/query/dropck_outlives.rs index 7c7a98c60654d..ef23fb82dcccb 100644 --- a/src/librustc/traits/query/dropck_outlives.rs +++ b/src/librustc/traits/query/dropck_outlives.rs @@ -219,7 +219,7 @@ pub fn trivial_dropck_outlives<'tcx>(tcx: TyCtxt<'_, '_, 'tcx>, ty: Ty<'tcx>) -> // check if *any* of those are trivial. ty::Tuple(ref tys) => tys.iter().all(|t| trivial_dropck_outlives(tcx, t)), ty::Closure(def_id, ref substs) => { - trivial_dropck_outlives(tcx, substs.upvar_tuple_ty_or_infer_var(def_id, tcx)) + trivial_dropck_outlives(tcx, substs.upvar_tuple_ty(def_id, tcx)) } ty::Adt(def, _) => { if Some(def.did) == tcx.lang_items().manually_drop() { diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 9a84c475f1e56..99f0ae70081bb 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -2437,7 +2437,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { let is_clone_trait = Some(trait_id) == self.tcx().lang_items().clone_trait(); if is_copy_trait || is_clone_trait { Where(ty::Binder::bind( - vec![substs.upvar_tuple_ty_or_infer_var(def_id, self.tcx())] + vec![substs.upvar_tuple_ty(def_id, self.tcx())] )) } else { None @@ -2525,11 +2525,11 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { } ty::Closure(def_id, ref substs) => { - vec![substs.upvar_tuple_ty_or_infer_var(def_id, self.tcx())] + vec![substs.upvar_tuple_ty(def_id, self.tcx())] }, ty::Generator(def_id, ref substs, _) => { - vec![substs.upvar_tuple_ty_or_infer_var(def_id, self.tcx())] + vec![substs.upvar_tuple_ty(def_id, self.tcx())] } ty::GeneratorWitness(types) => { diff --git a/src/librustc/ty/outlives.rs b/src/librustc/ty/outlives.rs index b50cb2b3287aa..aa4ce9e4c0d56 100644 --- a/src/librustc/ty/outlives.rs +++ b/src/librustc/ty/outlives.rs @@ -62,11 +62,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { // projection). match ty.sty { ty::Closure(def_id, ref substs) => { - self.compute_components(substs.upvar_tuple_ty_or_infer_var(def_id, *self), out) + self.compute_components(substs.upvar_tuple_ty(def_id, *self), out) } ty::Generator(def_id, ref substs, _) => { - self.compute_components(substs.upvar_tuple_ty_or_infer_var(def_id, *self), out) + self.compute_components(substs.upvar_tuple_ty(def_id, *self), out) // We ignore regions in the generator interior as we don't // want these to affect region inference diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index e51ec9c5e1359..9a883e7147ca3 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -315,16 +315,16 @@ pub struct ClosureSubsts<'tcx> { /// Struct returned by `split()`. Note that these are subslices of the /// parent slice and not canonical substs themselves. struct SplitClosureSubsts<'tcx> { - // Tells you whether the closure implements Fn or FnMut or FnOnce also known - // as the kind of the closure in the rustc lingo. + /// Tells you whether the closure implements Fn or FnMut or FnOnce also known + /// as the kind of the closure in the rustc lingo. closure_kind_ty: Ty<'tcx>, - // Gives the type of the closure signature as a function. So the inputs and - // the outputs to the closure. + /// Gives the type of the closure signature as a function. So the inputs and + /// the outputs to the closure. closure_sig_ty: Ty<'tcx>, - // This represents all the upvars to the closure packed in a tuple. Its type - // is tuple with the arity of the number of upvars referred by the closure. + /// This represents all the upvars to the closure packed in a tuple. Its type + /// is tuple with the arity of the number of upvars referred by the closure. upvar_tuple_ty: Ty<'tcx>, } @@ -362,7 +362,7 @@ impl<'tcx> ClosureSubsts<'tcx> { pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { - match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + match self.upvar_tuple_ty(def_id, tcx).sty { ty::Tuple(tys) => tys.iter().cloned(), ref t => bug!("upvar_tuple_ty is not a valid tuple: {:?}", t), } @@ -372,7 +372,7 @@ impl<'tcx> ClosureSubsts<'tcx> { /// inference, may return an unresolved inference variable, in which case /// the type of parameters representing types of the upvars is not known /// yet. - pub fn upvar_tuple_ty_or_infer_var(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { + pub fn upvar_tuple_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).upvar_tuple_ty } @@ -383,9 +383,10 @@ impl<'tcx> ClosureSubsts<'tcx> { def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>, ) -> Option> + 'tcx> { - match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + match self.upvar_tuple_ty(def_id, tcx).sty { ty::Tuple(tys) => Some(tys.iter().cloned()), - ref _t => None, + ty::Infer(_) => Some(ty::List::empty().iter().cloned()), + _ => bug!("unexpected type") } } @@ -474,7 +475,7 @@ impl<'tcx> GeneratorSubsts<'tcx> { pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { - match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + match self.upvar_tuple_ty(def_id, tcx).sty { ty::Tuple(tys) => tys.iter().cloned(), ref t => bug!("Upvar_tuple_ty is not a tuple {:?}", t), } @@ -487,13 +488,14 @@ impl<'tcx> GeneratorSubsts<'tcx> { def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>, ) -> Option> + 'tcx> { - match self.upvar_tuple_ty_or_infer_var(def_id, tcx).sty { + match self.upvar_tuple_ty(def_id, tcx).sty { ty::Tuple(tys) => Some(tys.iter().cloned()), - ref _t => None, + ty::Infer(_) => Some(ty::List::empty().iter().cloned()), + _ => bug!("unexpected type") } } - pub fn upvar_tuple_ty_or_infer_var(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { + pub fn upvar_tuple_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { self.split(def_id, tcx).upvar_tuple_ty } diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index d87ea73f40870..c5dd03643088b 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -1046,7 +1046,7 @@ fn needs_drop_raw<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty::Array(ty, _) | ty::Slice(ty) => needs_drop(ty), ty::Closure(def_id, ref substs) => - needs_drop(substs.upvar_tuple_ty_or_infer_var(def_id, tcx)), + needs_drop(substs.upvar_tuple_ty(def_id, tcx)), // Pessimistically assume that all generators will require destructors // as we don't know if a destructor is a noop or not until after the MIR diff --git a/src/librustc/ty/wf.rs b/src/librustc/ty/wf.rs index 95b5e4b6782ed..204646f46cd19 100644 --- a/src/librustc/ty/wf.rs +++ b/src/librustc/ty/wf.rs @@ -346,7 +346,7 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> { // anyway, except via auto trait matching (which // only inspects the upvar types). subtys.skip_current_subtree(); // subtree handled by compute_projection - self.compute(substs.upvar_tuple_ty_or_infer_var(def_id, self.infcx.tcx)); + self.compute(substs.upvar_tuple_ty(def_id, self.infcx.tcx)); } ty::FnPtr(_) => { diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 9c128c7d706e9..346086966ad1a 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -1395,8 +1395,9 @@ define_print! { // If we are here that mens that the type of upvars // captured by this generator is not known and hence // during pretty printing this sort of error will be - // shown. - write!(f, "Upvar type not bound yet.") + // shown. It cannot come here as the calling function + // will already panic. + bug!("Upvar type error.") } }), GeneratorWitness(types) => { @@ -1405,6 +1406,9 @@ define_print! { Closure(did, substs) => ty::tls::with(|tcx| { let substs = tcx.lift(&substs).unwrap(); if let Some(upvar_tys) = substs.opt_tuple_tys(did, tcx) { + // Even if the upvars types are not bound yet, calling + // the opt-tuple_tys will return an empty list and so + // this branch will execute and not the else. write!(f, "[closure")?; if let Some(node_id) = tcx.hir().as_local_node_id(did) { @@ -1443,8 +1447,10 @@ define_print! { // If we are here that mens that the type of upvars // captured by this generator is not known and hence // during pretty printing this sort of error will be - // shown. - write!(f, "Upvar type not bound yet.") + // shown. It cannot reach here as if the upvar tuple + // is neither a tuple nor an inference variable, it will + // panic. + bug!("Upvar type not bound yet.") } }), Array(ty, sz) => { diff --git a/src/librustc_traits/dropck_outlives.rs b/src/librustc_traits/dropck_outlives.rs index 8696fc82abc69..385e30486ad77 100644 --- a/src/librustc_traits/dropck_outlives.rs +++ b/src/librustc_traits/dropck_outlives.rs @@ -200,7 +200,7 @@ fn dtorck_constraint_for_ty<'a, 'gcx, 'tcx>( span, for_ty, depth+1, - substs.upvar_tuple_ty_or_infer_var(def_id, tcx)), + substs.upvar_tuple_ty(def_id, tcx)), ty::Generator(def_id, substs, _movability) => { // rust-lang/rust#49918: types can be constructed, stored From 59a6a0c400feca0ca7af842c1cb230e9dd840ffd Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Wed, 16 Jan 2019 19:11:53 -0800 Subject: [PATCH 76/86] Making the code in the ppaux.rs deal with un-bound upvar type parameters Related to #57482 --- src/librustc/ty/sty.rs | 12 ++-- src/librustc/util/ppaux.rs | 137 ++++++++++++++++--------------------- 2 files changed, 66 insertions(+), 83 deletions(-) diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 9a883e7147ca3..8e3e7dda5067a 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -382,10 +382,10 @@ impl<'tcx> ClosureSubsts<'tcx> { self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>, - ) -> Option> + 'tcx> { + ) -> Option<&'tcx[Ty<'tcx>]> { match self.upvar_tuple_ty(def_id, tcx).sty { - ty::Tuple(tys) => Some(tys.iter().cloned()), - ty::Infer(_) => Some(ty::List::empty().iter().cloned()), + ty::Tuple(tys) => Some(tys), + ty::Infer(_) => None, _ => bug!("unexpected type") } } @@ -487,10 +487,10 @@ impl<'tcx> GeneratorSubsts<'tcx> { self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>, - ) -> Option> + 'tcx> { + ) -> Option<&'tcx[Ty<'tcx>]> { match self.upvar_tuple_ty(def_id, tcx).sty { - ty::Tuple(tys) => Some(tys.iter().cloned()), - ty::Infer(_) => Some(ty::List::empty().iter().cloned()), + ty::Tuple(tys) => Some(tys), + ty::Infer(_) => None, _ => bug!("unexpected type") } } diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 346086966ad1a..e350f9d3b6ebb 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -1355,103 +1355,86 @@ define_print! { Str => write!(f, "str"), Generator(did, substs, movability) => ty::tls::with(|tcx| { let substs = tcx.lift(&substs).unwrap(); - if let Some(upvar_tys) = substs.opt_tuple_tys(did, tcx) { - let witness = substs.witness(did, tcx); - if movability == hir::GeneratorMovability::Movable { - write!(f, "[generator")?; - } else { - write!(f, "[static generator")?; - } + let upvar_tys = substs.opt_tuple_tys(did, tcx).unwrap_or(&[]); + let witness = substs.witness(did, tcx); + if movability == hir::GeneratorMovability::Movable { + write!(f, "[generator")?; + } else { + write!(f, "[static generator")?; + } - if let Some(node_id) = tcx.hir().as_local_node_id(did) { - write!(f, "@{:?}", tcx.hir().span(node_id))?; - let mut sep = " "; - tcx.with_freevars(node_id, |freevars| { - for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { - print!(f, cx, - write("{}{}:", - sep, - tcx.hir().name(freevar.var_id())), - print(upvar_ty))?; - sep = ", "; - } - Ok(()) - })? - } else { - // cross-crate closure types should only be - // visible in codegen bug reports, I imagine. - write!(f, "@{:?}", did)?; - let mut sep = " "; - for (index, upvar_ty) in upvar_tys.enumerate() { + if let Some(node_id) = tcx.hir().as_local_node_id(did) { + write!(f, "@{:?}", tcx.hir().span(node_id))?; + let mut sep = " "; + tcx.with_freevars(node_id, |freevars| { + for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { print!(f, cx, - write("{}{}:", sep, index), + write("{}{}:", + sep, + tcx.hir().name(freevar.var_id())), print(upvar_ty))?; sep = ", "; } - } - - print!(f, cx, write(" "), print(witness), write("]")) + Ok(()) + })? } else { - // If we are here that mens that the type of upvars - // captured by this generator is not known and hence - // during pretty printing this sort of error will be - // shown. It cannot come here as the calling function - // will already panic. - bug!("Upvar type error.") + // cross-crate closure types should only be + // visible in codegen bug reports, I imagine. + write!(f, "@{:?}", did)?; + let mut sep = " "; + for (index, upvar_ty) in upvar_tys.iter().enumerate() { + print!(f, cx, + write("{}{}:", sep, index), + print(upvar_ty))?; + sep = ", "; + } } + + print!(f, cx, write(" "), print(witness), write("]")) }), GeneratorWitness(types) => { ty::tls::with(|tcx| cx.in_binder(f, tcx, &types, tcx.lift(&types))) } Closure(did, substs) => ty::tls::with(|tcx| { let substs = tcx.lift(&substs).unwrap(); - if let Some(upvar_tys) = substs.opt_tuple_tys(did, tcx) { - // Even if the upvars types are not bound yet, calling - // the opt-tuple_tys will return an empty list and so - // this branch will execute and not the else. - write!(f, "[closure")?; - - if let Some(node_id) = tcx.hir().as_local_node_id(did) { - if tcx.sess.opts.debugging_opts.span_free_formats { - write!(f, "@{:?}", node_id)?; - } else { - write!(f, "@{:?}", tcx.hir().span(node_id))?; - } - let mut sep = " "; - tcx.with_freevars(node_id, |freevars| { - for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { - print!(f, cx, - write("{}{}:", - sep, - tcx.hir().name(freevar.var_id())), - print(upvar_ty))?; - sep = ", "; - } - Ok(()) - })? + let upvar_tys = substs.opt_tuple_tys(did, tcx).unwrap_or(&[]); + // Even if the upvars types are not bound yet, calling + // the opt-tuple_tys will return an empty list and so + // this branch will execute and not the else. + write!(f, "[closure")?; + + if let Some(node_id) = tcx.hir().as_local_node_id(did) { + if tcx.sess.opts.debugging_opts.span_free_formats { + write!(f, "@{:?}", node_id)?; } else { - // cross-crate closure types should only be - // visible in codegen bug reports, I imagine. - write!(f, "@{:?}", did)?; - let mut sep = " "; - for (index, upvar_ty) in upvar_tys.enumerate() { + write!(f, "@{:?}", tcx.hir().span(node_id))?; + } + let mut sep = " "; + tcx.with_freevars(node_id, |freevars| { + for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { print!(f, cx, - write("{}{}:", sep, index), + write("{}{}:", + sep, + tcx.hir().name(freevar.var_id())), print(upvar_ty))?; sep = ", "; } - } - - write!(f, "]") + Ok(()) + })? } else { - // If we are here that mens that the type of upvars - // captured by this generator is not known and hence - // during pretty printing this sort of error will be - // shown. It cannot reach here as if the upvar tuple - // is neither a tuple nor an inference variable, it will - // panic. - bug!("Upvar type not bound yet.") + // cross-crate closure types should only be + // visible in codegen bug reports, I imagine. + write!(f, "@{:?}", did)?; + let mut sep = " "; + for (index, upvar_ty) in upvar_tys.iter().enumerate() { + print!(f, cx, + write("{}{}:", sep, index), + print(upvar_ty))?; + sep = ", "; + } } + + write!(f, "]") }), Array(ty, sz) => { print!(f, cx, write("["), print(ty), write("; "))?; From 85685654659f66dd3d838bc6c90fa653c9a9114e Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Fri, 18 Jan 2019 21:32:39 -0800 Subject: [PATCH 77/86] Making the upvar_tys return a slice of Ty<'tcx> This patch addresses the returning of a slice of &'tcx[Ty<'tcx>] from the upvar_tys function as it is more easy on the eyes. Cleanups related to #57482 --- Cargo.lock | 1 - src/librustc/Cargo.toml | 1 - src/librustc/lib.rs | 1 - src/librustc/ty/layout.rs | 4 ++-- src/librustc/ty/sty.rs | 19 ++++++++++--------- .../debuginfo/metadata.rs | 2 +- .../borrow_check/nll/type_check/mod.rs | 8 ++++---- .../borrow_check/nll/universal_regions.rs | 6 ++++-- src/librustc_mir/shim.rs | 2 +- src/librustc_mir/transform/generator.rs | 2 +- src/librustc_mir/util/elaborate_drops.rs | 4 ++-- src/librustc_traits/dropck_outlives.rs | 7 ++++++- src/librustc_typeck/check/upvar.rs | 1 + 13 files changed, 32 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbac1258dcfc9..1fde5ac8cb15a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2067,7 +2067,6 @@ dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "chalk-engine 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fmt_macros 0.0.0", "graphviz 0.0.0", diff --git a/src/librustc/Cargo.toml b/src/librustc/Cargo.toml index ec3df1ac62b3b..504e016e5b803 100644 --- a/src/librustc/Cargo.toml +++ b/src/librustc/Cargo.toml @@ -11,7 +11,6 @@ crate-type = ["dylib"] [dependencies] arena = { path = "../libarena" } bitflags = "1.0" -either = "1.5.0" fmt_macros = { path = "../libfmt_macros" } graphviz = { path = "../libgraphviz" } jobserver = "0.1" diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 3f3cf501c9754..b2a924ac19895 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -69,7 +69,6 @@ extern crate arena; #[macro_use] extern crate bitflags; extern crate core; -extern crate either; extern crate fmt_macros; extern crate getopts; extern crate graphviz; diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index 1162bff852cbb..4e69bde94b85b 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -614,7 +614,7 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> { ty::Closure(def_id, ref substs) => { let tys = substs.upvar_tys(def_id, tcx); - univariant(&tys.map(|ty| self.layout_of(ty)).collect::, _>>()?, + univariant(&tys.iter().map(|ty| self.layout_of(ty)).collect::, _>>()?, &ReprOptions::default(), StructKind::AlwaysSized)? } @@ -1711,7 +1711,7 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx> // Tuples, generators and closures. ty::Closure(def_id, ref substs) => { - substs.upvar_tys(def_id, tcx).nth(i).unwrap() + substs.upvar_tys(def_id, tcx).iter().nth(i).unwrap() } ty::Generator(def_id, ref substs, _) => { diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 8e3e7dda5067a..918bda471c42c 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -1,6 +1,5 @@ //! This module contains `TyKind` and its major components. -use either::Either; use hir; use hir::def_id::DefId; use infer::canonical::Canonical; @@ -360,10 +359,10 @@ impl<'tcx> ClosureSubsts<'tcx> { /// hence a panic will occur. #[inline] pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> - impl Iterator> + 'tcx + &'tcx[Ty<'tcx>] { match self.upvar_tuple_ty(def_id, tcx).sty { - ty::Tuple(tys) => tys.iter().cloned(), + ty::Tuple(tys) => tys, ref t => bug!("upvar_tuple_ty is not a valid tuple: {:?}", t), } } @@ -473,10 +472,10 @@ impl<'tcx> GeneratorSubsts<'tcx> { /// type inference as the arity of the tuple will not be known at the time. #[inline] pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> - impl Iterator> + 'tcx + &'tcx[Ty<'tcx>] { match self.upvar_tuple_ty(def_id, tcx).sty { - ty::Tuple(tys) => tys.iter().cloned(), + ty::Tuple(tys) => tys, ref t => bug!("Upvar_tuple_ty is not a tuple {:?}", t), } } @@ -548,7 +547,7 @@ impl<'a, 'gcx, 'tcx> GeneratorSubsts<'tcx> { pub fn pre_transforms_tys(self, def_id: DefId, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> impl Iterator> + 'a { - self.upvar_tys(def_id, tcx).chain(iter::once(tcx.types.u32)) + self.upvar_tys(def_id, tcx).iter().cloned().chain(iter::once(tcx.types.u32)) } /// This is the types of all the fields stored in a generator. @@ -569,11 +568,13 @@ pub enum UpvarSubsts<'tcx> { impl<'tcx> UpvarSubsts<'tcx> { #[inline] pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> - impl Iterator> + 'tcx + &'tcx[Ty<'tcx>] { match self { - UpvarSubsts::Closure(subts) => Either::Left(subts.upvar_tys(def_id, tcx)), - UpvarSubsts::Generator(substs) => Either::Right(substs.upvar_tys(def_id, tcx)), + UpvarSubsts::Closure(subts) => subts.upvar_tys(def_id, tcx), + //Either::Left(subts.upvar_tys(def_id, tcx)), + UpvarSubsts::Generator(substs) => substs.upvar_tys(def_id, tcx), + //Either::Right(substs.upvar_tys(def_id, tcx)), } } } diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 72ed55df94658..c7cad59725776 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -612,7 +612,7 @@ pub fn type_metadata( } ty::Closure(def_id, substs) => { - let upvar_tys : Vec<_> = substs.upvar_tys(def_id, cx.tcx).collect(); + let upvar_tys : Vec<_> = substs.upvar_tys(def_id, cx.tcx).iter().cloned().collect(); prepare_tuple_metadata(cx, t, &upvar_tys, diff --git a/src/librustc_mir/borrow_check/nll/type_check/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/mod.rs index 180aa1907e8d1..1510d52b3e568 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs @@ -674,10 +674,10 @@ impl<'a, 'b, 'gcx, 'tcx> TypeVerifier<'a, 'b, 'gcx, 'tcx> { ty::Adt(adt_def, substs) if !adt_def.is_enum() => (&adt_def.variants[VariantIdx::new(0)], substs), ty::Closure(def_id, substs) => { - return match substs.upvar_tys(def_id, tcx).nth(field.index()) { + return match substs.upvar_tys(def_id, tcx).iter().nth(field.index()) { Some(ty) => Ok(ty), None => Err(FieldAccessError::OutOfRange { - field_count: substs.upvar_tys(def_id, tcx).count(), + field_count: substs.upvar_tys(def_id, tcx).iter().count(), }), } } @@ -1819,10 +1819,10 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> { } } AggregateKind::Closure(def_id, substs) => { - match substs.upvar_tys(def_id, tcx).nth(field_index) { + match substs.upvar_tys(def_id, tcx).iter().nth(field_index) { Some(ty) => Ok(ty), None => Err(FieldAccessError::OutOfRange { - field_count: substs.upvar_tys(def_id, tcx).count(), + field_count: substs.upvar_tys(def_id, tcx).iter().count(), }), } } diff --git a/src/librustc_mir/borrow_check/nll/universal_regions.rs b/src/librustc_mir/borrow_check/nll/universal_regions.rs index c63d45ce1d272..ddc02fd558409 100644 --- a/src/librustc_mir/borrow_check/nll/universal_regions.rs +++ b/src/librustc_mir/borrow_check/nll/universal_regions.rs @@ -109,9 +109,11 @@ impl<'tcx> DefiningTy<'tcx> { /// match up with the `upvar_decls` field of `Mir`. pub fn upvar_tys(self, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { match self { - DefiningTy::Closure(def_id, substs) => Either::Left(substs.upvar_tys(def_id, tcx)), + DefiningTy::Closure(def_id, substs) => { + Either::Left(substs.upvar_tys(def_id, tcx).iter().cloned()) + } DefiningTy::Generator(def_id, substs, _) => { - Either::Right(Either::Left(substs.upvar_tys(def_id, tcx))) + Either::Right(Either::Left(substs.upvar_tys(def_id, tcx).iter().cloned())) } DefiningTy::FnDef(..) | DefiningTy::Const(..) => { Either::Right(Either::Right(iter::empty())) diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 751815eab287b..b1dc4af3754f4 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -324,7 +324,7 @@ fn build_clone_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty::Closure(def_id, substs) => { builder.tuple_like_shim( dest, src, - substs.upvar_tys(def_id, tcx) + substs.upvar_tys(def_id, tcx).iter().cloned() ) } ty::Tuple(tys) => builder.tuple_like_shim(dest, src, tys.iter().cloned()), diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index ec0c118634d0f..f8196b35ebec8 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -843,7 +843,7 @@ impl MirPass for StateTransform { // Get the interior types and substs which typeck computed let (upvars, interior, movable) = match gen_ty.sty { ty::Generator(_, substs, movability) => { - (substs.upvar_tys(def_id, tcx).collect(), + (substs.upvar_tys(def_id, tcx).iter().cloned().collect(), substs.witness(def_id, tcx), movability == hir::GeneratorMovability::Movable) } diff --git a/src/librustc_mir/util/elaborate_drops.rs b/src/librustc_mir/util/elaborate_drops.rs index 8b55a4424ae29..baf4a8503d2b0 100644 --- a/src/librustc_mir/util/elaborate_drops.rs +++ b/src/librustc_mir/util/elaborate_drops.rs @@ -780,7 +780,7 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D> let ty = self.place_ty(self.place); match ty.sty { ty::Closure(def_id, substs) => { - let tys : Vec<_> = substs.upvar_tys(def_id, self.tcx()).collect(); + let tys : Vec<_> = substs.upvar_tys(def_id, self.tcx()).iter().cloned().collect(); self.open_drop_for_tuple(&tys) } // Note that `elaborate_drops` only drops the upvars of a generator, @@ -790,7 +790,7 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D> // It effetively only contains upvars until the generator transformation runs. // See librustc_mir/transform/generator.rs for more details. ty::Generator(def_id, substs, _) => { - let tys : Vec<_> = substs.upvar_tys(def_id, self.tcx()).collect(); + let tys : Vec<_> = substs.upvar_tys(def_id, self.tcx()).iter().cloned().collect(); self.open_drop_for_tuple(&tys) } ty::Tuple(tys) => { diff --git a/src/librustc_traits/dropck_outlives.rs b/src/librustc_traits/dropck_outlives.rs index 385e30486ad77..a222135595e12 100644 --- a/src/librustc_traits/dropck_outlives.rs +++ b/src/librustc_traits/dropck_outlives.rs @@ -227,7 +227,12 @@ fn dtorck_constraint_for_ty<'a, 'gcx, 'tcx>( // *do* incorporate the upvars here. let constraint = DtorckConstraint { - outlives: substs.upvar_tys(def_id, tcx).map(|t| t.into()).collect(), + outlives: substs + .upvar_tys(def_id, tcx) + .iter() + .cloned() + .map(|t| t.into()) + .collect(), dtorck_types: vec![], overflows: vec![], }; diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index ffd7c2114e5ab..46676fd3a220a 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -223,6 +223,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { ); for (upvar_ty, final_upvar_ty) in substs .upvar_tys(closure_def_id, self.tcx) + .iter() .zip(final_upvar_tys) { self.demand_suptype(span, upvar_ty, final_upvar_ty); From 136a711012c9757674e4aa21583de3916c6d26fd Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Tue, 22 Jan 2019 20:08:11 -0800 Subject: [PATCH 78/86] Last bit of code where the upvar_tys was returning iterator. We changed it to return a slice. Cleanups related to #57482 --- .../nll/region_infer/error_reporting/var_name.rs | 3 +++ .../borrow_check/nll/universal_regions.rs | 15 ++++----------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs index c2f2e99c0a55b..3c9ad7d7a02e1 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs @@ -39,6 +39,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { .universal_regions .defining_ty .upvar_tys(tcx) + .iter() + .cloned() .position(|upvar_ty| { debug!("get_upvar_index_for_region: upvar_ty={:?}", upvar_ty); tcx.any_free_region_meets(&upvar_ty, |r| { @@ -52,6 +54,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { .universal_regions .defining_ty .upvar_tys(tcx) + .iter() .nth(upvar_index); debug!( diff --git a/src/librustc_mir/borrow_check/nll/universal_regions.rs b/src/librustc_mir/borrow_check/nll/universal_regions.rs index ddc02fd558409..b19ec573b7b32 100644 --- a/src/librustc_mir/borrow_check/nll/universal_regions.rs +++ b/src/librustc_mir/borrow_check/nll/universal_regions.rs @@ -12,7 +12,6 @@ //! The code in this file doesn't *do anything* with those results; it //! just returns them for other code to use. -use either::Either; use rustc::hir::def_id::DefId; use rustc::hir::{self, BodyOwnerKind, HirId}; use rustc::infer::{InferCtxt, NLLRegionVariableOrigin}; @@ -107,17 +106,11 @@ impl<'tcx> DefiningTy<'tcx> { /// not a closure or generator, there are no upvars, and hence it /// will be an empty list. The order of types in this list will /// match up with the `upvar_decls` field of `Mir`. - pub fn upvar_tys(self, tcx: TyCtxt<'_, '_, 'tcx>) -> impl Iterator> + 'tcx { + pub fn upvar_tys(self, tcx: TyCtxt<'_, '_, 'tcx>) -> &'tcx[Ty<'tcx>] { match self { - DefiningTy::Closure(def_id, substs) => { - Either::Left(substs.upvar_tys(def_id, tcx).iter().cloned()) - } - DefiningTy::Generator(def_id, substs, _) => { - Either::Right(Either::Left(substs.upvar_tys(def_id, tcx).iter().cloned())) - } - DefiningTy::FnDef(..) | DefiningTy::Const(..) => { - Either::Right(Either::Right(iter::empty())) - } + DefiningTy::Closure(def_id, substs) => substs.upvar_tys(def_id, tcx), + DefiningTy::Generator(def_id, substs, _) => substs.upvar_tys(def_id, tcx), + DefiningTy::FnDef(..) | DefiningTy::Const(..) => &[], } } From 24e425eaf631b8399d9a8bbc2c0f53190f3afd04 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 25 Jan 2019 12:45:16 -0500 Subject: [PATCH 79/86] modify comment --- src/librustc/ty/sty.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 918bda471c42c..c55c404942bd1 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -208,7 +208,7 @@ static_assert!(MEM_SIZE_OF_TY_KIND: ::std::mem::size_of::>() == 24); /// A closure can be modeled as a struct that looks like: /// -/// struct Closure<'l0...'li, T0...Tj, CK, CS, U0...Uk> { +/// struct Closure<'l0...'li, T0...Tj, CK, CS, (U0...Uk)> { /// upvar0: U0, /// ... /// upvark: Uk @@ -225,9 +225,17 @@ static_assert!(MEM_SIZE_OF_TY_KIND: ::std::mem::size_of::>() == 24); /// type. For example, `fn(u32, u32) -> u32` would mean that the closure /// implements `CK<(u32, u32), Output = u32>`, where `CK` is the trait /// specified above. -/// - U0...Uk are type parameters representing the types of its upvars -/// (borrowed, if appropriate; that is, if Ui represents a by-ref upvar, -/// and the up-var has the type `Foo`, then `Ui = &Foo`). +/// - (U0...Uk) represents a type parameter which will always be a +/// tuple of k different types (post type inference). Each type Ui +/// represents the type of a upvar (borrowed, if appropriate; that +/// is, if Ui represents a by-ref upvar, and the up-var has the type +/// `Foo`, then `Ui = &Foo`). +/// - Note that the struct above is not legal Rust syntax, because +/// the upvar fields get their type from elements of the +/// `(U0..Uk)` tuple. We can do this because this struct is not +/// *truly* represented as an ordinary struct in the compiler. +/// - FIXME: We might want to refactor to a single field `upvars: +/// (U0..Uk)` of tuple type, just to be nice. /// /// So, for example, given this function: /// From 4a02c5b487dd7cf1973208e32af22397122e67f4 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 25 Jan 2019 13:13:17 -0500 Subject: [PATCH 80/86] change closure generics to produce a tuple of upvars also change `ClosureSubsts` and upvar inference code to match. --- src/librustc/ty/sty.rs | 39 +++++++++------------------- src/librustc/ty/subst.rs | 10 +++++++ src/librustc_typeck/check/closure.rs | 2 +- src/librustc_typeck/check/upvar.rs | 17 +++++++----- src/librustc_typeck/collect.rs | 29 +++++++++++---------- 5 files changed, 48 insertions(+), 49 deletions(-) diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index c55c404942bd1..215d66bb1341b 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -7,7 +7,7 @@ use mir::interpret::ConstValue; use middle::region; use polonius_engine::Atom; use rustc_data_structures::indexed_vec::Idx; -use ty::subst::{Substs, Subst, UnpackedKind}; +use ty::subst::{Substs, Subst}; use ty::{self, AdtDef, TypeFlags, Ty, TyCtxt, TypeFoldable}; use ty::{List, TyS, ParamEnvAnd, ParamEnv}; use util::captures::Captures; @@ -343,21 +343,10 @@ impl<'tcx> ClosureSubsts<'tcx> { let generics = tcx.generics_of(def_id); let parent_len = generics.parent_count; - // create a tuple of the type parameters representing the types of the - // upvars. In the light of the opening comments above,taking the - // U0 .. Uk and creating one (U0, .., Uk) - let upvar_subts = &self.substs[parent_len + 2..]; - let upvar_tys_iter = upvar_subts.iter().map(|t| { - if let UnpackedKind::Type(ty) = t.unpack() { - ty - } else { - bug!("Expected upvar type here.") - } - }); SplitClosureSubsts { closure_kind_ty: self.substs.type_at(parent_len), closure_sig_ty: self.substs.type_at(parent_len + 1), - upvar_tuple_ty: tcx.mk_tup(upvar_tys_iter), + upvar_tuple_ty: self.substs.type_at(parent_len + 2), } } @@ -450,19 +439,11 @@ impl<'tcx> GeneratorSubsts<'tcx> { fn split(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> SplitGeneratorSubsts<'tcx> { let generics = tcx.generics_of(def_id); let parent_len = generics.parent_count; - let upvar_substs = &self.substs[parent_len + 3..]; - let upvar_tys = upvar_substs.iter().map(|t| { - if let UnpackedKind::Type(ty) = t.unpack() { - ty - } else { - bug!("Upvar type expecetd.") - } - }); SplitGeneratorSubsts { yield_ty: self.substs.type_at(parent_len), return_ty: self.substs.type_at(parent_len + 1), witness: self.substs.type_at(parent_len + 2), - upvar_tuple_ty: tcx.mk_tup(upvar_tys), + upvar_tuple_ty: self.substs.type_at(parent_len + 3), } } @@ -575,14 +556,18 @@ pub enum UpvarSubsts<'tcx> { impl<'tcx> UpvarSubsts<'tcx> { #[inline] - pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> - &'tcx[Ty<'tcx>] - { + pub fn upvar_tuple_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { + match self { + UpvarSubsts::Closure(subts) => subts.upvar_tuple_ty(def_id, tcx), + UpvarSubsts::Generator(substs) => substs.upvar_tuple_ty(def_id, tcx), + } + } + + #[inline] + pub fn upvar_tys(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> &'tcx [Ty<'tcx>] { match self { UpvarSubsts::Closure(subts) => subts.upvar_tys(def_id, tcx), - //Either::Left(subts.upvar_tys(def_id, tcx)), UpvarSubsts::Generator(substs) => substs.upvar_tys(def_id, tcx), - //Either::Right(substs.upvar_tys(def_id, tcx)), } } } diff --git a/src/librustc/ty/subst.rs b/src/librustc/ty/subst.rs index 64e7af815b4bf..e0deda1914e48 100644 --- a/src/librustc/ty/subst.rs +++ b/src/librustc/ty/subst.rs @@ -161,6 +161,16 @@ pub type Substs<'tcx> = List>; impl<'a, 'gcx, 'tcx> Substs<'tcx> { /// Creates a `Substs` that maps each generic parameter to itself. + /// + /// # Example + /// + /// Given a struct `S` declared like so: + /// + /// ``` + /// struct S {..} + /// ``` + /// + /// this would return a set of substitutions `[A, B, C]`. pub fn identity_for_item(tcx: TyCtxt<'a, 'gcx, 'tcx>, def_id: DefId) -> &'tcx Substs<'tcx> { Substs::for_item(tcx, def_id, |param, _| { diff --git a/src/librustc_typeck/check/closure.rs b/src/librustc_typeck/check/closure.rs index df83c92fde5b4..b93d325383bc9 100644 --- a/src/librustc_typeck/check/closure.rs +++ b/src/librustc_typeck/check/closure.rs @@ -96,7 +96,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { // inference phase (`upvar.rs`). let base_substs = Substs::identity_for_item(self.tcx, self.tcx.closure_base_def_id(expr_def_id)); - let substs = base_substs.extend_to(self.tcx,expr_def_id, |param, _| { + let substs = base_substs.extend_to(self.tcx, expr_def_id, |param, _| { match param.kind { GenericParamDefKind::Lifetime => { span_bug!(expr.span, "closure has region param") diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index 46676fd3a220a..400f96e00b068 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -221,13 +221,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { "analyze_closure: id={:?} substs={:?} final_upvar_tys={:?}", closure_node_id, substs, final_upvar_tys ); - for (upvar_ty, final_upvar_ty) in substs - .upvar_tys(closure_def_id, self.tcx) - .iter() - .zip(final_upvar_tys) - { - self.demand_suptype(span, upvar_ty, final_upvar_ty); - } + let final_upvar_tuple_ty = self.tcx.mk_tup(final_upvar_tys.iter()); + let subst_upvar_tuple_ty = substs.upvar_tuple_ty(closure_def_id, self.tcx); + self.demand_suptype(span, subst_upvar_tuple_ty, final_upvar_tuple_ty); // If we are also inferred the closure kind here, // process any deferred resolutions. @@ -265,8 +261,15 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { var_node_id, freevar_ty, capture ); + // Given some variable `x: T` in the parent's scope... match capture { + // If the variable `x` is captured "by move", + // then the corresponding type is just `T`. ty::UpvarCapture::ByValue => freevar_ty, + + // Otherwise it is captured by reference, so + // the desugared upvar in the closure has type + // `&T` or `&mut T`. ty::UpvarCapture::ByRef(borrow) => tcx.mk_ref( borrow.region, ty::TypeAndMut { diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index be5f398e31f05..ac3f73d1c1415 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1054,6 +1054,10 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty &["", ""][..] }; + // For closures: Add the CK, CS type parameters discussed in + // `ClosureSubsts` comment. + // + // For generators: add the yield/return/witness types. params.extend( dummy_args .iter() @@ -1071,20 +1075,17 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty }), ); - tcx.with_freevars(node_id, |fv| { - params.extend(fv.iter().zip((dummy_args.len() as u32)..).map(|(_, i)| { - ty::GenericParamDef { - index: type_start + i, - name: Symbol::intern("").as_interned_str(), - def_id, - pure_wrt_drop: false, - kind: ty::GenericParamDefKind::Type { - has_default: false, - object_lifetime_default: rl::Set1::Empty, - synthetic: None, - }, - } - })); + // For closures/generators: Add the (U0...Uk) tuple. + params.push(ty::GenericParamDef { + index: type_start + i as u32, + name: Symbol::intern("").as_interned_str(), + def_id, + pure_wrt_drop: false, + kind: ty::GenericParamDefKind::Type { + has_default: false, + object_lifetime_default: rl::Set1::Empty, + synthetic: None, + }, }); } From 64d0145d19e5eeed73d877186ccf12345ba02f95 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 25 Jan 2019 13:30:39 -0500 Subject: [PATCH 81/86] fix indexing miscount --- src/librustc_typeck/collect.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index ac3f73d1c1415..c49c06a4360d9 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1077,7 +1077,7 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty // For closures/generators: Add the (U0...Uk) tuple. params.push(ty::GenericParamDef { - index: type_start + i as u32, + index: type_start + dummy_args.len() as u32, name: Symbol::intern("").as_interned_str(), def_id, pure_wrt_drop: false, From 662e0a8396bb458714ae96638d3817c430ed4716 Mon Sep 17 00:00:00 2001 From: blitzerr Date: Mon, 11 Mar 2019 04:00:07 -0700 Subject: [PATCH 82/86] fixing test error for ui/not-clone-closure.rs and friends --- src/librustc/traits/select.rs | 47 ++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 99f0ae70081bb..17ce4ab615e6c 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -312,7 +312,7 @@ struct EvaluatedCandidate<'tcx> { /// When does the builtin impl for `T: Trait` apply? enum BuiltinImplConditions<'tcx> { /// The impl is conditional on T1,T2,.. : Trait - Where(ty::Binder>>), + Where(ty::Binder<(Vec>, bool)>), /// There is no built-in impl. There may be some other /// candidate (a where-clause or user-defined impl). None, @@ -2307,7 +2307,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { BuiltinImplConditions::Where(nested) => { debug!("builtin_bound: nested={:?}", nested); candidates.vec.push(BuiltinCandidate { - has_nested: nested.skip_binder().len() > 0, + has_nested: nested.skip_binder().0.len() > 0, }); } BuiltinImplConditions::None => {} @@ -2349,21 +2349,23 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { | ty::Never | ty::Error => { // safe for everything - Where(ty::Binder::dummy(Vec::new())) + Where(ty::Binder::dummy( (Vec::new(), false) )) } ty::Str | ty::Slice(_) | ty::Dynamic(..) | ty::Foreign(..) => None, - ty::Tuple(tys) => Where(ty::Binder::bind(tys.last().into_iter().cloned().collect())), + ty::Tuple(tys) => Where(ty::Binder::bind( + (tys.last().into_iter().cloned().collect(), false) + )), ty::Adt(def, substs) => { let sized_crit = def.sized_constraint(self.tcx()); // (*) binder moved here Where(ty::Binder::bind( - sized_crit + (sized_crit .iter() .map(|ty| ty.subst(self.tcx(), substs)) - .collect(), + .collect(), false), )) } @@ -2399,7 +2401,8 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { | ty::Infer(ty::FloatVar(_)) | ty::FnDef(..) | ty::FnPtr(_) - | ty::Error => Where(ty::Binder::dummy(Vec::new())), + | ty::Error => Where(ty::Binder::dummy( + (Vec::new(), false) )), ty::Uint(_) | ty::Int(_) @@ -2423,21 +2426,24 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { ty::Array(element_ty, _) => { // (*) binder moved here - Where(ty::Binder::bind(vec![element_ty])) + Where(ty::Binder::bind( + (vec![element_ty], false) )) } ty::Tuple(tys) => { // (*) binder moved here - Where(ty::Binder::bind(tys.to_vec())) + Where(ty::Binder::bind( + (tys.to_vec(), false) )) } ty::Closure(def_id, substs) => { let trait_id = obligation.predicate.def_id(); - let is_copy_trait = Some(trait_id) == self.tcx().lang_items().copy_trait(); - let is_clone_trait = Some(trait_id) == self.tcx().lang_items().clone_trait(); + let lang_items = self.tcx().lang_items(); + let is_copy_trait = Some(trait_id) == lang_items.copy_trait(); + let is_clone_trait = Some(trait_id) == lang_items.clone_trait(); if is_copy_trait || is_clone_trait { Where(ty::Binder::bind( - vec![substs.upvar_tuple_ty(def_id, self.tcx())] + (vec![substs.upvar_tuple_ty(def_id, self.tcx())], true) )) } else { None @@ -2738,7 +2744,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { let lang_items = self.tcx().lang_items(); let obligations = if has_nested { let trait_def = obligation.predicate.def_id(); - let conditions = if Some(trait_def) == lang_items.sized_trait() { + let conditions_pair = if Some(trait_def) == lang_items.sized_trait() { self.sized_conditions(obligation) } else if Some(trait_def) == lang_items.copy_trait() { self.copy_clone_conditions(obligation) @@ -2747,21 +2753,28 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { } else { bug!("unexpected builtin trait {:?}", trait_def) }; - let nested = match conditions { - BuiltinImplConditions::Where(nested) => nested, + let (nested_bound_types, is_closure_tuple) = match conditions_pair { + BuiltinImplConditions::Where(nested) => { + nested.skip_binder().clone() + }, _ => bug!( "obligation {:?} had matched a builtin impl but now doesn't", obligation ), }; - let cause = obligation.derived_cause(BuiltinDerivedObligation); + let cause = if is_closure_tuple { + obligation.derived_cause(BuiltinDerivedObligation) + } else { + obligation.cause.clone() + }; + self.collect_predicates_for_types( obligation.param_env, cause, obligation.recursion_depth + 1, trait_def, - nested, + ty::Binder::bind(nested_bound_types), ) } else { vec![] From 7567a314b63cdea5ed53a1733b0e7981d8b6656e Mon Sep 17 00:00:00 2001 From: blitzerr Date: Mon, 11 Mar 2019 18:11:34 -0700 Subject: [PATCH 83/86] Removing the extra line in ui tests that got added because of the upvar-uple change Representing closures as a tuple of upvar types adds a line in error reporting as it adds an extra step of obtaining the upvar list from the tuple and hence an extra line was spit out by the compiler while error reporting. This removes that. --- src/librustc/traits/select.rs | 42 +++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 17ce4ab615e6c..3f3b912a4ba89 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -2487,7 +2487,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { /// Bar where struct Bar { x: T, y: u32 } -> [i32, u32] /// Zed where enum Zed { A(T), B(u32) } -> [i32, u32] /// ``` - fn constituent_types_for_ty(&self, t: Ty<'tcx>) -> Vec> { + fn constituent_types_for_ty(&self, t: Ty<'tcx>) -> (Vec>, bool) { match t.sty { ty::Uint(_) | ty::Int(_) @@ -2500,7 +2500,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { | ty::Infer(ty::IntVar(_)) | ty::Infer(ty::FloatVar(_)) | ty::Never - | ty::Char => Vec::new(), + | ty::Char => (Vec::new(), false), ty::UnnormalizedProjection(..) | ty::Placeholder(..) @@ -2520,41 +2520,47 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { } ty::RawPtr(ty::TypeAndMut { ty: element_ty, .. }) | ty::Ref(_, element_ty, _) => { - vec![element_ty] + (vec![element_ty], false) } - ty::Array(element_ty, _) | ty::Slice(element_ty) => vec![element_ty], + ty::Array(element_ty, _) | ty::Slice(element_ty) => { + (vec![element_ty], false) + } ty::Tuple(ref tys) => { // (T1, ..., Tn) -- meets any bound that all of T1...Tn meet - tys.to_vec() + (tys.to_vec(), false) } ty::Closure(def_id, ref substs) => { - vec![substs.upvar_tuple_ty(def_id, self.tcx())] + (vec![substs.upvar_tuple_ty(def_id, self.tcx())], true) }, ty::Generator(def_id, ref substs, _) => { - vec![substs.upvar_tuple_ty(def_id, self.tcx())] + (vec![substs.upvar_tuple_ty(def_id, self.tcx())], true) } ty::GeneratorWitness(types) => { // This is sound because no regions in the witness can refer to // the binder outside the witness. So we'll effectivly reuse // the implicit binder around the witness. - types.skip_binder().to_vec() + (types.skip_binder().to_vec(), false) } // for `PhantomData`, we pass `T` - ty::Adt(def, substs) if def.is_phantom_data() => substs.types().collect(), + ty::Adt(def, substs) if def.is_phantom_data() => { + (substs.types().collect(), false) + } - ty::Adt(def, substs) => def.all_fields().map(|f| f.ty(self.tcx(), substs)).collect(), + ty::Adt(def, substs) => { + (def.all_fields().map(|f| f.ty(self.tcx(), substs)).collect(), false) + } ty::Opaque(def_id, substs) => { // We can resolve the `impl Trait` to its concrete type, // which enforces a DAG between the functions requiring // the auto trait bounds in question. - vec![self.tcx().type_of(def_id).subst(self.tcx(), substs)] + (vec![self.tcx().type_of(def_id).subst(self.tcx(), substs)], false) } } } @@ -2802,11 +2808,14 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { obligation, trait_def_id ); + let mut is_upvar_tuple_ty = false; let types = obligation.predicate.map_bound(|inner| { let self_ty = self.infcx.shallow_resolve(inner.self_ty()); - self.constituent_types_for_ty(self_ty) + let ret = self.constituent_types_for_ty(self_ty); + is_upvar_tuple_ty = ret.1; + ret.0 }); - self.vtable_auto_impl(obligation, trait_def_id, types) + self.vtable_auto_impl(obligation, trait_def_id, types, is_upvar_tuple_ty) } /// See `confirm_auto_impl_candidate`. @@ -2815,10 +2824,15 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { obligation: &TraitObligation<'tcx>, trait_def_id: DefId, nested: ty::Binder>>, + is_upvar_tuple_ty: bool ) -> VtableAutoImplData> { debug!("vtable_auto_impl: nested={:?}", nested); - let cause = obligation.derived_cause(BuiltinDerivedObligation); + let cause = if is_upvar_tuple_ty { + obligation.derived_cause(BuiltinDerivedObligation) + } else { + obligation.cause.clone() + }; let mut obligations = self.collect_predicates_for_types( obligation.param_env, cause, From 4a21a52b3bf665abf753a33041bc2ae79322980c Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 30 Apr 2019 16:24:41 -0400 Subject: [PATCH 84/86] include the witness in the constituent types for a generator --- src/librustc/traits/select.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 3f3b912a4ba89..2a15ebc93bfe4 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -2537,7 +2537,8 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { }, ty::Generator(def_id, ref substs, _) => { - (vec![substs.upvar_tuple_ty(def_id, self.tcx())], true) + let witness = substs.witness(def_id, self.tcx()); + (vec![witness, substs.upvar_tuple_ty(def_id, self.tcx())], true) } ty::GeneratorWitness(types) => { From 7763f9716ad06dd0fd8ee3dff5a5a483568d51c5 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Tue, 29 Jan 2019 20:17:08 -0800 Subject: [PATCH 85/86] add a fixme --- src/librustc/ty/sty.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 215d66bb1341b..e632a1773f7df 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -555,6 +555,16 @@ pub enum UpvarSubsts<'tcx> { } impl<'tcx> UpvarSubsts<'tcx> { + // (FIXME) Ideally we would like for the lifetimes for TyCtxt to change from <'_, '_, 'tcx> to + // <'_, 'tcx, 'tcx> to cause a compile time failure if this was called from the inference + // context. Currently, it will lead to a runtime panic which is not that bad but in the + // interest of compile time failure being better than runtime failures, we should. In words of + // @niko in particular, pre_transforms_ty is used in the NLL type-check (which does have an + // inference context) however, we could also just rewrite that function -- and perhaps move it + // into the NLL type_check/mod.rs file, the only place it is invoked -- to match against the + // tuple and extract the contents. the point being that we know that, when we are in the NLL + // type-check, these types should be fully inferred (we do have an active inference context + // then, but we are inferring different things) #[inline] pub fn upvar_tuple_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, 'tcx>) -> Ty<'tcx> { match self { From ad4515e157f188d3163386fc0d9844af35df0a54 Mon Sep 17 00:00:00 2001 From: Blitzerr Date: Sat, 11 May 2019 20:05:24 -0700 Subject: [PATCH 86/86] fixing the ui tests, take 1 In cases the upvars were not inferred, we were exiting out of the loop earlier. This chang checks, if the upvar is inferred it prints it, or else it prints a _. --- src/librustc/util/ppaux.rs | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index e350f9d3b6ebb..6827e5c801ec3 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -1367,12 +1367,19 @@ define_print! { write!(f, "@{:?}", tcx.hir().span(node_id))?; let mut sep = " "; tcx.with_freevars(node_id, |freevars| { - for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { - print!(f, cx, - write("{}{}:", - sep, - tcx.hir().name(freevar.var_id())), - print(upvar_ty))?; + for (index, freevar) in freevars.iter().enumerate() { + if let Some(upvar_ty) = upvar_tys.get(index) { + print!(f, cx, + write("{}{}:", + sep, + tcx.hir().name(freevar.var_id())), + print(upvar_ty))?; + } else { + print!(f, cx, + write("{}{}:_", + sep, + tcx.hir().name(freevar.var_id())))?; + } sep = ", "; } Ok(()) @@ -1411,12 +1418,19 @@ define_print! { } let mut sep = " "; tcx.with_freevars(node_id, |freevars| { - for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) { - print!(f, cx, - write("{}{}:", - sep, - tcx.hir().name(freevar.var_id())), - print(upvar_ty))?; + for (index, freevar) in freevars.iter().enumerate() { + if let Some(upvar_ty) = upvar_tys.get(index) { + print!(f, cx, + write("{}{}:", + sep, + tcx.hir().name(freevar.var_id())), + print(upvar_ty))?; + } else { + print!(f, cx, + write("{}{}:_", + sep, + tcx.hir().name(freevar.var_id())))?; + } sep = ", "; } Ok(()) @@ -1428,7 +1442,7 @@ define_print! { let mut sep = " "; for (index, upvar_ty) in upvar_tys.iter().enumerate() { print!(f, cx, - write("{}{}:", sep, index), + write("{} oho {}:", sep, index), print(upvar_ty))?; sep = ", "; }