about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0799.md19
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0800.md11
-rw-r--r--compiler/rustc_error_codes/src/lib.rs2
-rw-r--r--compiler/rustc_hir_analysis/src/errors/precise_captures.rs3
-rw-r--r--compiler/rustc_resolve/src/late.rs7
-rw-r--r--tests/ui/error-codes/E0799.rs4
-rw-r--r--tests/ui/error-codes/E0799.stderr9
-rw-r--r--tests/ui/error-codes/E0800.rs4
-rw-r--r--tests/ui/error-codes/E0800.stderr9
-rw-r--r--tests/ui/impl-trait/precise-capturing/bad-params.stderr10
10 files changed, 69 insertions, 9 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0799.md b/compiler/rustc_error_codes/src/error_codes/E0799.md
new file mode 100644
index 00000000000..38ebc840604
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0799.md
@@ -0,0 +1,19 @@
+Something other than a type or const parameter has been used when one was
+expected.
+
+Erroneous code example:
+
+```compile_fail,E0799
+fn bad1() -> impl Sized + use<main> {}
+
+fn bad2(x: ()) -> impl Sized + use<x> {}
+
+fn main() {}
+```
+
+In the given examples, for `bad1`, the name `main` corresponds to a function
+rather than a type or const parameter. In `bad2`, the name `x` corresponds to
+a function argument rather than a type or const parameter.
+
+Only type and const parameters, including `Self`, may be captured by
+`use<...>` precise capturing bounds.
diff --git a/compiler/rustc_error_codes/src/error_codes/E0800.md b/compiler/rustc_error_codes/src/error_codes/E0800.md
new file mode 100644
index 00000000000..3e08cd499b7
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0800.md
@@ -0,0 +1,11 @@
+A type or const parameter of the given name is not in scope.
+
+Erroneous code examples:
+
+```compile_fail,E0800
+fn missing() -> impl Sized + use<T> {}
+```
+
+To fix this error, please verify you didn't misspell the type or const
+parameter, or double-check if you forgot to declare the parameter in
+the list of generics.
diff --git a/compiler/rustc_error_codes/src/lib.rs b/compiler/rustc_error_codes/src/lib.rs
index 150f99a3ee7..d6f0206b0de 100644
--- a/compiler/rustc_error_codes/src/lib.rs
+++ b/compiler/rustc_error_codes/src/lib.rs
@@ -538,6 +538,8 @@ E0795: 0795,
 E0796: 0796,
 E0797: 0797,
 E0798: 0798,
+E0799: 0799,
+E0800: 0800,
         );
     )
 }
diff --git a/compiler/rustc_hir_analysis/src/errors/precise_captures.rs b/compiler/rustc_hir_analysis/src/errors/precise_captures.rs
index af2bb053c0a..b6cffb90805 100644
--- a/compiler/rustc_hir_analysis/src/errors/precise_captures.rs
+++ b/compiler/rustc_hir_analysis/src/errors/precise_captures.rs
@@ -1,3 +1,4 @@
+use rustc_errors::E0799;
 use rustc_macros::Diagnostic;
 use rustc_span::{Span, Symbol};
 
@@ -43,7 +44,7 @@ pub(crate) struct BadPreciseCapture {
 }
 
 #[derive(Diagnostic)]
