about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2022-03-11 15:26:19 -0700
committerMichael Howell <michael@notriddle.com>2022-03-11 15:35:18 -0700
commit7e323370b351ab138caa90cddb0e9811a4e8439d (patch)
treeb0fe363d415fb18615837d169a7048b4f5b6af64
parentc9b45e601065c3fb71a4f67481e912391d075621 (diff)
downloadrust-7e323370b351ab138caa90cddb0e9811a4e8439d.tar.gz
rust-7e323370b351ab138caa90cddb0e9811a4e8439d.zip
diagnostics: single colon within `<>` probably, not type ascription
Fixes #94812
-rw-r--r--compiler/rustc_parse/src/parser/diagnostics.rs13
-rw-r--r--src/test/ui/generics/single-colon-path-not-const-generics.rs13
-rw-r--r--src/test/ui/generics/single-colon-path-not-const-generics.stderr11
3 files changed, 37 insertions, 0 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index 40daf4eb28f..5b398a51318 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -2073,6 +2073,19 @@ impl<'a> Parser<'a> {
                     let value = self.mk_expr_err(start.to(expr.span));
                     err.emit();
                     return Ok(GenericArg::Const(AnonConst { id: ast::DUMMY_NODE_ID, value }));
+                } else if token::Colon == snapshot.token.kind
+                    && expr.span.lo() == snapshot.token.span.hi()
+                    && matches!(expr.kind, ExprKind::Path(..))
+                {
+                    // Find a mistake like "foo::var:A".
+                    err.span_suggestion(
+                        snapshot.token.span,
+                        "you might have meant to write a path",
+                        "::".to_string(),
+                        Applicability::MaybeIncorrect,
+                    );
+                    err.emit();
+                    return Ok(GenericArg::Type(self.mk_ty(start.to(expr.span), TyKind::Err)));
                 } else if token::Comma == self.token.kind || self.token.kind.should_end_const_arg()
                 {
                     // Avoid the following output by checking that we consumed a full const arg:
diff --git a/src/test/ui/generics/single-colon-path-not-const-generics.rs b/src/test/ui/generics/single-colon-path-not-const-generics.rs
new file mode 100644
index 00000000000..d8ed8fbfe72
--- /dev/null
+++ b/src/test/ui/generics/single-colon-path-not-const-generics.rs
@@ -0,0 +1,13 @@
+pub mod foo {
+    pub mod bar {
+        pub struct A;
+    }
+}
+
+pub struct Foo {
+  a: Vec<foo::bar:A>,
+  //~^ ERROR expected
+  //~| HELP you might have meant to write a path
+}
+
+fn main() {}
diff --git a/src/test/ui/generics/single-colon-path-not-const-generics.stderr b/src/test/ui/generics/single-colon-path-not-const-generics.stderr
new file mode 100644
index 00000000000..d509fb7aeaa
--- /dev/null
+++ b/src/test/ui/generics/single-colon-path-not-const-generics.stderr
@@ -0,0 +1,11 @@
+error: expected one of `,` or `>`, found `:`
+  --> $DIR/single-colon-path-not-const-generics.rs:8:18
+   |
+LL |   a: Vec<foo::bar:A>,
+   |                  ^
+   |                  |
+   |                  expected one of `,` or `>`
+   |                  help: you might have meant to write a path: `::`
+
+error: aborting due to previous error
+