about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-08-10 09:07:56 +0900
committerGitHub <noreply@github.com>2020-08-10 09:07:56 +0900
commitd8ac403fd1c68660b6898777546cc191616cd48d (patch)
tree042ea91c842c587d810e93fc70db2f8d5bb4ac9b
parent968740a3a34f245ca95eeb61f089fa2d09b1b0cc (diff)
parent4dbe0ac9287d723ae9d39e3c2b90930813eed4a3 (diff)
downloadrust-d8ac403fd1c68660b6898777546cc191616cd48d.tar.gz
rust-d8ac403fd1c68660b6898777546cc191616cd48d.zip
Rollup merge of #75320 - estebank:js-for-i-of-x, r=davidtwco
Detect likely `for foo of bar` JS syntax

Fix #75311.
-rw-r--r--src/librustc_parse/parser/expr.rs19
-rw-r--r--src/librustc_span/symbol.rs1
-rw-r--r--src/test/ui/issues/issue-40782.fixed2
-rw-r--r--src/test/ui/issues/issue-40782.rs2
-rw-r--r--src/test/ui/issues/issue-40782.stderr8
5 files changed, 25 insertions, 7 deletions
diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs
index 3aec300d86d..55a134ae091 100644
--- a/src/librustc_parse/parser/expr.rs
+++ b/src/librustc_parse/parser/expr.rs
@@ -1733,13 +1733,20 @@ impl<'a> Parser<'a> {
         Ok(self.mk_expr(lo.to(self.prev_token.span), kind, attrs))
     }
 
-    fn error_missing_in_for_loop(&self) {
-        let in_span = self.prev_token.span.between(self.token.span);
-        self.struct_span_err(in_span, "missing `in` in `for` loop")
+    fn error_missing_in_for_loop(&mut self) {
+        let (span, msg, sugg) = if self.token.is_ident_named(sym::of) {
+            // Possibly using JS syntax (#75311).
+            let span = self.token.span;
+            self.bump();
+            (span, "try using `in` here instead", "in")
+        } else {
+            (self.prev_token.span.between(self.token.span), "try adding `in` here", " in ")
+        };
+        self.struct_span_err(span, "missing `in` in `for` loop")
             .span_suggestion_short(
-                in_span,
-                "try adding `in` here",
-                " in ".into(),
+                span,
+                msg,
+                sugg.into(),
                 // Has been misleading, at least in the past (closed Issue #48492).
                 Applicability::MaybeIncorrect,
             )
diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs
index ca9702784a2..caa6de09664 100644
--- a/src/librustc_span/symbol.rs
+++ b/src/librustc_span/symbol.rs
@@ -737,6 +737,7 @@ symbols! {
         not,
         note,
         object_safe_for_dispatch,
+        of,
         offset,
         omit_gdb_pretty_printer_section,
         on,
diff --git a/src/test/ui/issues/issue-40782.fixed b/src/test/ui/issues/issue-40782.fixed
index d61c248c6ec..305a9c3292a 100644
--- a/src/test/ui/issues/issue-40782.fixed
+++ b/src/test/ui/issues/issue-40782.fixed
@@ -3,4 +3,6 @@
 fn main() {
     for _i in 0..2 { //~ ERROR missing `in`
     }
+    for _i in 0..2 { //~ ERROR missing `in`
+    }
 }
diff --git a/src/test/ui/issues/issue-40782.rs b/src/test/ui/issues/issue-40782.rs
index 3688c69fbc6..43460ec1535 100644
--- a/src/test/ui/issues/issue-40782.rs
+++ b/src/test/ui/issues/issue-40782.rs
@@ -3,4 +3,6 @@
 fn main() {
     for _i 0..2 { //~ ERROR missing `in`
     }
+    for _i of 0..2 { //~ ERROR missing `in`
+    }
 }
diff --git a/src/test/ui/issues/issue-40782.stderr b/src/test/ui/issues/issue-40782.stderr
index 9d7776f32b3..81f419bf687 100644
--- a/src/test/ui/issues/issue-40782.stderr
+++ b/src/test/ui/issues/issue-40782.stderr
@@ -4,5 +4,11 @@ error: missing `in` in `for` loop
 LL |     for _i 0..2 {
    |           ^ help: try adding `in` here
 
-error: aborting due to previous error
+error: missing `in` in `for` loop
+  --> $DIR/issue-40782.rs:6:12
+   |
+LL |     for _i of 0..2 {
+   |            ^^ help: try using `in` here instead
+
+error: aborting due to 2 previous errors