-#[diag(hir_analysis_precise_capture_self_alias)]
+#[diag(hir_analysis_precise_capture_self_alias, code = E0799)]
 pub(crate) struct PreciseCaptureSelfAlias {
     #[primary_span]
     pub span: Span,
diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs
index 148f55986ba..4bf2cc287da 100644
--- a/compiler/rustc_resolve/src/late.rs
+++ b/compiler/rustc_resolve/src/late.rs
@@ -557,9 +557,8 @@ impl<'a> PathSource<'a> {
         match (self, has_unexpected_resolution) {
             (PathSource::Trait(_), true) => E0404,
             (PathSource::Trait(_), false) => E0405,
-            // TODO:
-            (PathSource::Type | PathSource::PreciseCapturingArg(..), true) => E0573,
-            (PathSource::Type | PathSource::PreciseCapturingArg(..), false) => E0412,
+            (PathSource::Type, true) => E0573,
+            (PathSource::Type, false) => E0412,
             (PathSource::Struct, true) => E0574,
             (PathSource::Struct, false) => E0422,
             (PathSource::Expr(..), true) | (PathSource::Delegation, true) => E0423,
@@ -568,6 +567,8 @@ impl<'a> PathSource<'a> {
             (PathSource::Pat | PathSource::TupleStruct(..), false) => E0531,
             (PathSource::TraitItem(..), true) => E0575,
             (PathSource::TraitItem(..), false) => E0576,
+            (PathSource::PreciseCapturingArg(..), true) => E0799,
+            (PathSource::PreciseCapturingArg(..), false) => E0800,
         }
     }
 }
diff --git a/tests/ui/error-codes/E0799.rs b/tests/ui/error-codes/E0799.rs
new file mode 100644
index 00000000000..a1e5b532669
--- /dev/null
+++ b/tests/ui/error-codes/E0799.rs
@@ -0,0 +1,4 @@
+fn test() -> impl Sized + use<main> {}
+//~^ ERROR E0799
+
+fn main() {}
diff --git a/tests/ui/error-codes/E0799.stderr b/tests/ui/error-codes/E0799.stderr
new file mode 100644
index 00000000000..3639424e466
--- /dev/null
+++ b/tests/ui/error-codes/E0799.stderr
@@ -0,0 +1,9 @@
+error[E0799]: expected type or const parameter, found function `main`
+  --> $DIR/E0799.rs:1:31
+   |
+LL | fn test() -> impl Sized + use<main> {}
+   |                               ^^^^ not a type or const parameter
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0799`.
diff --git a/tests/ui/error-codes/E0800.rs b/tests/ui/error-codes/E0800.rs
new file mode 100644
index 00000000000..6112157feca
--- /dev/null
+++ b/tests/ui/error-codes/E0800.rs
@@ -0,0 +1,4 @@
+fn test() -> impl Sized + use<Missing> {}
+//~^ ERROR E0800
+
+fn main() {}
diff --git a/tests/ui/error-codes/E0800.stderr b/tests/ui/error-codes/E0800.stderr
new file mode 100644
index 00000000000..282981a9173
--- /dev/null
+++ b/tests/ui/error-codes/E0800.stderr
@@ -0,0 +1,9 @@
+error[E0800]: cannot find type or const parameter `Missing` in this scope
+  --> $DIR/E0800.rs:1:31
+   |
+LL | fn test() -> impl Sized + use<Missing> {}
+   |                               ^^^^^^^ not found in this scope
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0800`.
diff --git a/tests/ui/impl-trait/precise-capturing/bad-params.stderr b/tests/ui/impl-trait/precise-capturing/bad-params.stderr
index 94577881d6c..07ada8da300 100644
--- a/tests/ui/impl-trait/precise-capturing/bad-params.stderr
+++ b/tests/ui/impl-trait/precise-capturing/bad-params.stderr
@@ -1,4 +1,4 @@
-error[E0412]: cannot find type or const parameter `T` in this scope
+error[E0800]: cannot find type or const parameter `T` in this scope
   --> $DIR/bad-params.rs:1:34
    |
 LL | fn missing() -> impl Sized + use<T> {}
@@ -17,19 +17,19 @@ LL | fn missing_self() -> impl Sized + use<Self> {}
    |    |
    |    `Self` not allowed in a function
 
-error[E0573]: expected type or const parameter, found function `hello`
+error[E0799]: expected type or const parameter, found function `hello`
   --> $DIR/bad-params.rs:13:32
    |
 LL | fn hello() -> impl Sized + use<hello> {}
    |                                ^^^^^ not a type or const parameter
 
-error[E0573]: expected type or const parameter, found local variable `x`
+error[E0799]: expected type or const parameter, found local variable `x`
   --> $DIR/bad-params.rs:16:35
    |
 LL | fn arg(x: ()) -> impl Sized + use<x> {}
    |                                   ^ not a type or const parameter
 
-error: `Self` can't be captured in `use<...>` precise captures list, since it is an alias
+error[E0799]: `Self` can't be captured in `use<...>` precise captures list, since it is an alias
   --> $DIR/bad-params.rs:9:48
    |
 LL | impl MyType {
@@ -39,5 +39,5 @@ LL |     fn self_is_not_param() -> impl Sized + use<Self> {}
 
 error: aborting due to 5 previous errors
 
-Some errors have detailed explanations: E0411, E0412, E0573.
+Some errors have detailed explanations: E0411, E0799, E0800.
 For more information about an error, try `rustc --explain E0411`.