diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-02-10 17:28:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-10 17:28:59 +0100 |
| commit | 6e1b75b7e16a5759567fa6b78f24ee9380681459 (patch) | |
| tree | cacc70619ae2e911d7b4001d29ebf5b6da83f176 | |
| parent | 24260e5baec0b1b9f9b6abf4cf4033686034df3f (diff) | |
| parent | ea958422da4f90b7158e007d5c3226c41d0a5f57 (diff) | |
| download | rust-6e1b75b7e16a5759567fa6b78f24ee9380681459.tar.gz rust-6e1b75b7e16a5759567fa6b78f24ee9380681459.zip | |
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
| -rw-r--r-- | src/libcore/char/methods.rs | 30 | ||||
| -rw-r--r-- | src/libcore/lib.rs | 1 | ||||
| -rw-r--r-- | src/libcore/num/mod.rs | 30 | ||||
| -rw-r--r-- | src/test/ui/consts/ascii_ctype.rs | 55 |
4 files changed, 96 insertions, 20 deletions
diff --git a/src/libcore/char/methods.rs b/src/libcore/char/methods.rs index c341bb552a1..2b52c48cb90 100644 --- a/src/libcore/char/methods.rs +++ b/src/libcore/char/methods.rs @@ -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() } } diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 1fd70e1a1b0..176c36664a9 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -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)] diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 3ae8f0f7870..471ab966622 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -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') } } diff --git a/src/test/ui/consts/ascii_ctype.rs b/src/test/ui/consts/ascii_ctype.rs new file mode 100644 index 00000000000..25b270ee49c --- /dev/null +++ b/src/test/ui/consts/ascii_ctype.rs @@ -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]; +} |
