From ba2600e98e7af4f535af49d6612d0884d2069a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 3 Nov 2025 01:44:52 +0000 Subject: [PATCH 1/4] Suggest appropriate type instead of `Self` in E0401 ``` error[E0401]: can't use `Self` from outer item --> $DIR/E0401.rs:22:25 | LL | impl Iterator for A { | ---- `Self` type implicitly declared here, by this `impl` ... LL | fn helper(sel: &Self) -> u8 { | ------ ^^^^ use of `Self` from outer item | | | `Self` used in this inner function | help: refer to the type directly here instead | LL - fn helper(sel: &Self) -> u8 { LL + fn helper(sel: &A) -> u8 { | ``` --- compiler/rustc_resolve/src/diagnostics.rs | 4 +++- compiler/rustc_resolve/src/errors.rs | 16 ++++++++++++++-- compiler/rustc_resolve/src/ident.rs | 10 ++++++++++ compiler/rustc_resolve/src/late.rs | 2 +- compiler/rustc_resolve/src/lib.rs | 1 + tests/ui/error-codes/E0401.stderr | 12 ++++++++---- tests/ui/resolve/use-self-in-inner-fn.stderr | 12 ++++++++---- 7 files changed, 45 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 3020ecb6e7113..2f4a18f9cfa6b 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -558,6 +558,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { has_generic_params, def_kind, inner_item, + current_self_ty, } => { use errs::GenericParamsFromOuterItemLabel as Label; let static_or_const = match def_kind { @@ -595,7 +596,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { sm, self.def_span(def_id), ))); - err.refer_to_type_directly = Some(span); + err.refer_to_type_directly = + current_self_ty.map(|snippet| errs::UseTypeDirectly { span, snippet }); return self.dcx().create_err(err); } Res::Def(DefKind::TyParam, def_id) => { diff --git a/compiler/rustc_resolve/src/errors.rs b/compiler/rustc_resolve/src/errors.rs index 5c5938a3260ed..165a17e5c11dc 100644 --- a/compiler/rustc_resolve/src/errors.rs +++ b/compiler/rustc_resolve/src/errors.rs @@ -17,8 +17,8 @@ pub(crate) struct GenericParamsFromOuterItem { pub(crate) span: Span, #[subdiagnostic] pub(crate) label: Option, - #[label(resolve_refer_to_type_directly)] - pub(crate) refer_to_type_directly: Option, + #[subdiagnostic] + pub(crate) refer_to_type_directly: Option, #[subdiagnostic] pub(crate) sugg: Option, #[subdiagnostic] @@ -68,6 +68,18 @@ pub(crate) struct GenericParamsFromOuterItemSugg { pub(crate) span: Span, pub(crate) snippet: String, } +#[derive(Subdiagnostic)] +#[suggestion( + resolve_refer_to_type_directly, + code = "{snippet}", + applicability = "maybe-incorrect", + style = "verbose" +)] +pub(crate) struct UseTypeDirectly { + #[primary_span] + pub(crate) span: Span, + pub(crate) snippet: String, +} #[derive(Diagnostic)] #[diag(resolve_name_is_already_used_as_generic_parameter, code = E0403)] diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index 278c0fe35b7d8..864c3306929eb 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -1415,6 +1415,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { has_generic_params, def_kind, inner_item: item, + current_self_ty: diag_metadata + .and_then(|m| m.current_self_type.as_ref()) + .and_then(|ty| { + self.tcx.sess.source_map().span_to_snippet(ty.span).ok() + }), }, ); } @@ -1503,6 +1508,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { has_generic_params, def_kind, inner_item: item, + current_self_ty: diag_metadata + .and_then(|m| m.current_self_type.as_ref()) + .and_then(|ty| { + self.tcx.sess.source_map().span_to_snippet(ty.span).ok() + }), }, ); } diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 0b41a7952797c..41c2e908d084d 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -675,7 +675,7 @@ pub(crate) struct DiagMetadata<'ast> { current_trait_assoc_items: Option<&'ast [Box]>, /// The current self type if inside an impl (used for better errors). - current_self_type: Option, + pub(crate) current_self_type: Option, /// The current self item if inside an ADT (used for better errors). current_self_item: Option, diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index 6b671df433b3d..c7f65ff03f823 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -246,6 +246,7 @@ enum ResolutionError<'ra> { has_generic_params: HasGenericParams, def_kind: DefKind, inner_item: Option<(Span, ast::ItemKind)>, + current_self_ty: Option, }, /// Error E0403: the name is already used for a type or const parameter in this generic /// parameter list. diff --git a/tests/ui/error-codes/E0401.stderr b/tests/ui/error-codes/E0401.stderr index 8daaf09df1592..6856d390efee6 100644 --- a/tests/ui/error-codes/E0401.stderr +++ b/tests/ui/error-codes/E0401.stderr @@ -37,11 +37,15 @@ LL | impl Iterator for A { | ---- `Self` type implicitly declared here, by this `impl` ... LL | fn helper(sel: &Self) -> u8 { - | ------ ^^^^ - | | | - | | use of `Self` from outer item - | | refer to the type directly here instead + | ------ ^^^^ use of `Self` from outer item + | | | `Self` used in this inner function + | +help: refer to the type directly here instead + | +LL - fn helper(sel: &Self) -> u8 { +LL + fn helper(sel: &A) -> u8 { + | error: aborting due to 3 previous errors diff --git a/tests/ui/resolve/use-self-in-inner-fn.stderr b/tests/ui/resolve/use-self-in-inner-fn.stderr index 645875f6e726d..7f5217825c116 100644 --- a/tests/ui/resolve/use-self-in-inner-fn.stderr +++ b/tests/ui/resolve/use-self-in-inner-fn.stderr @@ -5,11 +5,15 @@ LL | impl A { | ---- `Self` type implicitly declared here, by this `impl` ... LL | fn peach(this: &Self) { - | ----- ^^^^ - | | | - | | use of `Self` from outer item - | | refer to the type directly here instead + | ----- ^^^^ use of `Self` from outer item + | | | `Self` used in this inner function + | +help: refer to the type directly here instead + | +LL - fn peach(this: &Self) { +LL + fn peach(this: &A) { + | error: aborting due to 1 previous error From 4af32ca72f2d76d03f645e93a39da07637cca2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 3 Nov 2025 01:53:17 +0000 Subject: [PATCH 2/4] Add test --- tests/ui/resolve/use-self-in-inner-fn.rs | 23 +++++++++++++++++++- tests/ui/resolve/use-self-in-inner-fn.stderr | 20 ++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/ui/resolve/use-self-in-inner-fn.rs b/tests/ui/resolve/use-self-in-inner-fn.rs index ed64ee885271c..1a11fe3a21b6d 100644 --- a/tests/ui/resolve/use-self-in-inner-fn.rs +++ b/tests/ui/resolve/use-self-in-inner-fn.rs @@ -7,9 +7,30 @@ impl A { //~^ ERROR can't use `Self` from outer item //~| NOTE use of `Self` from outer item //~| NOTE `Self` used in this inner function - //~| NOTE refer to the type directly here instead + //~| HELP refer to the type directly here instead } } } +enum MyEnum {} + +impl MyEnum { +//~^ NOTE `Self` type implicitly declared here, by this `impl` + fn do_something(result: impl FnOnce()) { + result(); + } + + fn do_something_extra() { + fn inner() { + //~^ NOTE `Self` used in this inner function + Self::do_something(move || {}); + //~^ ERROR can't use `Self` from outer item + //~| NOTE use of `Self` from outer item + //~| HELP refer to the type directly here instead + MyEnum::do_something(move || {}); + } + inner(); + } +} + fn main() {} diff --git a/tests/ui/resolve/use-self-in-inner-fn.stderr b/tests/ui/resolve/use-self-in-inner-fn.stderr index 7f5217825c116..2266a31ebf047 100644 --- a/tests/ui/resolve/use-self-in-inner-fn.stderr +++ b/tests/ui/resolve/use-self-in-inner-fn.stderr @@ -15,6 +15,24 @@ LL - fn peach(this: &Self) { LL + fn peach(this: &A) { | -error: aborting due to 1 previous error +error[E0401]: can't use `Self` from outer item + --> $DIR/use-self-in-inner-fn.rs:26:13 + | +LL | impl MyEnum { + | ---- `Self` type implicitly declared here, by this `impl` +... +LL | fn inner() { + | ----- `Self` used in this inner function +LL | +LL | Self::do_something(move || {}); + | ^^^^^^^^^^^^^^^^^^ use of `Self` from outer item + | +help: refer to the type directly here instead + | +LL - Self::do_something(move || {}); +LL + MyEnum(move || {}); + | + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0401`. From 48dde00f10d7438dfb3a3c4805fbdf6fa5aec1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 3 Nov 2025 02:13:34 +0000 Subject: [PATCH 3/4] Use more accurate span in `resolve_ident_in_lexical_scope` --- compiler/rustc_resolve/src/ident.rs | 2 +- .../associated-item/associated-item-duplicate-bounds.stderr | 2 +- tests/ui/delegation/target-expr.stderr | 2 +- tests/ui/generics/invalid-type-param-default.stderr | 2 +- ...eric-params-from-outer-item-in-const-item.default.stderr | 6 +++--- ...from-outer-item-in-const-item.generic_const_items.stderr | 6 +++--- tests/ui/resolve/issue-39559.stderr | 2 +- tests/ui/resolve/use-self-in-inner-fn.stderr | 4 ++-- tests/ui/type/pattern_types/assoc_const.default.stderr | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index 864c3306929eb..f3f0a74d03bc0 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -326,7 +326,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { i, rib_ident, *res, - finalize.map(|finalize| finalize.path_span), + finalize.map(|_| general_span), *original_rib_ident_def, ribs, diag_metadata, diff --git a/tests/ui/associated-item/associated-item-duplicate-bounds.stderr b/tests/ui/associated-item/associated-item-duplicate-bounds.stderr index 8898880586c92..9f8faf951940f 100644 --- a/tests/ui/associated-item/associated-item-duplicate-bounds.stderr +++ b/tests/ui/associated-item/associated-item-duplicate-bounds.stderr @@ -2,7 +2,7 @@ error: generic parameters may not be used in const operations --> $DIR/associated-item-duplicate-bounds.rs:7:18 | LL | links: [u32; A::LINKS], // Shouldn't suggest bounds already there. - | ^^^^^^^^ cannot perform const operation using `A` + | ^ cannot perform const operation using `A` | = note: type parameters may not be used in const expressions = help: add `#![feature(generic_const_exprs)]` to allow generic const expressions diff --git a/tests/ui/delegation/target-expr.stderr b/tests/ui/delegation/target-expr.stderr index edd1a584eab26..15af98c350675 100644 --- a/tests/ui/delegation/target-expr.stderr +++ b/tests/ui/delegation/target-expr.stderr @@ -7,7 +7,7 @@ LL | reuse Trait::static_method { | ------------- generic parameter used in this inner delegated function LL | LL | let _ = T::Default(); - | ^^^^^^^^^^ use of generic parameter from outer item + | ^ use of generic parameter from outer item error[E0434]: can't capture dynamic environment in a fn item --> $DIR/target-expr.rs:26:17 diff --git a/tests/ui/generics/invalid-type-param-default.stderr b/tests/ui/generics/invalid-type-param-default.stderr index 3bec7542ad003..bbae5ba1b1e1e 100644 --- a/tests/ui/generics/invalid-type-param-default.stderr +++ b/tests/ui/generics/invalid-type-param-default.stderr @@ -2,7 +2,7 @@ error[E0128]: generic parameter defaults cannot reference parameters before they --> $DIR/invalid-type-param-default.rs:12:12 | LL | fn mdn(_: T) {} - | ^^^^^^^ cannot reference `T` before it is declared + | ^ cannot reference `T` before it is declared error: defaults for generic parameters are not allowed here --> $DIR/invalid-type-param-default.rs:7:8 diff --git a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr index bc67e9dce4e3b..290b7a2d19160 100644 --- a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr +++ b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr @@ -4,7 +4,7 @@ error[E0401]: can't use generic parameters from outer item LL | fn outer() { // outer function | - type parameter from outer item LL | const K: u32 = T::C; - | - ^^^^ use of generic parameter from outer item + | - ^ use of generic parameter from outer item | | | generic parameter used in this inner constant item | @@ -17,7 +17,7 @@ LL | impl Tr for T { // outer impl block | - type parameter from outer item LL | const C: u32 = { LL | const I: u32 = T::C; - | - ^^^^ use of generic parameter from outer item + | - ^ use of generic parameter from outer item | | | generic parameter used in this inner constant item | @@ -29,7 +29,7 @@ error[E0401]: can't use generic parameters from outer item LL | struct S(U32<{ // outer struct | - type parameter from outer item LL | const _: u32 = T::C; - | - ^^^^ use of generic parameter from outer item + | - ^ use of generic parameter from outer item | | | generic parameter used in this inner constant item | diff --git a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr index 3959d117c7c9a..713fe1158645b 100644 --- a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr +++ b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr @@ -4,7 +4,7 @@ error[E0401]: can't use generic parameters from outer item LL | fn outer() { // outer function | - type parameter from outer item LL | const K: u32 = T::C; - | - ^^^^ use of generic parameter from outer item + | - ^ use of generic parameter from outer item | | | generic parameter used in this inner constant item | @@ -21,7 +21,7 @@ LL | impl Tr for T { // outer impl block | - type parameter from outer item LL | const C: u32 = { LL | const I: u32 = T::C; - | - ^^^^ use of generic parameter from outer item + | - ^ use of generic parameter from outer item | | | generic parameter used in this inner constant item | @@ -37,7 +37,7 @@ error[E0401]: can't use generic parameters from outer item LL | struct S(U32<{ // outer struct | - type parameter from outer item LL | const _: u32 = T::C; - | - ^^^^ use of generic parameter from outer item + | - ^ use of generic parameter from outer item | | | generic parameter used in this inner constant item | diff --git a/tests/ui/resolve/issue-39559.stderr b/tests/ui/resolve/issue-39559.stderr index 0aab54fe59d5b..14c7a6a9f6abf 100644 --- a/tests/ui/resolve/issue-39559.stderr +++ b/tests/ui/resolve/issue-39559.stderr @@ -2,7 +2,7 @@ error: generic parameters may not be used in const operations --> $DIR/issue-39559.rs:14:18 | LL | entries: [T; D::dim()], - | ^^^^^^ cannot perform const operation using `D` + | ^ cannot perform const operation using `D` | = note: type parameters may not be used in const expressions = help: add `#![feature(generic_const_exprs)]` to allow generic const expressions diff --git a/tests/ui/resolve/use-self-in-inner-fn.stderr b/tests/ui/resolve/use-self-in-inner-fn.stderr index 2266a31ebf047..668cd2413ceaf 100644 --- a/tests/ui/resolve/use-self-in-inner-fn.stderr +++ b/tests/ui/resolve/use-self-in-inner-fn.stderr @@ -25,12 +25,12 @@ LL | fn inner() { | ----- `Self` used in this inner function LL | LL | Self::do_something(move || {}); - | ^^^^^^^^^^^^^^^^^^ use of `Self` from outer item + | ^^^^ use of `Self` from outer item | help: refer to the type directly here instead | LL - Self::do_something(move || {}); -LL + MyEnum(move || {}); +LL + MyEnum::do_something(move || {}); | error: aborting due to 2 previous errors diff --git a/tests/ui/type/pattern_types/assoc_const.default.stderr b/tests/ui/type/pattern_types/assoc_const.default.stderr index 8cff0cee7b972..00d5ac6af26b4 100644 --- a/tests/ui/type/pattern_types/assoc_const.default.stderr +++ b/tests/ui/type/pattern_types/assoc_const.default.stderr @@ -20,7 +20,7 @@ error: generic parameters may not be used in const operations --> $DIR/assoc_const.rs:20:40 | LL | fn bar(_: pattern_type!(u32 is T::START..=T::END)) {} - | ^^^^^^^^ cannot perform const operation using `T` + | ^ cannot perform const operation using `T` | = note: type parameters may not be used in const expressions = help: add `#![feature(generic_const_exprs)]` to allow generic const expressions @@ -29,7 +29,7 @@ error: generic parameters may not be used in const operations --> $DIR/assoc_const.rs:20:51 | LL | fn bar(_: pattern_type!(u32 is T::START..=T::END)) {} - | ^^^^^^ cannot perform const operation using `T` + | ^ cannot perform const operation using `T` | = note: type parameters may not be used in const expressions = help: add `#![feature(generic_const_exprs)]` to allow generic const expressions From 14646ec374152c3988599733baebe18e8572e0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 3 Nov 2025 02:55:57 +0000 Subject: [PATCH 4/4] Add note to E0401 --- compiler/rustc_resolve/messages.ftl | 1 + compiler/rustc_resolve/src/errors.rs | 1 + .../ui/const-generics/early/const-param-from-outer-fn.stderr | 1 + tests/ui/delegation/target-expr.stderr | 2 ++ tests/ui/error-codes/E0401.stderr | 3 +++ .../enum-definition-with-outer-generic-parameter-5997.stderr | 1 + .../ui/generics/generic-params-nested-fn-scope-error.stderr | 2 ++ tests/ui/generics/issue-98432.stderr | 1 + tests/ui/resolve/bad-type-env-capture.stderr | 1 + ...neric-params-from-outer-item-in-const-item.default.stderr | 3 +++ ...-from-outer-item-in-const-item.generic_const_items.stderr | 3 +++ tests/ui/resolve/issue-12796.stderr | 2 ++ tests/ui/resolve/issue-3021-c.stderr | 2 ++ tests/ui/resolve/issue-3214.stderr | 1 + .../resolve/issue-65025-extern-static-parent-generics.stderr | 1 + .../resolve/issue-65035-static-with-parent-generics.stderr | 5 +++++ tests/ui/resolve/resolve-type-param-in-item-in-trait.stderr | 4 ++++ tests/ui/resolve/use-self-in-inner-fn.rs | 2 ++ tests/ui/resolve/use-self-in-inner-fn.stderr | 4 +++- tests/ui/statics/static-generic-param-soundness.stderr | 1 + tests/ui/type/type-arg-out-of-scope.stderr | 2 ++ 21 files changed, 42 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_resolve/messages.ftl b/compiler/rustc_resolve/messages.ftl index d462ff589f0da..dd06c157afc7b 100644 --- a/compiler/rustc_resolve/messages.ftl +++ b/compiler/rustc_resolve/messages.ftl @@ -175,6 +175,7 @@ resolve_generic_params_from_outer_item = } from outer item .refer_to_type_directly = refer to the type directly here instead .suggestion = try introducing a local generic parameter here + .note = nested items are independent from their parent item for everything except for privacy and name resolution resolve_generic_params_from_outer_item_const = a `const` is a separate item from the item that contains it diff --git a/compiler/rustc_resolve/src/errors.rs b/compiler/rustc_resolve/src/errors.rs index 165a17e5c11dc..0bb9909f7cbc4 100644 --- a/compiler/rustc_resolve/src/errors.rs +++ b/compiler/rustc_resolve/src/errors.rs @@ -11,6 +11,7 @@ use crate::{Res, fluent_generated as fluent}; #[derive(Diagnostic)] #[diag(resolve_generic_params_from_outer_item, code = E0401)] +#[note] pub(crate) struct GenericParamsFromOuterItem { #[primary_span] #[label] diff --git a/tests/ui/const-generics/early/const-param-from-outer-fn.stderr b/tests/ui/const-generics/early/const-param-from-outer-fn.stderr index 3c25dff41aa22..7aab983b6495a 100644 --- a/tests/ui/const-generics/early/const-param-from-outer-fn.stderr +++ b/tests/ui/const-generics/early/const-param-from-outer-fn.stderr @@ -8,6 +8,7 @@ LL | fn bar() -> u32 { LL | X | ^ use of generic parameter from outer item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bar() -> u32 { diff --git a/tests/ui/delegation/target-expr.stderr b/tests/ui/delegation/target-expr.stderr index 15af98c350675..e26d12ee447d0 100644 --- a/tests/ui/delegation/target-expr.stderr +++ b/tests/ui/delegation/target-expr.stderr @@ -8,6 +8,8 @@ LL | reuse Trait::static_method { LL | LL | let _ = T::Default(); | ^ use of generic parameter from outer item + | + = note: nested items are independent from their parent item for everything except for privacy and name resolution error[E0434]: can't capture dynamic environment in a fn item --> $DIR/target-expr.rs:26:17 diff --git a/tests/ui/error-codes/E0401.stderr b/tests/ui/error-codes/E0401.stderr index 6856d390efee6..abd80d636c679 100644 --- a/tests/ui/error-codes/E0401.stderr +++ b/tests/ui/error-codes/E0401.stderr @@ -8,6 +8,7 @@ LL | fn bfnr, W: Fn()>(y: T) { | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bfnr, W: Fn()>(y: T) { @@ -25,6 +26,7 @@ LL | fn baz u8 { | | | `Self` used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: refer to the type directly here instead | LL - fn helper(sel: &Self) -> u8 { diff --git a/tests/ui/generics/enum-definition-with-outer-generic-parameter-5997.stderr b/tests/ui/generics/enum-definition-with-outer-generic-parameter-5997.stderr index fb2d2f247b65b..53408d05a1c18 100644 --- a/tests/ui/generics/enum-definition-with-outer-generic-parameter-5997.stderr +++ b/tests/ui/generics/enum-definition-with-outer-generic-parameter-5997.stderr @@ -8,6 +8,7 @@ LL | enum E { V(Z) } | | | generic parameter used in this inner enum | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | enum E { V(Z) } diff --git a/tests/ui/generics/generic-params-nested-fn-scope-error.stderr b/tests/ui/generics/generic-params-nested-fn-scope-error.stderr index f809740ed381f..436f9c9bada19 100644 --- a/tests/ui/generics/generic-params-nested-fn-scope-error.stderr +++ b/tests/ui/generics/generic-params-nested-fn-scope-error.stderr @@ -8,6 +8,7 @@ LL | fn bar(w: [U]) -> U { | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bar(w: [U]) -> U { @@ -23,6 +24,7 @@ LL | fn bar(w: [U]) -> U { | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bar(w: [U]) -> U { diff --git a/tests/ui/generics/issue-98432.stderr b/tests/ui/generics/issue-98432.stderr index a1efee78cb7df..e261416ca2229 100644 --- a/tests/ui/generics/issue-98432.stderr +++ b/tests/ui/generics/issue-98432.stderr @@ -9,6 +9,7 @@ LL | struct _Obligation where T:; | | | generic parameter used in this inner struct | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | struct _Obligation where T:; diff --git a/tests/ui/resolve/bad-type-env-capture.stderr b/tests/ui/resolve/bad-type-env-capture.stderr index c565997ca2a26..ebddd7014748a 100644 --- a/tests/ui/resolve/bad-type-env-capture.stderr +++ b/tests/ui/resolve/bad-type-env-capture.stderr @@ -8,6 +8,7 @@ LL | fn bar(b: T) { } | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bar(b: T) { } diff --git a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr index 290b7a2d19160..8827d1bbb49d3 100644 --- a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr +++ b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.default.stderr @@ -8,6 +8,7 @@ LL | const K: u32 = T::C; | | | generic parameter used in this inner constant item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `const` is a separate item from the item that contains it error[E0401]: can't use generic parameters from outer item @@ -21,6 +22,7 @@ LL | const I: u32 = T::C; | | | generic parameter used in this inner constant item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `const` is a separate item from the item that contains it error[E0401]: can't use generic parameters from outer item @@ -33,6 +35,7 @@ LL | const _: u32 = T::C; | | | generic parameter used in this inner constant item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `const` is a separate item from the item that contains it error: aborting due to 3 previous errors diff --git a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr index 713fe1158645b..8ff9771b9ade6 100644 --- a/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr +++ b/tests/ui/resolve/generic-params-from-outer-item-in-const-item.generic_const_items.stderr @@ -8,6 +8,7 @@ LL | const K: u32 = T::C; | | | generic parameter used in this inner constant item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `const` is a separate item from the item that contains it help: try introducing a local generic parameter here | @@ -25,6 +26,7 @@ LL | const I: u32 = T::C; | | | generic parameter used in this inner constant item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `const` is a separate item from the item that contains it help: try introducing a local generic parameter here | @@ -41,6 +43,7 @@ LL | const _: u32 = T::C; | | | generic parameter used in this inner constant item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `const` is a separate item from the item that contains it help: try introducing a local generic parameter here | diff --git a/tests/ui/resolve/issue-12796.stderr b/tests/ui/resolve/issue-12796.stderr index b5828c6f5fc86..af79508689a9d 100644 --- a/tests/ui/resolve/issue-12796.stderr +++ b/tests/ui/resolve/issue-12796.stderr @@ -7,6 +7,8 @@ LL | fn inner(_: &Self) { | | use of `Self` from outer item | | can't use `Self` here | `Self` used in this inner function + | + = note: nested items are independent from their parent item for everything except for privacy and name resolution error: aborting due to 1 previous error diff --git a/tests/ui/resolve/issue-3021-c.stderr b/tests/ui/resolve/issue-3021-c.stderr index 8c554fd1b97dc..d521d4f4a73ae 100644 --- a/tests/ui/resolve/issue-3021-c.stderr +++ b/tests/ui/resolve/issue-3021-c.stderr @@ -9,6 +9,7 @@ LL | trait U { LL | fn g(&self, x: T) -> T; | ^ use of generic parameter from outer item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | trait U { @@ -25,6 +26,7 @@ LL | trait U { LL | fn g(&self, x: T) -> T; | ^ use of generic parameter from outer item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | trait U { diff --git a/tests/ui/resolve/issue-3214.stderr b/tests/ui/resolve/issue-3214.stderr index ab12676bdd805..573a8ba975c83 100644 --- a/tests/ui/resolve/issue-3214.stderr +++ b/tests/ui/resolve/issue-3214.stderr @@ -8,6 +8,7 @@ LL | struct Foo { LL | x: T, | ^ use of generic parameter from outer item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | struct Foo { diff --git a/tests/ui/resolve/issue-65025-extern-static-parent-generics.stderr b/tests/ui/resolve/issue-65025-extern-static-parent-generics.stderr index 2d21ed0155a70..6ff8c82ce8ee5 100644 --- a/tests/ui/resolve/issue-65025-extern-static-parent-generics.stderr +++ b/tests/ui/resolve/issue-65025-extern-static-parent-generics.stderr @@ -10,6 +10,7 @@ LL | | LL | | } | |_____- generic parameter used in this inner extern block | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error: aborting due to 1 previous error diff --git a/tests/ui/resolve/issue-65035-static-with-parent-generics.stderr b/tests/ui/resolve/issue-65035-static-with-parent-generics.stderr index b22bfb719bd50..d3c8095d048a2 100644 --- a/tests/ui/resolve/issue-65035-static-with-parent-generics.stderr +++ b/tests/ui/resolve/issue-65035-static-with-parent-generics.stderr @@ -10,6 +10,7 @@ LL | | LL | | } | |_____- generic parameter used in this inner extern block | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error[E0401]: can't use generic parameters from outer item @@ -22,6 +23,7 @@ LL | static a: *const T = Default::default(); | | | generic parameter used in this inner static item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error[E0401]: can't use generic parameters from outer item @@ -36,6 +38,7 @@ LL | | LL | | } | |_____- generic parameter used in this inner extern block | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error[E0401]: can't use generic parameters from outer item @@ -48,6 +51,7 @@ LL | static a: [u8; N] = [0; N]; | | | generic parameter used in this inner static item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error[E0401]: can't use generic parameters from outer item @@ -60,6 +64,7 @@ LL | static a: [u8; N] = [0; N]; | | | generic parameter used in this inner static item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error: aborting due to 5 previous errors diff --git a/tests/ui/resolve/resolve-type-param-in-item-in-trait.stderr b/tests/ui/resolve/resolve-type-param-in-item-in-trait.stderr index 00aa645688e7f..69f41dbb910c9 100644 --- a/tests/ui/resolve/resolve-type-param-in-item-in-trait.stderr +++ b/tests/ui/resolve/resolve-type-param-in-item-in-trait.stderr @@ -9,6 +9,7 @@ LL | enum Foo { LL | Variance(A) | ^ use of generic parameter from outer item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | enum Foo { @@ -25,6 +26,7 @@ LL | struct Foo(A); | | | generic parameter used in this inner struct | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | struct Foo(A); @@ -41,6 +43,7 @@ LL | struct Foo { a: A } | | | generic parameter used in this inner struct | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | struct Foo { a: A } @@ -57,6 +60,7 @@ LL | fn foo(a: A) { } | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn foo(a: A) { } diff --git a/tests/ui/resolve/use-self-in-inner-fn.rs b/tests/ui/resolve/use-self-in-inner-fn.rs index 1a11fe3a21b6d..c9260ba769d6c 100644 --- a/tests/ui/resolve/use-self-in-inner-fn.rs +++ b/tests/ui/resolve/use-self-in-inner-fn.rs @@ -8,6 +8,7 @@ impl A { //~| NOTE use of `Self` from outer item //~| NOTE `Self` used in this inner function //~| HELP refer to the type directly here instead + //~| NOTE nested items are independent from their } } } @@ -27,6 +28,7 @@ impl MyEnum { //~^ ERROR can't use `Self` from outer item //~| NOTE use of `Self` from outer item //~| HELP refer to the type directly here instead + //~| NOTE nested items are independent from their MyEnum::do_something(move || {}); } inner(); diff --git a/tests/ui/resolve/use-self-in-inner-fn.stderr b/tests/ui/resolve/use-self-in-inner-fn.stderr index 668cd2413ceaf..78c609ba8cb13 100644 --- a/tests/ui/resolve/use-self-in-inner-fn.stderr +++ b/tests/ui/resolve/use-self-in-inner-fn.stderr @@ -9,6 +9,7 @@ LL | fn peach(this: &Self) { | | | `Self` used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: refer to the type directly here instead | LL - fn peach(this: &Self) { @@ -16,7 +17,7 @@ LL + fn peach(this: &A) { | error[E0401]: can't use `Self` from outer item - --> $DIR/use-self-in-inner-fn.rs:26:13 + --> $DIR/use-self-in-inner-fn.rs:27:13 | LL | impl MyEnum { | ---- `Self` type implicitly declared here, by this `impl` @@ -27,6 +28,7 @@ LL | LL | Self::do_something(move || {}); | ^^^^ use of `Self` from outer item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: refer to the type directly here instead | LL - Self::do_something(move || {}); diff --git a/tests/ui/statics/static-generic-param-soundness.stderr b/tests/ui/statics/static-generic-param-soundness.stderr index 72f65e2bac7cb..32c252246e3e6 100644 --- a/tests/ui/statics/static-generic-param-soundness.stderr +++ b/tests/ui/statics/static-generic-param-soundness.stderr @@ -8,6 +8,7 @@ LL | static a: Bar = Bar::What; | | | generic parameter used in this inner static item | + = note: nested items are independent from their parent item for everything except for privacy and name resolution = note: a `static` is a separate item from the item that contains it error[E0392]: type parameter `T` is never used diff --git a/tests/ui/type/type-arg-out-of-scope.stderr b/tests/ui/type/type-arg-out-of-scope.stderr index 3d8850ebccea5..56fecdb338102 100644 --- a/tests/ui/type/type-arg-out-of-scope.stderr +++ b/tests/ui/type/type-arg-out-of-scope.stderr @@ -8,6 +8,7 @@ LL | fn bar(f: Box T>) { } | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bar(f: Box T>) { } @@ -23,6 +24,7 @@ LL | fn bar(f: Box T>) { } | | | generic parameter used in this inner function | + = note: nested items are independent from their parent item for everything except for privacy and name resolution help: try introducing a local generic parameter here | LL | fn bar(f: Box T>) { }