about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-04-24 05:16:22 +0200
committerGitHub <noreply@github.com>2019-04-24 05:16:22 +0200
commiteb4860c77c62450f721cdefab22a2bde3ae62ec0 (patch)
tree85656a3ed4c614715eda45e1e98146a7c9d42bea /src/libsyntax/parse
parent31a537184c86ee2e9231a9b82423243c1e440e89 (diff)
parent4c015739eadc1419b92a6a399ad145960d08f281 (diff)
downloadrust-eb4860c77c62450f721cdefab22a2bde3ae62ec0.tar.gz
rust-eb4860c77c62450f721cdefab22a2bde3ae62ec0.zip
Rollup merge of #60186 - estebank:accept-suffix, r=nikomatsakis
Temporarily accept [i|u][32|size] suffixes on a tuple index and warn

Fix #60138.

#59553 will need to be kept open to track the change back to rejecting this code a few versions down thee line.
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 53dab510ac3..75d687be280 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1145,9 +1145,34 @@ impl<'a> Parser<'a> {
                 if text.is_empty() {
                     self.span_bug(sp, "found empty literal suffix in Some")
                 }
-                self.struct_span_err(sp, &format!("suffixes on {} are invalid", kind))
-                    .span_label(sp, format!("invalid suffix `{}`", text))
-                    .emit();
+                let mut err = if kind == "a tuple index" &&
+                    ["i32", "u32", "isize", "usize"].contains(&text.to_string().as_str())
+                {
+                    // #59553: warn instead of reject out of hand to allow the fix to percolate
+                    // through the ecosystem when people fix their macros
+                    let mut err = self.struct_span_warn(
+                        sp,
+                        &format!("suffixes on {} are invalid", kind),
+                    );
+                    err.note(&format!(
+                        "`{}` is *temporarily* accepted on tuple index fields as it was \
+                         incorrectly accepted on stable for a few releases",
+                        text,
+                    ));
+                    err.help(
+                        "on proc macros, you'll want to use `syn::Index::from` or \
+                         `proc_macro::Literal::*_unsuffixed` for code that will desugar \
+                         to tuple field access",
+                    );
+                    err.note(
+                        "for more context, see https://github.com/rust-lang/rust/issues/60210",
+                    );
+                    err
+                } else {
+                    self.struct_span_err(sp, &format!("suffixes on {} are invalid", kind))
+                };
+                err.span_label(sp, format!("invalid suffix `{}`", text));
+                err.emit();
             }
         }
     }
@@ -1455,6 +1480,9 @@ impl<'a> Parser<'a> {
     fn struct_span_err<S: Into<MultiSpan>>(&self, sp: S, m: &str) -> DiagnosticBuilder<'a> {
         self.sess.span_diagnostic.struct_span_err(sp, m)
     }
+    fn struct_span_warn<S: Into<MultiSpan>>(&self, sp: S, m: &str) -> DiagnosticBuilder<'a> {
+        self.sess.span_diagnostic.struct_span_warn(sp, m)
+    }
     crate fn span_bug<S: Into<MultiSpan>>(&self, sp: S, m: &str) -> ! {
         self.sess.span_diagnostic.span_bug(sp, m)
     }