Apply suggested changes
This commit is contained in:
parent
75e6deefee
commit
ad2d93da1f
@ -46,6 +46,7 @@
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(int_error_matching)]
|
||||
#![recursion_limit = "512"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -50,8 +50,10 @@ fn update_limit(
|
||||
let error_str = match e.kind() {
|
||||
IntErrorKind::PosOverflow => "`limit` is too large",
|
||||
IntErrorKind::Empty => "`limit` must be a non-negative integer",
|
||||
IntErrorKind::InvalidDigit(_) => "not a valid integer",
|
||||
IntErrorKind::NegOverflow => bug!("`limit` should never underflow"),
|
||||
IntErrorKind::InvalidDigit => "not a valid integer",
|
||||
IntErrorKind::NegOverflow => {
|
||||
bug!("`limit` should never negatively underflow")
|
||||
}
|
||||
IntErrorKind::Zero => bug!("zero is a valid `limit`"),
|
||||
kind => bug!("unimplemented IntErrorKind variant: {:?}", kind),
|
||||
};
|
||||
|
@ -151,6 +151,7 @@
|
||||
#![feature(slice_ptr_get)]
|
||||
#![feature(no_niche)] // rust-lang/rust#68303
|
||||
#![feature(unsafe_block_in_unsafe_fn)]
|
||||
#![feature(int_error_matching)]
|
||||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
|
||||
#[prelude_import]
|
||||
|
@ -77,20 +77,26 @@ pub struct ParseIntError {
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(int_error_matching)]
|
||||
///
|
||||
/// # fn main() {
|
||||
/// if let Err(e) = i32::from_str_radix("a12", 10) {
|
||||
/// println!("Failed conversion to i32: {:?}", e.kind());
|
||||
/// }
|
||||
/// # }
|
||||
/// ```
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
#[unstable(
|
||||
feature = "int_error_matching",
|
||||
reason = "it can be useful to match errors when making error messages \
|
||||
for integer parsing",
|
||||
issue = "22639"
|
||||
)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
#[non_exhaustive]
|
||||
pub enum IntErrorKind {
|
||||
/// Value being parsed is empty.
|
||||
///
|
||||
/// Among other causes, this variant will be constructed when parsing an empty string.
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
Empty,
|
||||
/// Contains an invalid digit in its context.
|
||||
///
|
||||
@ -99,25 +105,26 @@ pub enum IntErrorKind {
|
||||
///
|
||||
/// This variant is also constructed when a `+` or `-` is misplaced within a string
|
||||
/// either on its own or in the middle of a number.
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
InvalidDigit(#[stable(feature = "int_error_matching", since = "1.47.0")] char),
|
||||
InvalidDigit,
|
||||
/// Integer is too large to store in target integer type.
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
PosOverflow,
|
||||
/// Integer is too small to store in target integer type.
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
NegOverflow,
|
||||
/// Value was Zero
|
||||
///
|
||||
/// This variant will be emitted when the parsing string has a value of zero, which
|
||||
/// would be illegal for non-zero types.
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
Zero,
|
||||
}
|
||||
|
||||
impl ParseIntError {
|
||||
/// Outputs the detailed cause of parsing an integer failing.
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
#[unstable(
|
||||
feature = "int_error_matching",
|
||||
reason = "it can be useful to match errors when making error messages \
|
||||
for integer parsing",
|
||||
issue = "22639"
|
||||
)]
|
||||
pub fn kind(&self) -> &IntErrorKind {
|
||||
&self.kind
|
||||
}
|
||||
@ -131,7 +138,7 @@ pub fn kind(&self) -> &IntErrorKind {
|
||||
pub fn __description(&self) -> &str {
|
||||
match self.kind {
|
||||
IntErrorKind::Empty => "cannot parse integer from empty string",
|
||||
IntErrorKind::InvalidDigit(_) => "invalid digit found in string",
|
||||
IntErrorKind::InvalidDigit => "invalid digit found in string",
|
||||
IntErrorKind::PosOverflow => "number too large to fit in target type",
|
||||
IntErrorKind::NegOverflow => "number too small to fit in target type",
|
||||
IntErrorKind::Zero => "number would be zero for non-zero type",
|
||||
|
@ -63,7 +63,12 @@ macro_rules! doc_comment {
|
||||
#[stable(feature = "try_from", since = "1.34.0")]
|
||||
pub use error::TryFromIntError;
|
||||
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
#[unstable(
|
||||
feature = "int_error_matching",
|
||||
reason = "it can be useful to match errors when making error messages \
|
||||
for integer parsing",
|
||||
issue = "22639"
|
||||
)]
|
||||
pub use error::IntErrorKind;
|
||||
|
||||
macro_rules! usize_isize_to_xe_bytes_doc {
|
||||
@ -831,7 +836,7 @@ fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, Par
|
||||
|
||||
let (is_positive, digits) = match src[0] {
|
||||
b'+' | b'-' if src[1..].is_empty() => {
|
||||
return Err(PIE { kind: InvalidDigit(src[0] as char) });
|
||||
return Err(PIE { kind: InvalidDigit });
|
||||
}
|
||||
b'+' => (true, &src[1..]),
|
||||
b'-' if is_signed_ty => (false, &src[1..]),
|
||||
@ -844,7 +849,7 @@ fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, Par
|
||||
for &c in digits {
|
||||
let x = match (c as char).to_digit(radix) {
|
||||
Some(x) => x,
|
||||
None => return Err(PIE { kind: InvalidDigit(c as char) }),
|
||||
None => return Err(PIE { kind: InvalidDigit }),
|
||||
};
|
||||
result = match result.checked_mul(radix) {
|
||||
Some(result) => result,
|
||||
@ -860,7 +865,7 @@ fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, Par
|
||||
for &c in digits {
|
||||
let x = match (c as char).to_digit(radix) {
|
||||
Some(x) => x,
|
||||
None => return Err(PIE { kind: InvalidDigit(c as char) }),
|
||||
None => return Err(PIE { kind: InvalidDigit }),
|
||||
};
|
||||
result = match result.checked_mul(radix) {
|
||||
Some(result) => result,
|
||||
|
@ -37,6 +37,7 @@
|
||||
#![feature(try_trait)]
|
||||
#![feature(slice_internals)]
|
||||
#![feature(slice_partition_dedup)]
|
||||
#![feature(int_error_matching)]
|
||||
#![feature(array_value_iter)]
|
||||
#![feature(iter_partition_in_place)]
|
||||
#![feature(iter_is_partitioned)]
|
||||
|
@ -131,7 +131,7 @@ fn test_from_str() {
|
||||
assert_eq!("0".parse::<NonZeroU8>().err().map(|e| e.kind().clone()), Some(IntErrorKind::Zero));
|
||||
assert_eq!(
|
||||
"-1".parse::<NonZeroU8>().err().map(|e| e.kind().clone()),
|
||||
Some(IntErrorKind::InvalidDigit('-'))
|
||||
Some(IntErrorKind::InvalidDigit)
|
||||
);
|
||||
assert_eq!(
|
||||
"-129".parse::<NonZeroI8>().err().map(|e| e.kind().clone()),
|
||||
|
@ -118,14 +118,14 @@ fn test_leading_plus() {
|
||||
|
||||
#[test]
|
||||
fn test_invalid() {
|
||||
test_parse::<i8>("--129", Err(IntErrorKind::InvalidDigit('-')));
|
||||
test_parse::<i8>("++129", Err(IntErrorKind::InvalidDigit('+')));
|
||||
test_parse::<u8>("Съешь", Err(IntErrorKind::InvalidDigit('Ð')));
|
||||
test_parse::<u8>("123Hello", Err(IntErrorKind::InvalidDigit('H')));
|
||||
test_parse::<i8>("--", Err(IntErrorKind::InvalidDigit('-')));
|
||||
test_parse::<i8>("-", Err(IntErrorKind::InvalidDigit('-')));
|
||||
test_parse::<i8>("+", Err(IntErrorKind::InvalidDigit('+')));
|
||||
test_parse::<u8>("-1", Err(IntErrorKind::InvalidDigit('-')));
|
||||
test_parse::<i8>("--129", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<i8>("++129", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<u8>("Съешь", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<u8>("123Hello", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<i8>("--", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<i8>("-", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<i8>("+", Err(IntErrorKind::InvalidDigit));
|
||||
test_parse::<u8>("-1", Err(IntErrorKind::InvalidDigit));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -264,6 +264,7 @@
|
||||
#![feature(global_asm)]
|
||||
#![feature(hashmap_internals)]
|
||||
#![feature(int_error_internals)]
|
||||
#![feature(int_error_matching)]
|
||||
#![feature(integer_atomics)]
|
||||
#![feature(into_future)]
|
||||
#![feature(lang_items)]
|
||||
|
@ -22,7 +22,12 @@
|
||||
#[stable(feature = "nonzero", since = "1.28.0")]
|
||||
pub use core::num::{NonZeroU128, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize};
|
||||
|
||||
#[stable(feature = "int_error_matching", since = "1.47.0")]
|
||||
#[unstable(
|
||||
feature = "int_error_matching",
|
||||
reason = "it can be useful to match errors when making error messages \
|
||||
for integer parsing",
|
||||
issue = "22639"
|
||||
)]
|
||||
pub use core::num::IntErrorKind;
|
||||
|
||||
#[cfg(test)]
|
||||
|
Loading…
Reference in New Issue
Block a user