Make underscore_literal_suffix a hard error.
It's been a warning for 5.5 years. Time to make it a hard error. Closes #42326.
This commit is contained in:
parent
d726c8467c
commit
dba6fc3ef5
@ -88,7 +88,9 @@ pub enum TokenKind {
|
|||||||
/// tokens.
|
/// tokens.
|
||||||
UnknownPrefix,
|
UnknownPrefix,
|
||||||
|
|
||||||
/// Examples: `"12_u8"`, `"1.0e-40"`, `b"123`.
|
/// Examples: `12u8`, `1.0e-40`, `b"123"`. Note that `_` is an invalid
|
||||||
|
/// suffix, but may be present here on string and float literals. Users of
|
||||||
|
/// this type will need to check for and reject that case.
|
||||||
///
|
///
|
||||||
/// See [LiteralKind] for more details.
|
/// See [LiteralKind] for more details.
|
||||||
Literal { kind: LiteralKind, suffix_start: u32 },
|
Literal { kind: LiteralKind, suffix_start: u32 },
|
||||||
@ -840,12 +842,13 @@ fn eat_float_exponent(&mut self) -> bool {
|
|||||||
self.eat_decimal_digits()
|
self.eat_decimal_digits()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eats the suffix of the literal, e.g. "_u8".
|
// Eats the suffix of the literal, e.g. "u8".
|
||||||
fn eat_literal_suffix(&mut self) {
|
fn eat_literal_suffix(&mut self) {
|
||||||
self.eat_identifier();
|
self.eat_identifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eats the identifier.
|
// Eats the identifier. Note: succeeds on `_`, which isn't a valid
|
||||||
|
// identifer.
|
||||||
fn eat_identifier(&mut self) {
|
fn eat_identifier(&mut self) {
|
||||||
if !is_id_start(self.first()) {
|
if !is_id_start(self.first()) {
|
||||||
return;
|
return;
|
||||||
|
@ -175,20 +175,10 @@ fn next_token(&mut self) -> (Token, bool) {
|
|||||||
if string == "_" {
|
if string == "_" {
|
||||||
self.sess
|
self.sess
|
||||||
.span_diagnostic
|
.span_diagnostic
|
||||||
.struct_span_warn(
|
.struct_span_err(
|
||||||
self.mk_sp(suffix_start, self.pos),
|
self.mk_sp(suffix_start, self.pos),
|
||||||
"underscore literal suffix is not allowed",
|
"underscore literal suffix is not allowed",
|
||||||
)
|
)
|
||||||
.warn(
|
|
||||||
"this was previously accepted by the compiler but is \
|
|
||||||
being phased out; it will become a hard error in \
|
|
||||||
a future release!",
|
|
||||||
)
|
|
||||||
.note(
|
|
||||||
"see issue #42326 \
|
|
||||||
<https://github.com/rust-lang/rust/issues/42326> \
|
|
||||||
for more information",
|
|
||||||
)
|
|
||||||
.emit();
|
.emit();
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,8 +1,17 @@
|
|||||||
// check-pass
|
macro_rules! sink {
|
||||||
|
($tt:tt) => {()}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _ = "Foo"_;
|
let _ = "Foo"_;
|
||||||
//~^ WARNING underscore literal suffix is not allowed
|
//~^ ERROR underscore literal suffix is not allowed
|
||||||
//~| WARNING this was previously accepted
|
|
||||||
//~| NOTE issue #42326
|
// This is ok, because `__` is a valid identifier and the macro consumes it
|
||||||
|
// before proper parsing happens.
|
||||||
|
let _ = sink!("Foo"__);
|
||||||
|
|
||||||
|
// This is not ok, even as an input to a macro, because the `_` suffix is
|
||||||
|
// never allowed.
|
||||||
|
sink!("Foo"_);
|
||||||
|
//~^ ERROR underscore literal suffix is not allowed
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
warning: underscore literal suffix is not allowed
|
error: underscore literal suffix is not allowed
|
||||||
--> $DIR/underscore-suffix-for-string.rs:4:18
|
--> $DIR/underscore-suffix-for-string.rs:6:18
|
||||||
|
|
|
|
||||||
LL | let _ = "Foo"_;
|
LL | let _ = "Foo"_;
|
||||||
| ^
|
| ^
|
||||||
|
|
||||||
|
error: underscore literal suffix is not allowed
|
||||||
|
--> $DIR/underscore-suffix-for-string.rs:15:16
|
||||||
|
|
|
|
||||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
LL | sink!("Foo"_);
|
||||||
= note: see issue #42326 <https://github.com/rust-lang/rust/issues/42326> for more information
|
| ^
|
||||||
|
|
||||||
warning: 1 warning emitted
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user