diff --git a/src/libcore/num/dec2flt/parse.rs b/src/libcore/num/dec2flt/parse.rs index 58e2a6e9bba46..414bcc874eac1 100644 --- a/src/libcore/num/dec2flt/parse.rs +++ b/src/libcore/num/dec2flt/parse.rs @@ -59,7 +59,12 @@ pub fn parse_decimal(s: &str) -> ParseResult { let s = s.as_bytes(); let (integral, s) = eat_digits(s); match s.first() { - None => Valid(Decimal::new(integral, b"", 0)), + None => { + if integral.is_empty() { + return Invalid; // No digits at all + } + Valid(Decimal::new(integral, b"", 0)) + } Some(&b'e') | Some(&b'E') => { if integral.is_empty() { return Invalid; // No digits before 'e' diff --git a/src/libcoretest/num/dec2flt/mod.rs b/src/libcoretest/num/dec2flt/mod.rs index 51fea6e017171..0c92b2fe2a7dc 100644 --- a/src/libcoretest/num/dec2flt/mod.rs +++ b/src/libcoretest/num/dec2flt/mod.rs @@ -101,6 +101,18 @@ fn lonely_dot() { assert_eq!(".".parse(), Ok(0.0)); } +#[test] +fn lonely_sign() { + assert!("+".parse::().is_err()); + assert!("-".parse::().is_err()); +} + +#[test] +fn whitespace() { + assert!(" 1.0".parse::().is_err()); + assert!("1.0 ".parse::().is_err()); +} + #[test] fn nan() { assert!("NaN".parse::().unwrap().is_nan());