]> git.lizzy.rs Git - rust.git/commitdiff
Make underscore_literal_suffix a hard error.
authorNicholas Nethercote <n.nethercote@gmail.com>
Thu, 3 Nov 2022 01:02:33 +0000 (12:02 +1100)
committerNicholas Nethercote <n.nethercote@gmail.com>
Sun, 6 Nov 2022 23:00:36 +0000 (10:00 +1100)
It's been a warning for 5.5 years. Time to make it a hard error.

Closes #42326.

compiler/rustc_lexer/src/lib.rs
compiler/rustc_parse/src/lexer/mod.rs
src/test/ui/parser/underscore-suffix-for-string.rs
src/test/ui/parser/underscore-suffix-for-string.stderr

index 51515976e4ee97371520f892b854ad076ba36fb4..dd2c09cae02fdd83f659e1591e38429854d610a9 100644 (file)
@@ -88,7 +88,9 @@ pub enum TokenKind {
     /// tokens.
     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.
     Literal { kind: LiteralKind, suffix_start: u32 },
@@ -840,12 +842,13 @@ fn eat_float_exponent(&mut self) -> bool {
         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) {
         self.eat_identifier();
     }
 
-    // Eats the identifier.
+    // Eats the identifier. Note: succeeds on `_`, which isn't a valid
+    // identifer.
     fn eat_identifier(&mut self) {
         if !is_id_start(self.first()) {
             return;
index 462bce16ad717d424c9a16185f9405d41f19646b..de8f1c00c1295747ca42619c8c52520e7e4554ac 100644 (file)
@@ -175,20 +175,10 @@ fn next_token(&mut self) -> (Token, bool) {
                         if string == "_" {
                             self.sess
                                 .span_diagnostic
-                                .struct_span_warn(
+                                .struct_span_err(
                                     self.mk_sp(suffix_start, self.pos),
                                     "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();
                             None
                         } else {
index 2e0ebe2cfa446caa5be1650e42d29b14e022d927..bd260752e04d61297208c3a850c86ecc1f003c81 100644 (file)
@@ -1,8 +1,17 @@
-// check-pass
+macro_rules! sink {
+    ($tt:tt) => {()}
+}
 
 fn main() {
     let _ = "Foo"_;
-    //~^ WARNING underscore literal suffix is not allowed
-    //~| WARNING this was previously accepted
-    //~| NOTE issue #42326
+    //~^ ERROR underscore literal suffix is not allowed
+
+    // 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
 }
index 00c7657f17bd3801eece9293703845766967536a..2fe2c130eb2116fca15fe0ab54223ffc6063412a 100644 (file)
@@ -1,11 +1,14 @@
-warning: underscore literal suffix is not allowed
-  --> $DIR/underscore-suffix-for-string.rs:4:18
+error: underscore literal suffix is not allowed
+  --> $DIR/underscore-suffix-for-string.rs:6:18
    |
 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!
-   = note: see issue #42326 <https://github.com/rust-lang/rust/issues/42326> for more information
+LL |     sink!("Foo"_);
+   |                ^
 
-warning: 1 warning emitted
+error: aborting due to 2 previous errors