Skip to content

Commit 6e1b75b

Browse files
authored
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
2 parents 24260e5 + ea95842 commit 6e1b75b

File tree

4 files changed

+96
-20
lines changed

4 files changed

+96
-20
lines changed

src/libcore/char/methods.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,8 +1072,9 @@ impl char {
10721072
/// assert!(!esc.is_ascii_alphabetic());
10731073
/// ```
10741074
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1075+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
10751076
#[inline]
1076-
pub fn is_ascii_alphabetic(&self) -> bool {
1077+
pub const fn is_ascii_alphabetic(&self) -> bool {
10771078
self.is_ascii() && (*self as u8).is_ascii_alphabetic()
10781079
}
10791080

@@ -1104,8 +1105,9 @@ impl char {
11041105
/// assert!(!esc.is_ascii_uppercase());
11051106
/// ```
11061107
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1108+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
11071109
#[inline]
1108-
pub fn is_ascii_uppercase(&self) -> bool {
1110+
pub const fn is_ascii_uppercase(&self) -> bool {
11091111
self.is_ascii() && (*self as u8).is_ascii_uppercase()
11101112
}
11111113

@@ -1136,8 +1138,9 @@ impl char {
11361138
/// assert!(!esc.is_ascii_lowercase());
11371139
/// ```
11381140
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1141+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
11391142
#[inline]
1140-
pub fn is_ascii_lowercase(&self) -> bool {
1143+
pub const fn is_ascii_lowercase(&self) -> bool {
11411144
self.is_ascii() && (*self as u8).is_ascii_lowercase()
11421145
}
11431146

@@ -1171,8 +1174,9 @@ impl char {
11711174
/// assert!(!esc.is_ascii_alphanumeric());
11721175
/// ```
11731176
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1177+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
11741178
#[inline]
1175-
pub fn is_ascii_alphanumeric(&self) -> bool {
1179+
pub const fn is_ascii_alphanumeric(&self) -> bool {
11761180
self.is_ascii() && (*self as u8).is_ascii_alphanumeric()
11771181
}
11781182

@@ -1203,8 +1207,9 @@ impl char {
12031207
/// assert!(!esc.is_ascii_digit());
12041208
/// ```
12051209
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1210+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
12061211
#[inline]
1207-
pub fn is_ascii_digit(&self) -> bool {
1212+
pub const fn is_ascii_digit(&self) -> bool {
12081213
self.is_ascii() && (*self as u8).is_ascii_digit()
12091214
}
12101215

@@ -1238,8 +1243,9 @@ impl char {
12381243
/// assert!(!esc.is_ascii_hexdigit());
12391244
/// ```
12401245
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1246+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
12411247
#[inline]
1242-
pub fn is_ascii_hexdigit(&self) -> bool {
1248+
pub const fn is_ascii_hexdigit(&self) -> bool {
12431249
self.is_ascii() && (*self as u8).is_ascii_hexdigit()
12441250
}
12451251

@@ -1274,8 +1280,9 @@ impl char {
12741280
/// assert!(!esc.is_ascii_punctuation());
12751281
/// ```
12761282
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1283+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
12771284
#[inline]
1278-
pub fn is_ascii_punctuation(&self) -> bool {
1285+
pub const fn is_ascii_punctuation(&self) -> bool {
12791286
self.is_ascii() && (*self as u8).is_ascii_punctuation()
12801287
}
12811288

@@ -1306,8 +1313,9 @@ impl char {
13061313
/// assert!(!esc.is_ascii_graphic());
13071314
/// ```
13081315
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1316+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
13091317
#[inline]
1310-
pub fn is_ascii_graphic(&self) -> bool {
1318+
pub const fn is_ascii_graphic(&self) -> bool {
13111319
self.is_ascii() && (*self as u8).is_ascii_graphic()
13121320
}
13131321

@@ -1355,8 +1363,9 @@ impl char {
13551363
/// assert!(!esc.is_ascii_whitespace());
13561364
/// ```
13571365
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1366+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
13581367
#[inline]
1359-
pub fn is_ascii_whitespace(&self) -> bool {
1368+
pub const fn is_ascii_whitespace(&self) -> bool {
13601369
self.is_ascii() && (*self as u8).is_ascii_whitespace()
13611370
}
13621371

@@ -1389,8 +1398,9 @@ impl char {
13891398
/// assert!(esc.is_ascii_control());
13901399
/// ```
13911400
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
1401+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
13921402
#[inline]
1393-
pub fn is_ascii_control(&self) -> bool {
1403+
pub const fn is_ascii_control(&self) -> bool {
13941404
self.is_ascii() && (*self as u8).is_ascii_control()
13951405
}
13961406
}

src/libcore/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
#![feature(bound_cloned)]
7171
#![feature(cfg_target_has_atomic)]
7272
#![feature(concat_idents)]
73+
#![feature(const_ascii_ctype_on_intrinsics)]
7374
#![feature(const_alloc_layout)]
7475
#![feature(const_if_match)]
7576
#![feature(const_checked_int_methods)]

src/libcore/num/mod.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4449,8 +4449,9 @@ impl u8 {
44494449
/// assert!(!esc.is_ascii_alphabetic());
44504450
/// ```
44514451
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4452+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
44524453
#[inline]
4453-
pub fn is_ascii_alphabetic(&self) -> bool {
4454+
pub const fn is_ascii_alphabetic(&self) -> bool {
44544455
matches!(*self, b'A'..=b'Z' | b'a'..=b'z')
44554456
}
44564457

@@ -4481,8 +4482,9 @@ impl u8 {
44814482
/// assert!(!esc.is_ascii_uppercase());
44824483
/// ```
44834484
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4485+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
44844486
#[inline]
4485-
pub fn is_ascii_uppercase(&self) -> bool {
4487+
pub const fn is_ascii_uppercase(&self) -> bool {
44864488
matches!(*self, b'A'..=b'Z')
44874489
}
44884490

@@ -4513,8 +4515,9 @@ impl u8 {
45134515
/// assert!(!esc.is_ascii_lowercase());
45144516
/// ```
45154517
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4518+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
45164519
#[inline]
4517-
pub fn is_ascii_lowercase(&self) -> bool {
4520+
pub const fn is_ascii_lowercase(&self) -> bool {
45184521
matches!(*self, b'a'..=b'z')
45194522
}
45204523

@@ -4548,8 +4551,9 @@ impl u8 {
45484551
/// assert!(!esc.is_ascii_alphanumeric());
45494552
/// ```
45504553
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4554+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
45514555
#[inline]
4552-
pub fn is_ascii_alphanumeric(&self) -> bool {
4556+
pub const fn is_ascii_alphanumeric(&self) -> bool {
45534557
matches!(*self, b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z')
45544558
}
45554559

@@ -4580,8 +4584,9 @@ impl u8 {
45804584
/// assert!(!esc.is_ascii_digit());
45814585
/// ```
45824586
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4587+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
45834588
#[inline]
4584-
pub fn is_ascii_digit(&self) -> bool {
4589+
pub const fn is_ascii_digit(&self) -> bool {
45854590
matches!(*self, b'0'..=b'9')
45864591
}
45874592

@@ -4615,8 +4620,9 @@ impl u8 {
46154620
/// assert!(!esc.is_ascii_hexdigit());
46164621
/// ```
46174622
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4623+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
46184624
#[inline]
4619-
pub fn is_ascii_hexdigit(&self) -> bool {
4625+
pub const fn is_ascii_hexdigit(&self) -> bool {
46204626
matches!(*self, b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f')
46214627
}
46224628

@@ -4651,8 +4657,9 @@ impl u8 {
46514657
/// assert!(!esc.is_ascii_punctuation());
46524658
/// ```
46534659
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4660+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
46544661
#[inline]
4655-
pub fn is_ascii_punctuation(&self) -> bool {
4662+
pub const fn is_ascii_punctuation(&self) -> bool {
46564663
matches!(*self, b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~')
46574664
}
46584665

@@ -4683,8 +4690,9 @@ impl u8 {
46834690
/// assert!(!esc.is_ascii_graphic());
46844691
/// ```
46854692
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4693+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
46864694
#[inline]
4687-
pub fn is_ascii_graphic(&self) -> bool {
4695+
pub const fn is_ascii_graphic(&self) -> bool {
46884696
matches!(*self, b'!'..=b'~')
46894697
}
46904698

@@ -4732,8 +4740,9 @@ impl u8 {
47324740
/// assert!(!esc.is_ascii_whitespace());
47334741
/// ```
47344742
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4743+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
47354744
#[inline]
4736-
pub fn is_ascii_whitespace(&self) -> bool {
4745+
pub const fn is_ascii_whitespace(&self) -> bool {
47374746
matches!(*self, b'\t' | b'\n' | b'\x0C' | b'\r' | b' ')
47384747
}
47394748

@@ -4766,8 +4775,9 @@ impl u8 {
47664775
/// assert!(esc.is_ascii_control());
47674776
/// ```
47684777
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4778+
#[rustc_const_unstable(feature = "const_ascii_ctype_on_intrinsics", issue = "68983")]
47694779
#[inline]
4770-
pub fn is_ascii_control(&self) -> bool {
4780+
pub const fn is_ascii_control(&self) -> bool {
47714781
matches!(*self, b'\0'..=b'\x1F' | b'\x7F')
47724782
}
47734783
}

src/test/ui/consts/ascii_ctype.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// run-pass
2+
3+
#![feature(const_ascii_ctype_on_intrinsics)]
4+
5+
macro_rules! suite {
6+
( $( $fn:ident => [$a:ident, $A:ident, $nine:ident, $dot:ident, $space:ident]; )* ) => {
7+
$(
8+
mod $fn {
9+
const CHAR_A_LOWER: bool = 'a'.$fn();
10+
const CHAR_A_UPPER: bool = 'A'.$fn();
11+
const CHAR_NINE: bool = '9'.$fn();
12+
const CHAR_DOT: bool = '.'.$fn();
13+
const CHAR_SPACE: bool = ' '.$fn();
14+
15+
const U8_A_LOWER: bool = b'a'.$fn();
16+
const U8_A_UPPER: bool = b'A'.$fn();
17+
const U8_NINE: bool = b'9'.$fn();
18+
const U8_DOT: bool = b'.'.$fn();
19+
const U8_SPACE: bool = b' '.$fn();
20+
21+
pub fn run() {
22+
assert_eq!(CHAR_A_LOWER, $a);
23+
assert_eq!(CHAR_A_UPPER, $A);
24+
assert_eq!(CHAR_NINE, $nine);
25+
assert_eq!(CHAR_DOT, $dot);
26+
assert_eq!(CHAR_SPACE, $space);
27+
28+
assert_eq!(U8_A_LOWER, $a);
29+
assert_eq!(U8_A_UPPER, $A);
30+
assert_eq!(U8_NINE, $nine);
31+
assert_eq!(U8_DOT, $dot);
32+
assert_eq!(U8_SPACE, $space);
33+
}
34+
}
35+
)*
36+
37+
fn main() {
38+
$( $fn::run(); )*
39+
}
40+
}
41+
}
42+
43+
suite! {
44+
// 'a' 'A' '9' '.' ' '
45+
is_ascii_alphabetic => [true, true, false, false, false];
46+
is_ascii_uppercase => [false, true, false, false, false];
47+
is_ascii_lowercase => [true, false, false, false, false];
48+
is_ascii_alphanumeric => [true, true, true, false, false];
49+
is_ascii_digit => [false, false, true, false, false];
50+
is_ascii_hexdigit => [true, true, true, false, false];
51+
is_ascii_punctuation => [false, false, false, true, false];
52+
is_ascii_graphic => [true, true, true, true, false];
53+
is_ascii_whitespace => [false, false, false, false, true];
54+
is_ascii_control => [false, false, false, false, false];
55+
}

0 commit comments

Comments
 (0)