From 6dfe144bdd4413ac55cbb2ad2edfb1daa0c4bf15 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 29 Jun 2020 10:28:39 +0200 Subject: [PATCH 01/12] stabilize const_nonzero_int_methods --- src/libcore/num/mod.rs | 3 ++- src/test/ui/consts/const-nonzero.rs | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index d36da90f2adc9..72bc13c8b935d 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -79,7 +79,8 @@ assert_eq!(size_of::>(), size_of::<", s /// Creates a non-zero if the given value is not zero. #[$stability] - #[rustc_const_unstable(feature = "const_nonzero_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_nonzero_int_methods", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn new(n: $Int) -> Option { if n != 0 { diff --git a/src/test/ui/consts/const-nonzero.rs b/src/test/ui/consts/const-nonzero.rs index 2160bad48074d..cf6f8c8d69a26 100644 --- a/src/test/ui/consts/const-nonzero.rs +++ b/src/test/ui/consts/const-nonzero.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(const_nonzero_int_methods)] - use std::num::NonZeroU8; const X: NonZeroU8 = unsafe { NonZeroU8::new_unchecked(5) }; From 9739b512a892628534e730ffcd9756b3218c8de8 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 29 Jun 2020 10:29:37 +0200 Subject: [PATCH 02/12] stabilize some const_checked_int_methods --- src/libcore/num/mod.rs | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 72bc13c8b935d..4647d7421b1dc 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -740,9 +740,10 @@ assert_eq!((", stringify!($SelfT), "::MAX - 2).checked_add(3), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_add(self, rhs: Self) -> Option { let (a, b) = self.overflowing_add(rhs); @@ -782,9 +783,10 @@ assert_eq!((", stringify!($SelfT), "::MIN + 2).checked_sub(3), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_sub(self, rhs: Self) -> Option { let (a, b) = self.overflowing_sub(rhs); @@ -824,9 +826,10 @@ assert_eq!(", stringify!($SelfT), "::MAX.checked_mul(2), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_mul(self, rhs: Self) -> Option { let (a, b) = self.overflowing_mul(rhs); @@ -980,7 +983,8 @@ assert_eq!(", stringify!($SelfT), "::MIN.checked_neg(), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_neg(self) -> Option { let (a, b) = self.overflowing_neg(); @@ -1002,9 +1006,10 @@ assert_eq!(0x1", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shl(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shl(rhs); @@ -1026,9 +1031,10 @@ assert_eq!(0x10", stringify!($SelfT), ".checked_shr(128), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shr(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shr(rhs); @@ -1051,7 +1057,8 @@ assert_eq!(", stringify!($SelfT), "::MIN.checked_abs(), None);", $EndFeature, " ```"), #[stable(feature = "no_panic_abs", since = "1.13.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_abs(self) -> Option { if self.is_negative() { @@ -2976,9 +2983,10 @@ Basic usage: assert_eq!((", stringify!($SelfT), "::MAX - 2).checked_add(3), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_add(self, rhs: Self) -> Option { let (a, b) = self.overflowing_add(rhs); @@ -3016,9 +3024,10 @@ Basic usage: assert_eq!(0", stringify!($SelfT), ".checked_sub(1), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_sub(self, rhs: Self) -> Option { let (a, b) = self.overflowing_sub(rhs); @@ -3056,9 +3065,10 @@ Basic usage: assert_eq!(", stringify!($SelfT), "::MAX.checked_mul(2), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_mul(self, rhs: Self) -> Option { let (a, b) = self.overflowing_mul(rhs); @@ -3206,7 +3216,8 @@ Basic usage: assert_eq!(1", stringify!($SelfT), ".checked_neg(), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_neg(self) -> Option { let (a, b) = self.overflowing_neg(); @@ -3227,9 +3238,10 @@ Basic usage: assert_eq!(0x10", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shl(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shl(rhs); @@ -3250,9 +3262,10 @@ Basic usage: assert_eq!(0x10", stringify!($SelfT), ".checked_shr(129), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shr(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shr(rhs); From c1c674c2dbfe3f6dc47d11368c1b5ee4ab008799 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 29 Jun 2020 10:36:18 +0200 Subject: [PATCH 03/12] stabilize const_saturating_int_methods --- src/libcore/lib.rs | 1 - src/libcore/num/mod.rs | 19 +++++++++++-------- src/test/ui/consts/const-int-arithmetic.rs | 1 - .../ui/consts/const-int-saturating-arith.rs | 1 - 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index aeb52bffbf24c..a156edd516056 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -78,7 +78,6 @@ #![feature(const_checked_int_methods)] #![feature(const_euclidean_int_methods)] #![feature(const_overflowing_int_methods)] -#![feature(const_saturating_int_methods)] #![feature(const_int_unchecked_arith)] #![feature(const_int_pow)] #![feature(constctlz)] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 4647d7421b1dc..c4d574c5bc59c 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -1129,7 +1129,7 @@ $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1155,7 +1155,7 @@ assert_eq!(", stringify!($SelfT), "::MAX.saturating_sub(-1), ", stringify!($Self $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1183,7 +1183,7 @@ $EndFeature, " ```"), #[stable(feature = "saturating_neg", since = "1.45.0")] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[inline] pub const fn saturating_neg(self) -> Self { intrinsics::saturating_sub(0, self) @@ -1209,7 +1209,8 @@ $EndFeature, " ```"), #[stable(feature = "saturating_neg", since = "1.45.0")] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn saturating_abs(self) -> Self { if self.is_negative() { @@ -1236,9 +1237,10 @@ assert_eq!(", stringify!($SelfT), "::MIN.saturating_mul(10), ", stringify!($Self $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn saturating_mul(self, rhs: Self) -> Self { match self.checked_mul(rhs) { @@ -3330,7 +3332,7 @@ $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[inline] pub const fn saturating_add(self, rhs: Self) -> Self { intrinsics::saturating_add(self, rhs) @@ -3352,7 +3354,7 @@ assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[inline] pub const fn saturating_sub(self, rhs: Self) -> Self { intrinsics::saturating_sub(self, rhs) @@ -3374,9 +3376,10 @@ assert_eq!((", stringify!($SelfT), "::MAX).saturating_mul(10), ", stringify!($Se "::MAX);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn saturating_mul(self, rhs: Self) -> Self { match self.checked_mul(rhs) { diff --git a/src/test/ui/consts/const-int-arithmetic.rs b/src/test/ui/consts/const-int-arithmetic.rs index 9c94551f7440e..9b2e30961aae6 100644 --- a/src/test/ui/consts/const-int-arithmetic.rs +++ b/src/test/ui/consts/const-int-arithmetic.rs @@ -3,7 +3,6 @@ #![feature(const_checked_int_methods)] #![feature(const_euclidean_int_methods)] #![feature(const_overflowing_int_methods)] -#![feature(const_saturating_int_methods)] #![feature(const_wrapping_int_methods)] use std::{i8, i128}; diff --git a/src/test/ui/consts/const-int-saturating-arith.rs b/src/test/ui/consts/const-int-saturating-arith.rs index 4718120a51bd3..7edbdd4cec5a5 100644 --- a/src/test/ui/consts/const-int-saturating-arith.rs +++ b/src/test/ui/consts/const-int-saturating-arith.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(const_saturating_int_methods)] const INT_U32_NO: u32 = (42 as u32).saturating_add(2); const INT_U32: u32 = u32::MAX.saturating_add(1); From 056d925167318636fcf975c8ffb81efebdc9bca3 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 29 Jun 2020 10:36:41 +0200 Subject: [PATCH 04/12] stabilize const_int_sign --- src/libcore/num/mod.rs | 3 ++- src/test/ui/consts/const-int-sign-rpass.rs | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index c4d574c5bc59c..00860476d9cb1 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -2203,7 +2203,8 @@ assert_eq!((-10", stringify!($SelfT), ").signum(), -1);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_int_sign", issue = "53718")] + #[rustc_const_stable(feature = "const_int_sign", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn signum(self) -> Self { match self { diff --git a/src/test/ui/consts/const-int-sign-rpass.rs b/src/test/ui/consts/const-int-sign-rpass.rs index dc46fce39a93c..63c191d422716 100644 --- a/src/test/ui/consts/const-int-sign-rpass.rs +++ b/src/test/ui/consts/const-int-sign-rpass.rs @@ -1,7 +1,5 @@ // run-pass -#![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(); From 2a84e313df095fd0e81b9348b68bd9b1d1caa551 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Mon, 29 Jun 2020 10:36:55 +0200 Subject: [PATCH 05/12] stabilize const_ascii_ctype_on_intrinsics --- src/libcore/char/methods.rs | 30 ++++++++++++++++++++---------- src/libcore/lib.rs | 1 - src/libcore/num/mod.rs | 30 ++++++++++++++++++++---------- src/test/ui/consts/ascii_ctype.rs | 2 -- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/libcore/char/methods.rs b/src/libcore/char/methods.rs index dd2f01c679f73..ffffad253215c 100644 --- a/src/libcore/char/methods.rs +++ b/src/libcore/char/methods.rs @@ -1225,7 +1225,8 @@ impl char { /// assert!(!esc.is_ascii_alphabetic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_alphabetic(&self) -> bool { match *self { @@ -1261,7 +1262,8 @@ impl char { /// assert!(!esc.is_ascii_uppercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_uppercase(&self) -> bool { match *self { @@ -1297,7 +1299,8 @@ impl char { /// assert!(!esc.is_ascii_lowercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_lowercase(&self) -> bool { match *self { @@ -1336,7 +1339,8 @@ impl char { /// assert!(!esc.is_ascii_alphanumeric()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_alphanumeric(&self) -> bool { match *self { @@ -1372,7 +1376,8 @@ impl char { /// assert!(!esc.is_ascii_digit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_digit(&self) -> bool { match *self { @@ -1411,7 +1416,8 @@ impl char { /// assert!(!esc.is_ascii_hexdigit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_hexdigit(&self) -> bool { match *self { @@ -1451,7 +1457,8 @@ impl char { /// assert!(!esc.is_ascii_punctuation()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_punctuation(&self) -> bool { match *self { @@ -1487,7 +1494,8 @@ impl char { /// assert!(!esc.is_ascii_graphic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_graphic(&self) -> bool { match *self { @@ -1540,7 +1548,8 @@ impl char { /// assert!(!esc.is_ascii_whitespace()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_whitespace(&self) -> bool { match *self { @@ -1578,7 +1587,8 @@ impl char { /// assert!(esc.is_ascii_control()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_control(&self) -> bool { match *self { diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index a156edd516056..54eb496fb6e66 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -70,7 +70,6 @@ #![feature(bound_cloned)] #![feature(cfg_target_has_atomic)] #![feature(concat_idents)] -#![feature(const_ascii_ctype_on_intrinsics)] #![feature(const_alloc_layout)] #![feature(const_discriminant)] #![cfg_attr(bootstrap, feature(const_if_match))] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 00860476d9cb1..d3dbe2443ec1d 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -4671,7 +4671,8 @@ impl u8 { /// assert!(!esc.is_ascii_alphabetic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_alphabetic(&self) -> bool { matches!(*self, b'A'..=b'Z' | b'a'..=b'z') @@ -4704,7 +4705,8 @@ impl u8 { /// assert!(!esc.is_ascii_uppercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_uppercase(&self) -> bool { matches!(*self, b'A'..=b'Z') @@ -4737,7 +4739,8 @@ impl u8 { /// assert!(!esc.is_ascii_lowercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_lowercase(&self) -> bool { matches!(*self, b'a'..=b'z') @@ -4773,7 +4776,8 @@ impl u8 { /// assert!(!esc.is_ascii_alphanumeric()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_alphanumeric(&self) -> bool { matches!(*self, b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z') @@ -4806,7 +4810,8 @@ impl u8 { /// assert!(!esc.is_ascii_digit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_digit(&self) -> bool { matches!(*self, b'0'..=b'9') @@ -4842,7 +4847,8 @@ impl u8 { /// assert!(!esc.is_ascii_hexdigit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_hexdigit(&self) -> bool { matches!(*self, b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f') @@ -4879,7 +4885,8 @@ impl u8 { /// assert!(!esc.is_ascii_punctuation()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_punctuation(&self) -> bool { matches!(*self, b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~') @@ -4912,7 +4919,8 @@ impl u8 { /// assert!(!esc.is_ascii_graphic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_graphic(&self) -> bool { matches!(*self, b'!'..=b'~') @@ -4962,7 +4970,8 @@ impl u8 { /// assert!(!esc.is_ascii_whitespace()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_whitespace(&self) -> bool { matches!(*self, b'\t' | b'\n' | b'\x0C' | b'\r' | b' ') @@ -4997,7 +5006,8 @@ impl u8 { /// assert!(esc.is_ascii_control()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] + #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn is_ascii_control(&self) -> bool { matches!(*self, b'\0'..=b'\x1F' | b'\x7F') diff --git a/src/test/ui/consts/ascii_ctype.rs b/src/test/ui/consts/ascii_ctype.rs index 25b270ee49cae..ef2f7322f2718 100644 --- a/src/test/ui/consts/ascii_ctype.rs +++ b/src/test/ui/consts/ascii_ctype.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(const_ascii_ctype_on_intrinsics)] - macro_rules! suite { ( $( $fn:ident => [$a:ident, $A:ident, $nine:ident, $dot:ident, $space:ident]; )* ) => { $( From d6cf128b45b4e7b370357b9497d68426719b0d5a Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Wed, 22 Jul 2020 09:16:16 +0200 Subject: [PATCH 06/12] mark methods as constant since 1.47.0 instead of 1.46.0 --- src/libcore/char/methods.rs | 30 ++++-------- src/libcore/num/mod.rs | 94 +++++++++++++------------------------ 2 files changed, 43 insertions(+), 81 deletions(-) diff --git a/src/libcore/char/methods.rs b/src/libcore/char/methods.rs index ffffad253215c..11c9ee495a570 100644 --- a/src/libcore/char/methods.rs +++ b/src/libcore/char/methods.rs @@ -1225,8 +1225,7 @@ impl char { /// assert!(!esc.is_ascii_alphabetic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_alphabetic(&self) -> bool { match *self { @@ -1262,8 +1261,7 @@ impl char { /// assert!(!esc.is_ascii_uppercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_uppercase(&self) -> bool { match *self { @@ -1299,8 +1297,7 @@ impl char { /// assert!(!esc.is_ascii_lowercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_lowercase(&self) -> bool { match *self { @@ -1339,8 +1336,7 @@ impl char { /// assert!(!esc.is_ascii_alphanumeric()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_alphanumeric(&self) -> bool { match *self { @@ -1376,8 +1372,7 @@ impl char { /// assert!(!esc.is_ascii_digit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_digit(&self) -> bool { match *self { @@ -1416,8 +1411,7 @@ impl char { /// assert!(!esc.is_ascii_hexdigit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_hexdigit(&self) -> bool { match *self { @@ -1457,8 +1451,7 @@ impl char { /// assert!(!esc.is_ascii_punctuation()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_punctuation(&self) -> bool { match *self { @@ -1494,8 +1487,7 @@ impl char { /// assert!(!esc.is_ascii_graphic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_graphic(&self) -> bool { match *self { @@ -1548,8 +1540,7 @@ impl char { /// assert!(!esc.is_ascii_whitespace()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_whitespace(&self) -> bool { match *self { @@ -1587,8 +1578,7 @@ impl char { /// assert!(esc.is_ascii_control()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_control(&self) -> bool { match *self { diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index d3dbe2443ec1d..2c3fee39e1afa 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -79,8 +79,7 @@ assert_eq!(size_of::>(), size_of::<", s /// Creates a non-zero if the given value is not zero. #[$stability] - #[rustc_const_stable(feature = "const_nonzero_int_methods", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_nonzero_int_methods", since = "1.47.0")] #[inline] pub const fn new(n: $Int) -> Option { if n != 0 { @@ -740,10 +739,9 @@ assert_eq!((", stringify!($SelfT), "::MAX - 2).checked_add(3), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_add(self, rhs: Self) -> Option { let (a, b) = self.overflowing_add(rhs); @@ -783,10 +781,9 @@ assert_eq!((", stringify!($SelfT), "::MIN + 2).checked_sub(3), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_sub(self, rhs: Self) -> Option { let (a, b) = self.overflowing_sub(rhs); @@ -826,10 +823,9 @@ assert_eq!(", stringify!($SelfT), "::MAX.checked_mul(2), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_mul(self, rhs: Self) -> Option { let (a, b) = self.overflowing_mul(rhs); @@ -983,8 +979,7 @@ assert_eq!(", stringify!($SelfT), "::MIN.checked_neg(), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[inline] pub const fn checked_neg(self) -> Option { let (a, b) = self.overflowing_neg(); @@ -1006,10 +1001,9 @@ assert_eq!(0x1", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shl(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shl(rhs); @@ -1031,10 +1025,9 @@ assert_eq!(0x10", stringify!($SelfT), ".checked_shr(128), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shr(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shr(rhs); @@ -1057,8 +1050,7 @@ assert_eq!(", stringify!($SelfT), "::MIN.checked_abs(), None);", $EndFeature, " ```"), #[stable(feature = "no_panic_abs", since = "1.13.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[inline] pub const fn checked_abs(self) -> Option { if self.is_negative() { @@ -1129,7 +1121,7 @@ $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1155,7 +1147,7 @@ assert_eq!(", stringify!($SelfT), "::MAX.saturating_sub(-1), ", stringify!($Self $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1183,7 +1175,7 @@ $EndFeature, " ```"), #[stable(feature = "saturating_neg", since = "1.45.0")] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[inline] pub const fn saturating_neg(self) -> Self { intrinsics::saturating_sub(0, self) @@ -1209,8 +1201,7 @@ $EndFeature, " ```"), #[stable(feature = "saturating_neg", since = "1.45.0")] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[inline] pub const fn saturating_abs(self) -> Self { if self.is_negative() { @@ -1237,10 +1228,9 @@ assert_eq!(", stringify!($SelfT), "::MIN.saturating_mul(10), ", stringify!($Self $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn saturating_mul(self, rhs: Self) -> Self { match self.checked_mul(rhs) { @@ -2203,8 +2193,7 @@ assert_eq!((-10", stringify!($SelfT), ").signum(), -1);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_int_sign", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_int_sign", since = "1.47.0")] #[inline] pub const fn signum(self) -> Self { match self { @@ -2986,10 +2975,9 @@ Basic usage: assert_eq!((", stringify!($SelfT), "::MAX - 2).checked_add(3), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_add(self, rhs: Self) -> Option { let (a, b) = self.overflowing_add(rhs); @@ -3027,10 +3015,9 @@ Basic usage: assert_eq!(0", stringify!($SelfT), ".checked_sub(1), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_sub(self, rhs: Self) -> Option { let (a, b) = self.overflowing_sub(rhs); @@ -3068,10 +3055,9 @@ Basic usage: assert_eq!(", stringify!($SelfT), "::MAX.checked_mul(2), None);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_mul(self, rhs: Self) -> Option { let (a, b) = self.overflowing_mul(rhs); @@ -3219,8 +3205,7 @@ Basic usage: assert_eq!(1", stringify!($SelfT), ".checked_neg(), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[inline] pub const fn checked_neg(self) -> Option { let (a, b) = self.overflowing_neg(); @@ -3241,10 +3226,9 @@ Basic usage: assert_eq!(0x10", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shl(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shl(rhs); @@ -3265,10 +3249,9 @@ Basic usage: assert_eq!(0x10", stringify!($SelfT), ".checked_shr(129), None);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn checked_shr(self, rhs: u32) -> Option { let (a, b) = self.overflowing_shr(rhs); @@ -3333,7 +3316,7 @@ $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[inline] pub const fn saturating_add(self, rhs: Self) -> Self { intrinsics::saturating_add(self, rhs) @@ -3355,7 +3338,7 @@ assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[inline] pub const fn saturating_sub(self, rhs: Self) -> Self { intrinsics::saturating_sub(self, rhs) @@ -3377,10 +3360,9 @@ assert_eq!((", stringify!($SelfT), "::MAX).saturating_mul(10), ", stringify!($Se "::MAX);", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.46.0")] + #[rustc_const_stable(feature = "const_saturating_int_methods", since = "1.47.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] #[inline] pub const fn saturating_mul(self, rhs: Self) -> Self { match self.checked_mul(rhs) { @@ -4671,8 +4653,7 @@ impl u8 { /// assert!(!esc.is_ascii_alphabetic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_alphabetic(&self) -> bool { matches!(*self, b'A'..=b'Z' | b'a'..=b'z') @@ -4705,8 +4686,7 @@ impl u8 { /// assert!(!esc.is_ascii_uppercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_uppercase(&self) -> bool { matches!(*self, b'A'..=b'Z') @@ -4739,8 +4719,7 @@ impl u8 { /// assert!(!esc.is_ascii_lowercase()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_lowercase(&self) -> bool { matches!(*self, b'a'..=b'z') @@ -4776,8 +4755,7 @@ impl u8 { /// assert!(!esc.is_ascii_alphanumeric()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_alphanumeric(&self) -> bool { matches!(*self, b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z') @@ -4810,8 +4788,7 @@ impl u8 { /// assert!(!esc.is_ascii_digit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_digit(&self) -> bool { matches!(*self, b'0'..=b'9') @@ -4847,8 +4824,7 @@ impl u8 { /// assert!(!esc.is_ascii_hexdigit()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_hexdigit(&self) -> bool { matches!(*self, b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f') @@ -4885,8 +4861,7 @@ impl u8 { /// assert!(!esc.is_ascii_punctuation()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_punctuation(&self) -> bool { matches!(*self, b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~') @@ -4919,8 +4894,7 @@ impl u8 { /// assert!(!esc.is_ascii_graphic()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_graphic(&self) -> bool { matches!(*self, b'!'..=b'~') @@ -4970,8 +4944,7 @@ impl u8 { /// assert!(!esc.is_ascii_whitespace()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_whitespace(&self) -> bool { matches!(*self, b'\t' | b'\n' | b'\x0C' | b'\r' | b' ') @@ -5006,8 +4979,7 @@ impl u8 { /// assert!(esc.is_ascii_control()); /// ``` #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] - #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.46.0")] - #[cfg_attr(bootstrap, allow_internal_unstable(const_if_match))] + #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = "1.47.0")] #[inline] pub const fn is_ascii_control(&self) -> bool { matches!(*self, b'\0'..=b'\x1F' | b'\x7F') From 0cf17e750d7790e0f2fc1fb184b6f917f55462ca Mon Sep 17 00:00:00 2001 From: Ximin Luo Date: Mon, 27 Jul 2020 02:42:02 +0100 Subject: [PATCH 07/12] rustbuild: fix bad usage of UNIX exec() in rustc wrapper exec never returns, it replaces the current process. so anything after it is unreachable. that's not how exec_cmd() is used in the surrounding code --- src/bootstrap/bin/rustc.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index fd36cd9bd8beb..c8ee4cb0cd2ef 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -186,13 +186,6 @@ fn main() { std::process::exit(code); } -#[cfg(unix)] -fn exec_cmd(cmd: &mut Command) -> io::Result { - use std::os::unix::process::CommandExt; - Err(cmd.exec()) -} - -#[cfg(not(unix))] fn exec_cmd(cmd: &mut Command) -> io::Result { cmd.status().map(|status| status.code().unwrap()) } From b99668bd221ea2fe99141e7de6db6a4b86efb7b6 Mon Sep 17 00:00:00 2001 From: Ximin Luo Date: Mon, 27 Jul 2020 03:00:28 +0100 Subject: [PATCH 08/12] rustbuild: rename exec_cmd -> status_code for clarity --- src/bootstrap/bin/rustc.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index c8ee4cb0cd2ef..af75faf698ecd 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -153,7 +153,7 @@ fn main() { e => e, }; println!("\nDid not run successfully: {:?}\n{:?}\n-------------", e, cmd); - exec_cmd(&mut on_fail).expect("could not run the backup command"); + status_code(&mut on_fail).expect("could not run the backup command"); std::process::exit(1); } @@ -182,10 +182,10 @@ fn main() { } } - let code = exec_cmd(&mut cmd).unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); + let code = status_code(&mut cmd).unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); std::process::exit(code); } -fn exec_cmd(cmd: &mut Command) -> io::Result { +fn status_code(cmd: &mut Command) -> io::Result { cmd.status().map(|status| status.code().unwrap()) } From 00b380b8cad11abd07299fd181173b3c9b1d869e Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 27 Jul 2020 20:41:53 +0900 Subject: [PATCH 09/12] More ensure stack to avoid segfault with increased `recursion_limit` --- .../traits/error_reporting/suggestions.rs | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs index 0632ce2319aee..432abee6d1cf9 100644 --- a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs +++ b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs @@ -7,6 +7,7 @@ use crate::autoderef::Autoderef; use crate::infer::InferCtxt; use crate::traits::normalize_projection_type; +use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_errors::{error_code, struct_span_err, Applicability, DiagnosticBuilder, Style}; use rustc_hir as hir; use rustc_hir::def::DefKind; @@ -1912,12 +1913,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { let parent_predicate = parent_trait_ref.without_const().to_predicate(tcx); if !self.is_recursive_obligation(obligated_types, &data.parent_code) { - self.note_obligation_cause_code( - err, - &parent_predicate, - &data.parent_code, - obligated_types, - ); + // #74711: avoid a stack overflow + ensure_sufficient_stack(|| { + self.note_obligation_cause_code( + err, + &parent_predicate, + &data.parent_code, + obligated_types, + ) + }); } } ObligationCauseCode::ImplDerivedObligation(ref data) => { @@ -1928,22 +1932,28 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { parent_trait_ref.skip_binder().self_ty() )); let parent_predicate = parent_trait_ref.without_const().to_predicate(tcx); - self.note_obligation_cause_code( - err, - &parent_predicate, - &data.parent_code, - obligated_types, - ); + // #74711: avoid a stack overflow + ensure_sufficient_stack(|| { + self.note_obligation_cause_code( + err, + &parent_predicate, + &data.parent_code, + obligated_types, + ) + }); } ObligationCauseCode::DerivedObligation(ref data) => { let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); let parent_predicate = parent_trait_ref.without_const().to_predicate(tcx); - self.note_obligation_cause_code( - err, - &parent_predicate, - &data.parent_code, - obligated_types, - ); + // #74711: avoid a stack overflow + ensure_sufficient_stack(|| { + self.note_obligation_cause_code( + err, + &parent_predicate, + &data.parent_code, + obligated_types, + ) + }); } ObligationCauseCode::CompareImplMethodObligation { .. } => { err.note(&format!( From cb19cdb711120123a2f5803b6c0a57012206765d Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Sat, 18 Jul 2020 22:35:50 +0200 Subject: [PATCH 10/12] name `ParamInTyOfConstArg` --- src/librustc_resolve/diagnostics.rs | 2 +- src/librustc_resolve/lib.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/librustc_resolve/diagnostics.rs b/src/librustc_resolve/diagnostics.rs index a7a005bdeb9f2..c512703b3c6b0 100644 --- a/src/librustc_resolve/diagnostics.rs +++ b/src/librustc_resolve/diagnostics.rs @@ -442,7 +442,7 @@ impl<'a> Resolver<'a> { ); err } - ResolutionError::ParamInTyOfConstArg(name) => { + ResolutionError::ParamInTyOfConstParam(name) => { let mut err = struct_span_err!( self.session, span, diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index dfc50a30c121e..3b049c6bb4add 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -215,7 +215,7 @@ enum ResolutionError<'a> { /// Error E0128: type parameters with a default cannot use forward-declared identifiers. ForwardDeclaredTyParam, // FIXME(const_generics:defaults) /// ERROR E0770: the type of const parameters must not depend on other generic parameters. - ParamInTyOfConstArg(Symbol), + ParamInTyOfConstParam(Symbol), /// Error E0735: type parameters with a default cannot use `Self` SelfInTyParamDefault, /// Error E0767: use of unreachable label @@ -2514,7 +2514,7 @@ impl<'a> Resolver<'a> { } ConstParamTyRibKind => { if record_used { - self.report_error(span, ParamInTyOfConstArg(rib_ident.name)); + self.report_error(span, ParamInTyOfConstParam(rib_ident.name)); } return Res::Err; } @@ -2545,7 +2545,7 @@ impl<'a> Resolver<'a> { if record_used { self.report_error( span, - ResolutionError::ParamInTyOfConstArg(rib_ident.name), + ResolutionError::ParamInTyOfConstParam(rib_ident.name), ); } return Res::Err; @@ -2587,7 +2587,7 @@ impl<'a> Resolver<'a> { if record_used { self.report_error( span, - ResolutionError::ParamInTyOfConstArg(rib_ident.name), + ResolutionError::ParamInTyOfConstParam(rib_ident.name), ); } return Res::Err; From 33a05b40f7bb077221e567243ada983deabd2261 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Sat, 18 Jul 2020 23:42:10 +0200 Subject: [PATCH 11/12] forbid generic params inside of anon consts in ty defaults --- src/librustc_resolve/diagnostics.rs | 11 ++++ src/librustc_resolve/late.rs | 14 ++++- src/librustc_resolve/lib.rs | 59 +++++++++++++++++-- .../params-in-ct-in-ty-param-lazy-norm.rs | 10 ++++ .../params-in-ct-in-ty-param-lazy-norm.stderr | 23 ++++++++ .../param-in-ct-in-ty-param-default.rs | 4 ++ .../param-in-ct-in-ty-param-default.stderr | 8 +++ 7 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs create mode 100644 src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr create mode 100644 src/test/ui/generic/param-in-ct-in-ty-param-default.rs create mode 100644 src/test/ui/generic/param-in-ct-in-ty-param-default.stderr diff --git a/src/librustc_resolve/diagnostics.rs b/src/librustc_resolve/diagnostics.rs index c512703b3c6b0..81e29047dc5e2 100644 --- a/src/librustc_resolve/diagnostics.rs +++ b/src/librustc_resolve/diagnostics.rs @@ -455,6 +455,17 @@ impl<'a> Resolver<'a> { ); err } + ResolutionError::ParamInAnonConstInTyDefault(name) => { + let mut err = self.session.struct_span_err( + span, + "constant values inside of type parameter defaults must not depend on generic parameters", + ); + err.span_label( + span, + format!("the anonymous constant must not depend on the parameter `{}`", name), + ); + err + } ResolutionError::SelfInTyParamDefault => { let mut err = struct_span_err!( self.session, diff --git a/src/librustc_resolve/late.rs b/src/librustc_resolve/late.rs index 4b5ab03df4327..bcd2c6c1f1c27 100644 --- a/src/librustc_resolve/late.rs +++ b/src/librustc_resolve/late.rs @@ -570,7 +570,15 @@ impl<'a, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> { if let Some(ref ty) = default { self.ribs[TypeNS].push(default_ban_rib); - self.visit_ty(ty); + self.with_rib(ValueNS, ForwardTyParamBanRibKind, |this| { + // HACK: We use an empty `ForwardTyParamBanRibKind` here which + // is only used to forbid the use of const parameters inside of + // type defaults. + // + // While the rib name doesn't really fit here, it does allow us to use the same + // code for both const and type parameters. + this.visit_ty(ty); + }); default_ban_rib = self.ribs[TypeNS].pop().unwrap(); } @@ -1081,7 +1089,9 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { fn with_constant_rib(&mut self, f: impl FnOnce(&mut Self)) { debug!("with_constant_rib"); self.with_rib(ValueNS, ConstantItemRibKind, |this| { - this.with_label_rib(ConstantItemRibKind, f); + this.with_rib(TypeNS, ConstantItemRibKind, |this| { + this.with_label_rib(ConstantItemRibKind, f); + }) }); } diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 3b049c6bb4add..234fcd789eee4 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -216,6 +216,8 @@ enum ResolutionError<'a> { ForwardDeclaredTyParam, // FIXME(const_generics:defaults) /// ERROR E0770: the type of const parameters must not depend on other generic parameters. ParamInTyOfConstParam(Symbol), + /// constant values inside of type parameter defaults must not depend on generic parameters. + ParamInAnonConstInTyDefault(Symbol), /// Error E0735: type parameters with a default cannot use `Self` SelfInTyParamDefault, /// Error E0767: use of unreachable label @@ -2526,18 +2528,40 @@ impl<'a> Resolver<'a> { } } Res::Def(DefKind::TyParam, _) | Res::SelfTy(..) => { + let mut in_ty_param_default = false; for rib in ribs { let has_generic_params = match rib.kind { NormalRibKind | ClosureOrAsyncRibKind | AssocItemRibKind | ModuleRibKind(..) - | MacroDefinition(..) - | ForwardTyParamBanRibKind - | ConstantItemRibKind => { + | MacroDefinition(..) => { // Nothing to do. Continue. continue; } + + // We only forbid constant items if we are inside of type defaults, + // for example `struct Foo()]>` + ForwardTyParamBanRibKind => { + in_ty_param_default = true; + continue; + } + ConstantItemRibKind => { + if in_ty_param_default { + if record_used { + self.report_error( + span, + ResolutionError::ParamInAnonConstInTyDefault( + rib_ident.name, + ), + ); + } + return Res::Err; + } else { + continue; + } + } + // This was an attempt to use a type parameter outside its scope. ItemRibKind(has_generic_params) => has_generic_params, FnItemRibKind => HasGenericParams::Yes, @@ -2572,15 +2596,38 @@ impl<'a> Resolver<'a> { // (spuriously) conflicting with the const param. ribs.next(); } + + let mut in_ty_param_default = false; for rib in ribs { let has_generic_params = match rib.kind { NormalRibKind | ClosureOrAsyncRibKind | AssocItemRibKind | ModuleRibKind(..) - | MacroDefinition(..) - | ForwardTyParamBanRibKind - | ConstantItemRibKind => continue, + | MacroDefinition(..) => continue, + + // We only forbid constant items if we are inside of type defaults, + // for example `struct Foo()]>` + ForwardTyParamBanRibKind => { + in_ty_param_default = true; + continue; + } + ConstantItemRibKind => { + if in_ty_param_default { + if record_used { + self.report_error( + span, + ResolutionError::ParamInAnonConstInTyDefault( + rib_ident.name, + ), + ); + } + return Res::Err; + } else { + continue; + } + } + ItemRibKind(has_generic_params) => has_generic_params, FnItemRibKind => HasGenericParams::Yes, ConstParamTyRibKind => { diff --git a/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs new file mode 100644 index 0000000000000..c118fa7acc4ec --- /dev/null +++ b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs @@ -0,0 +1,10 @@ +#![feature(const_generics)] //~ WARN the feature `const_generics` is incomplete + +struct Foo()]>(T, U); +//~^ ERROR constant values inside of type parameter defaults + +// FIXME(const_generics:defaults): We still don't know how to we deal with type defaults. +struct Bar(T); +//~^ ERROR constant values inside of type parameter defaults + +fn main() {} diff --git a/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr new file mode 100644 index 0000000000000..8e6676b01f11f --- /dev/null +++ b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr @@ -0,0 +1,23 @@ +error: constant values inside of type parameter defaults must not depend on generic parameters + --> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:3:44 + | +LL | struct Foo()]>(T, U); + | ^ the anonymous constant must not depend on the parameter `T` + +error: constant values inside of type parameter defaults must not depend on generic parameters + --> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:7:21 + | +LL | struct Bar(T); + | ^ the anonymous constant must not depend on the parameter `N` + +warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:1:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #44580 for more information + +error: aborting due to 2 previous errors; 1 warning emitted + diff --git a/src/test/ui/generic/param-in-ct-in-ty-param-default.rs b/src/test/ui/generic/param-in-ct-in-ty-param-default.rs new file mode 100644 index 0000000000000..dd89bc0f7a0ff --- /dev/null +++ b/src/test/ui/generic/param-in-ct-in-ty-param-default.rs @@ -0,0 +1,4 @@ +struct Foo()]>(T, U); +//~^ ERROR constant values inside of type parameter defaults + +fn main() {} diff --git a/src/test/ui/generic/param-in-ct-in-ty-param-default.stderr b/src/test/ui/generic/param-in-ct-in-ty-param-default.stderr new file mode 100644 index 0000000000000..ea867240269ef --- /dev/null +++ b/src/test/ui/generic/param-in-ct-in-ty-param-default.stderr @@ -0,0 +1,8 @@ +error: constant values inside of type parameter defaults must not depend on generic parameters + --> $DIR/param-in-ct-in-ty-param-default.rs:1:44 + | +LL | struct Foo()]>(T, U); + | ^ the anonymous constant must not depend on the parameter `T` + +error: aborting due to previous error + From 952fd0ce5867ea65c8d760ae66e900d49669a719 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Mon, 27 Jul 2020 16:41:27 +0200 Subject: [PATCH 12/12] update tests --- .../params-in-ct-in-ty-param-lazy-norm.rs | 1 + .../params-in-ct-in-ty-param-lazy-norm.stderr | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs index c118fa7acc4ec..84bbea5b88057 100644 --- a/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs +++ b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs @@ -6,5 +6,6 @@ struct Foo()]>(T, U); // FIXME(const_generics:defaults): We still don't know how to we deal with type defaults. struct Bar(T); //~^ ERROR constant values inside of type parameter defaults +//~| ERROR type parameters with a default fn main() {} diff --git a/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr index 8e6676b01f11f..571be91683b7c 100644 --- a/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr +++ b/src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.stderr @@ -1,3 +1,11 @@ +error: type parameters with a default must be trailing + --> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:7:12 + | +LL | struct Bar(T); + | ^ + | + = note: using type defaults and const parameters in the same parameter list is currently not permitted + error: constant values inside of type parameter defaults must not depend on generic parameters --> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:3:44 | @@ -19,5 +27,5 @@ LL | #![feature(const_generics)] = note: `#[warn(incomplete_features)]` on by default = note: see issue #44580 for more information -error: aborting due to 2 previous errors; 1 warning emitted +error: aborting due to 3 previous errors; 1 warning emitted