about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_parse/parser/path.rs38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/librustc_parse/parser/path.rs b/src/librustc_parse/parser/path.rs
index a4541046c6c..027380eaa2a 100644
--- a/src/librustc_parse/parser/path.rs
+++ b/src/librustc_parse/parser/path.rs
@@ -71,21 +71,7 @@ impl<'a> Parser<'a> {
             debug!("parse_qpath: (decrement) count={:?}", self.unmatched_angle_bracket_count);
         }
 
-        if self.token.kind == token::Colon {
-            // <Bar as Baz<T>>:Qux
-            //                ^
-            self.bump();
-
-            self.diagnostic()
-                .struct_span_err(self.prev_span, "found single colon where type path was expected")
-                .span_suggestion(
-                    self.prev_span,
-                    "use double colon",
-                    "::".to_string(),
-                    Applicability::MachineApplicable,
-                )
-                .emit();
-        } else {
+        if !self.recover_colon_before_qpath_proj() {
             self.expect(&token::ModSep)?;
         }
 
@@ -95,6 +81,28 @@ impl<'a> Parser<'a> {
         Ok((qself, Path { segments: path.segments, span: lo.to(self.prev_span) }))
     }
 
+    fn recover_colon_before_qpath_proj(&mut self) -> bool {
+        if self.token.kind != token::Colon {
+            return false;
+        }
+
+        // <Bar as Baz<T>>:Qux
+        //                ^
+        self.bump();
+
+        self.diagnostic()
+            .struct_span_err(self.prev_span, "found single colon where type path was expected")
+            .span_suggestion(
+                self.prev_span,
+                "use double colon",
+                "::".to_string(),
+                Applicability::MachineApplicable,
+            )
+            .emit();
+
+        true
+    }
+
     /// Parses simple paths.
     ///
     /// `path = [::] segment+`