Rollup merge of #68986 - ecstatic-morse:const-ascii-ctype, r=Centril
Make ASCII ctype functions unstably const Makes the following inherent methods on `u8` and `char` unstable `const fn`: * `is_ascii_alphabetic` * `is_ascii_uppercase` * `is_ascii_lowercase` * `is_ascii_alphanumeric` * `is_ascii_digit` * `is_ascii_hexdigit` * `is_ascii_punctuation` * `is_ascii_graphic` * `is_ascii_whitespace` * `is_ascii_control` cc #68983
This commit is contained in:
commit
6e1b75b7e1
@ -1072,8 +1072,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
pub const fn is_ascii_alphabetic(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_alphabetic()
|
||||
}
|
||||
|
||||
@ -1104,8 +1105,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_uppercase(&self) -> bool {
|
||||
pub const fn is_ascii_uppercase(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_uppercase()
|
||||
}
|
||||
|
||||
@ -1136,8 +1138,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_lowercase(&self) -> bool {
|
||||
pub const fn is_ascii_lowercase(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_lowercase()
|
||||
}
|
||||
|
||||
@ -1171,8 +1174,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
pub const fn is_ascii_alphanumeric(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_alphanumeric()
|
||||
}
|
||||
|
||||
@ -1203,8 +1207,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_digit(&self) -> bool {
|
||||
pub const fn is_ascii_digit(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_digit()
|
||||
}
|
||||
|
||||
@ -1238,8 +1243,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
pub const fn is_ascii_hexdigit(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_hexdigit()
|
||||
}
|
||||
|
||||
@ -1274,8 +1280,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_punctuation(&self) -> bool {
|
||||
pub const fn is_ascii_punctuation(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_punctuation()
|
||||
}
|
||||
|
||||
@ -1306,8 +1313,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_graphic(&self) -> bool {
|
||||
pub const fn is_ascii_graphic(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_graphic()
|
||||
}
|
||||
|
||||
@ -1355,8 +1363,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_whitespace(&self) -> bool {
|
||||
pub const fn is_ascii_whitespace(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_whitespace()
|
||||
}
|
||||
|
||||
@ -1389,8 +1398,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_control(&self) -> bool {
|
||||
pub const fn is_ascii_control(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_control()
|
||||
}
|
||||
}
|
||||
|
@ -70,6 +70,7 @@
|
||||
#![feature(bound_cloned)]
|
||||
#![feature(cfg_target_has_atomic)]
|
||||
#![feature(concat_idents)]
|
||||
#![feature(const_ascii_ctype_on_intrinsics)]
|
||||
#![feature(const_alloc_layout)]
|
||||
#![feature(const_if_match)]
|
||||
#![feature(const_checked_int_methods)]
|
||||
|
@ -4449,8 +4449,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
pub const fn is_ascii_alphabetic(&self) -> bool {
|
||||
matches!(*self, b'A'..=b'Z' | b'a'..=b'z')
|
||||
}
|
||||
|
||||
@ -4481,8 +4482,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_uppercase(&self) -> bool {
|
||||
pub const fn is_ascii_uppercase(&self) -> bool {
|
||||
matches!(*self, b'A'..=b'Z')
|
||||
}
|
||||
|
||||
@ -4513,8 +4515,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_lowercase(&self) -> bool {
|
||||
pub const fn is_ascii_lowercase(&self) -> bool {
|
||||
matches!(*self, b'a'..=b'z')
|
||||
}
|
||||
|
||||
@ -4548,8 +4551,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
pub const fn is_ascii_alphanumeric(&self) -> bool {
|
||||
matches!(*self, b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z')
|
||||
}
|
||||
|
||||
@ -4580,8 +4584,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_digit(&self) -> bool {
|
||||
pub const fn is_ascii_digit(&self) -> bool {
|
||||
matches!(*self, b'0'..=b'9')
|
||||
}
|
||||
|
||||
@ -4615,8 +4620,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
pub const fn is_ascii_hexdigit(&self) -> bool {
|
||||
matches!(*self, b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f')
|
||||
}
|
||||
|
||||
@ -4651,8 +4657,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_punctuation(&self) -> bool {
|
||||
pub const fn is_ascii_punctuation(&self) -> bool {
|
||||
matches!(*self, b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~')
|
||||
}
|
||||
|
||||
@ -4683,8 +4690,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_graphic(&self) -> bool {
|
||||
pub const fn is_ascii_graphic(&self) -> bool {
|
||||
matches!(*self, b'!'..=b'~')
|
||||
}
|
||||
|
||||
@ -4732,8 +4740,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_whitespace(&self) -> bool {
|
||||
pub const fn is_ascii_whitespace(&self) -> bool {
|
||||
matches!(*self, b'\t' | b'\n' | b'\x0C' | b'\r' | b' ')
|
||||
}
|
||||
|
||||
@ -4766,8 +4775,9 @@ 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")]
|
||||
#[inline]
|
||||
pub fn is_ascii_control(&self) -> bool {
|
||||
pub const fn is_ascii_control(&self) -> bool {
|
||||
matches!(*self, b'\0'..=b'\x1F' | b'\x7F')
|
||||
}
|
||||
}
|
||||
|
55
src/test/ui/consts/ascii_ctype.rs
Normal file
55
src/test/ui/consts/ascii_ctype.rs
Normal file
@ -0,0 +1,55 @@
|
||||
// run-pass
|
||||
|
||||
#![feature(const_ascii_ctype_on_intrinsics)]
|
||||
|
||||
macro_rules! suite {
|
||||
( $( $fn:ident => [$a:ident, $A:ident, $nine:ident, $dot:ident, $space:ident]; )* ) => {
|
||||
$(
|
||||
mod $fn {
|
||||
const CHAR_A_LOWER: bool = 'a'.$fn();
|
||||
const CHAR_A_UPPER: bool = 'A'.$fn();
|
||||
const CHAR_NINE: bool = '9'.$fn();
|
||||
const CHAR_DOT: bool = '.'.$fn();
|
||||
const CHAR_SPACE: bool = ' '.$fn();
|
||||
|
||||
const U8_A_LOWER: bool = b'a'.$fn();
|
||||
const U8_A_UPPER: bool = b'A'.$fn();
|
||||
const U8_NINE: bool = b'9'.$fn();
|
||||
const U8_DOT: bool = b'.'.$fn();
|
||||
const U8_SPACE: bool = b' '.$fn();
|
||||
|
||||
pub fn run() {
|
||||
assert_eq!(CHAR_A_LOWER, $a);
|
||||
assert_eq!(CHAR_A_UPPER, $A);
|
||||
assert_eq!(CHAR_NINE, $nine);
|
||||
assert_eq!(CHAR_DOT, $dot);
|
||||
assert_eq!(CHAR_SPACE, $space);
|
||||
|
||||
assert_eq!(U8_A_LOWER, $a);
|
||||
assert_eq!(U8_A_UPPER, $A);
|
||||
assert_eq!(U8_NINE, $nine);
|
||||
assert_eq!(U8_DOT, $dot);
|
||||
assert_eq!(U8_SPACE, $space);
|
||||
}
|
||||
}
|
||||
)*
|
||||
|
||||
fn main() {
|
||||
$( $fn::run(); )*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
suite! {
|
||||
// 'a' 'A' '9' '.' ' '
|
||||
is_ascii_alphabetic => [true, true, false, false, false];
|
||||
is_ascii_uppercase => [false, true, false, false, false];
|
||||
is_ascii_lowercase => [true, false, false, false, false];
|
||||
is_ascii_alphanumeric => [true, true, true, false, false];
|
||||
is_ascii_digit => [false, false, true, false, false];
|
||||
is_ascii_hexdigit => [true, true, true, false, false];
|
||||
is_ascii_punctuation => [false, false, false, true, false];
|
||||
is_ascii_graphic => [true, true, true, true, false];
|
||||
is_ascii_whitespace => [false, false, false, false, true];
|
||||
is_ascii_control => [false, false, false, false, false];
|
||||
}
|
Loading…
Reference in New Issue
Block a user