in which we check for confusable Unicodepoints in float literal exponent

The `FatalError.raise()` might seem unmotivated (in most places in
the compiler, `err.emit()` suffices), but it's actually used to
maintain behavior (viz., stop lexing, don't emit potentially spurious
errors looking for the next token after the bad Unicodepoint in the
exponent): the previous revision's `self.err_span_` ultimately calls
`Handler::emit`, which aborts if the `Handler`'s continue_after_error
flag is set, which seems to typically be true during lexing (see
`phase_1_parse_input` and and how `CompileController::basic` has
`continue_parse_after_error: false` in librustc_driver).

Also, let's avoid apostrophes in error messages (the present author
would argue that users expect a reassuringly detached, formal,
above-it-all tone from a Serious tool like a compiler), and use an
RLS-friendly structured suggestion.

Resolves #49746.
This commit is contained in:
Zack M. Davis 2018-04-15 14:30:23 -07:00 committed by Esteban Küber
parent 7426f5ccf7
commit 6437295b17
4 changed files with 38 additions and 5 deletions

View File

@ -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();
}
}
}

View File

@ -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);

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
const UNIVERSAL_GRAVITATIONAL_CONSTANT = 6.674e11; // m³⋅kg⁻¹⋅s⁻²
//~^ ERROR expected at least one digit in exponent
fn main() {}

View File

@ -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.674e11; // 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