diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index a9dd234e1ad..50a398d8c63 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -1075,9 +1075,16 @@ fn scan_float_exponent(&mut self) { self.bump(); } if self.scan_digits(10, 10) == 0 { - self.err_span_(self.pos, - self.next_pos, - "expected at least one digit in exponent") + let mut err = self.struct_span_fatal( + self.pos, self.next_pos, + "expected at least one digit in exponent" + ); + if let Some(ch) = self.ch { + // check for e.g. Unicode minus '−' (Issue #49746) + unicode_chars::check_for_substitution(self, ch, &mut err); + } + err.emit(); + FatalError.raise(); } } } diff --git a/src/libsyntax/parse/lexer/unicode_chars.rs b/src/libsyntax/parse/lexer/unicode_chars.rs index 35afe8dd56d..3c0bb82212f 100644 --- a/src/libsyntax/parse/lexer/unicode_chars.rs +++ b/src/libsyntax/parse/lexer/unicode_chars.rs @@ -344,9 +344,9 @@ pub fn check_for_substitution<'a>(reader: &StringReader<'a>, match ASCII_ARRAY.iter().find(|&&(c, _)| c == ascii_char) { Some(&(ascii_char, ascii_name)) => { let msg = - format!("unicode character '{}' ({}) looks like '{}' ({}), but it's not", + format!("Unicode character '{}' ({}) looks like '{}' ({}), but it is not", ch, u_name, ascii_char, ascii_name); - err.span_help(span, &msg); + err.span_suggestion(span, &msg, ascii_char.to_string()); }, None => { let msg = format!("substitution character not found for '{}'", ch); diff --git a/src/test/ui/did_you_mean/issue-49746-unicode-confusable-in-float-literal-expt.rs b/src/test/ui/did_you_mean/issue-49746-unicode-confusable-in-float-literal-expt.rs new file mode 100644 index 00000000000..a588616772c --- /dev/null +++ b/src/test/ui/did_you_mean/issue-49746-unicode-confusable-in-float-literal-expt.rs @@ -0,0 +1,14 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +const UNIVERSAL_GRAVITATIONAL_CONSTANT = 6.674e−11; // m³⋅kg⁻¹⋅s⁻² +//~^ ERROR expected at least one digit in exponent + +fn main() {} diff --git a/src/test/ui/did_you_mean/issue-49746-unicode-confusable-in-float-literal-expt.stderr b/src/test/ui/did_you_mean/issue-49746-unicode-confusable-in-float-literal-expt.stderr new file mode 100644 index 00000000000..78eddd946bb --- /dev/null +++ b/src/test/ui/did_you_mean/issue-49746-unicode-confusable-in-float-literal-expt.stderr @@ -0,0 +1,12 @@ +error: expected at least one digit in exponent + --> $DIR/issue-49746-unicode-confusable-in-float-literal-expt.rs:11:48 + | +LL | const UNIVERSAL_GRAVITATIONAL_CONSTANT = 6.674e−11; // m³⋅kg⁻¹⋅s⁻² + | ^ +help: Unicode character '−' (Minus Sign) looks like '-' (Minus/Hyphen), but it is not + | +LL | const UNIVERSAL_GRAVITATIONAL_CONSTANT = 6.674e-11; // m³⋅kg⁻¹⋅s⁻² + | ^ + +error: aborting due to previous error +