From ae8b4607c6c92164dce2e92f9496de189a43bc44 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sun, 15 Sep 2024 17:34:25 -0400 Subject: [PATCH] Introduce distinct error codes for precise capturing --- .../src/error_codes/E0799.md | 19 +++++++++++++++++++ .../src/error_codes/E0800.md | 11 +++++++++++ compiler/rustc_error_codes/src/lib.rs | 2 ++ .../src/errors/precise_captures.rs | 3 ++- compiler/rustc_resolve/src/late.rs | 7 ++++--- tests/ui/error-codes/E0799.rs | 4 ++++ tests/ui/error-codes/E0799.stderr | 9 +++++++++ tests/ui/error-codes/E0800.rs | 4 ++++ tests/ui/error-codes/E0800.stderr | 9 +++++++++ .../precise-capturing/bad-params.stderr | 10 +++++----- 10 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 compiler/rustc_error_codes/src/error_codes/E0799.md create mode 100644 compiler/rustc_error_codes/src/error_codes/E0800.md create mode 100644 tests/ui/error-codes/E0799.rs create mode 100644 tests/ui/error-codes/E0799.stderr create mode 100644 tests/ui/error-codes/E0800.rs create mode 100644 tests/ui/error-codes/E0800.stderr 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
{} + +fn bad2(x: ()) -> impl Sized + use {} + +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 {} +``` + +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 @@ macro_rules! error_codes { 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 @@ fn error_code(self, has_unexpected_resolution: bool) -> ErrCode { 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 @@ fn error_code(self, has_unexpected_resolution: bool) -> ErrCode { (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
{} +//~^ 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
{} + | ^^^^ 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 {} +//~^ 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 {} + | ^^^^^^^ 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 {} @@ -17,19 +17,19 @@ LL | fn missing_self() -> impl Sized + use {} | | | `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 {} | ^^^^^ 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 {} | ^ 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 {} 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`.