about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <yuki.okushi@huawei.com>2021-07-29 05:49:56 +0900
committerYuki Okushi <yuki.okushi@huawei.com>2021-09-17 14:02:00 +0900
commit9342be5538ad5c97e8d2496e1cbbf2530d377e5e (patch)
tree1d3514980dcc024dfabfa556e0aa7feafcd25954
parent78a46efff06558674b51c10d8d81758285746ab5 (diff)
downloadrust-9342be5538ad5c97e8d2496e1cbbf2530d377e5e.tar.gz
rust-9342be5538ad5c97e8d2496e1cbbf2530d377e5e.zip
Recover invalid assoc type bounds using `==`
-rw-r--r--compiler/rustc_parse/src/parser/diagnostics.rs14
-rw-r--r--src/test/ui/const-generics/issues/issue-87493.rs14
-rw-r--r--src/test/ui/const-generics/issues/issue-87493.stderr26
3 files changed, 53 insertions, 1 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index 4fccfc287fd..39651bd5e67 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -1955,7 +1955,19 @@ impl<'a> Parser<'a> {
         }
         match self.parse_expr_res(Restrictions::CONST_EXPR, None) {
             Ok(expr) => {
-                if token::Comma == self.token.kind || self.token.kind.should_end_const_arg() {
+                // Find a mistake like `MyTrait<Assoc == S::Assoc>`.
+                if token::EqEq == snapshot.token.kind {
+                    err.span_suggestion(
+                        snapshot.token.span,
+                        "replace `==` with `=`",
+                        "=".to_string(),
+                        Applicability::MaybeIncorrect,
+                    );
+                    let value = self.mk_expr_err(expr.span);
+                    err.emit();
+                    return Ok(GenericArg::Const(AnonConst { id: ast::DUMMY_NODE_ID, value }));
+                } 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:
                     // help: expressions must be enclosed in braces to be used as const generic
                     //       arguments
diff --git a/src/test/ui/const-generics/issues/issue-87493.rs b/src/test/ui/const-generics/issues/issue-87493.rs
new file mode 100644
index 00000000000..d8599ab22a3
--- /dev/null
+++ b/src/test/ui/const-generics/issues/issue-87493.rs
@@ -0,0 +1,14 @@
+pub trait MyTrait {
+    type Assoc;
+}
+
+pub fn foo<S, T>(_s: S, _t: T)
+where
+    S: MyTrait,
+    T: MyTrait<Assoc == S::Assoc>,
+    //~^ ERROR: expected one of `,` or `>`, found `==`
+    //~| ERROR: this trait takes 0 generic arguments but 1 generic argument was supplied
+{
+}
+
+fn main() {}
diff --git a/src/test/ui/const-generics/issues/issue-87493.stderr b/src/test/ui/const-generics/issues/issue-87493.stderr
new file mode 100644
index 00000000000..b1ac08b51b5
--- /dev/null
+++ b/src/test/ui/const-generics/issues/issue-87493.stderr
@@ -0,0 +1,26 @@
+error: expected one of `,` or `>`, found `==`
+  --> $DIR/issue-87493.rs:8:22
+   |
+LL |     T: MyTrait<Assoc == S::Assoc>,
+   |                      ^^
+   |                      |
+   |                      expected one of `,` or `>`
+   |                      help: replace `==` with `=`: `=`
+
+error[E0107]: this trait takes 0 generic arguments but 1 generic argument was supplied
+  --> $DIR/issue-87493.rs:8:8
+   |
+LL |     T: MyTrait<Assoc == S::Assoc>,
+   |        ^^^^^^^------------------- help: remove these generics
+   |        |
+   |        expected 0 generic arguments
+   |
+note: trait defined here, with 0 generic parameters
+  --> $DIR/issue-87493.rs:1:11
+   |
+LL | pub trait MyTrait {
+   |           ^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0107`.