1
Fork 0

Generalize E0401

This commit is contained in:
León Orell Valerian Liehr 2023-09-10 23:06:14 +02:00
parent 3cd97ed3c3
commit b00e408e61
No known key found for this signature in database
GPG key ID: D17A07215F68E713
35 changed files with 141 additions and 153 deletions

View file

@ -1,4 +1,4 @@
Inner items do not inherit type or const parameters from the functions Inner items do not inherit the generic parameters from the items
they are embedded in. they are embedded in.
Erroneous code example: Erroneous code example:
@ -32,8 +32,8 @@ fn foo<T>(x: T) {
} }
``` ```
Items inside functions are basically just like top-level items, except Items nested inside other items are basically just like top-level items, except
that they can only be used from the function they are in. that they can only be used from the item they are in.
There are a couple of solutions for this. There are a couple of solutions for this.

View file

@ -553,14 +553,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
resolution_error: ResolutionError<'a>, resolution_error: ResolutionError<'a>,
) -> DiagnosticBuilder<'_, ErrorGuaranteed> { ) -> DiagnosticBuilder<'_, ErrorGuaranteed> {
match resolution_error { match resolution_error {
ResolutionError::GenericParamsFromOuterFunction(outer_res, has_generic_params) => { ResolutionError::GenericParamsFromOuterItem(outer_res, has_generic_params) => {
let mut err = struct_span_err!( let mut err = struct_span_err!(
self.tcx.sess, self.tcx.sess,
span, span,
E0401, E0401,
"can't use generic parameters from outer function", "can't use generic parameters from outer item",
); );
err.span_label(span, "use of generic parameter from outer function"); err.span_label(span, "use of generic parameter from outer item");
let sm = self.tcx.sess.source_map(); let sm = self.tcx.sess.source_map();
let def_id = match outer_res { let def_id = match outer_res {
@ -573,23 +573,20 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
reduce_impl_span_to_impl_keyword(sm, self.def_span(def_id)), reduce_impl_span_to_impl_keyword(sm, self.def_span(def_id)),
"`Self` type implicitly declared here, by this `impl`", "`Self` type implicitly declared here, by this `impl`",
); );
err.span_label(span, "use a type here instead"); err.span_label(span, "refer to the type directly here instead");
return err; return err;
} }
Res::Def(DefKind::TyParam, def_id) => { Res::Def(DefKind::TyParam, def_id) => {
err.span_label(self.def_span(def_id), "type parameter from outer function"); err.span_label(self.def_span(def_id), "type parameter from outer item");
def_id def_id
} }
Res::Def(DefKind::ConstParam, def_id) => { Res::Def(DefKind::ConstParam, def_id) => {
err.span_label( err.span_label(self.def_span(def_id), "const parameter from outer item");
self.def_span(def_id),
"const parameter from outer function",
);
def_id def_id
} }
_ => { _ => {
bug!( bug!(
"GenericParamsFromOuterFunction should only be used with \ "GenericParamsFromOuterItem should only be used with \
Res::SelfTyParam, Res::SelfTyAlias, DefKind::TyParam or \ Res::SelfTyParam, Res::SelfTyAlias, DefKind::TyParam or \
DefKind::ConstParam" DefKind::ConstParam"
); );
@ -597,9 +594,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
}; };
if let HasGenericParams::Yes(span) = has_generic_params { if let HasGenericParams::Yes(span) = has_generic_params {
// Try to retrieve the span of the function signature and generate a new let sugg_msg = "try introducing a local generic parameter here";
// message with a local type or const parameter.
let sugg_msg = "try using a local generic parameter instead";
let name = self.tcx.item_name(def_id); let name = self.tcx.item_name(def_id);
let (span, snippet) = if span.is_empty() { let (span, snippet) = if span.is_empty() {
let snippet = format!("<{name}>"); let snippet = format!("<{name}>");
@ -609,7 +604,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let snippet = format!("{name}, "); let snippet = format!("{name}, ");
(span, snippet) (span, snippet)
}; };
// Suggest the modification to the user
err.span_suggestion(span, sugg_msg, snippet, Applicability::MaybeIncorrect); err.span_suggestion(span, sugg_msg, snippet, Applicability::MaybeIncorrect);
} }

View file

@ -1229,10 +1229,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
if let Some(span) = finalize { if let Some(span) = finalize {
self.report_error( self.report_error(
span, span,
ResolutionError::GenericParamsFromOuterFunction( ResolutionError::GenericParamsFromOuterItem(res, has_generic_params),
res,
has_generic_params,
),
); );
} }
return Res::Err; return Res::Err;
@ -1296,10 +1293,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
if let Some(span) = finalize { if let Some(span) = finalize {
self.report_error( self.report_error(
span, span,
ResolutionError::GenericParamsFromOuterFunction( ResolutionError::GenericParamsFromOuterItem(res, has_generic_params),
res,
has_generic_params,
),
); );
} }
return Res::Err; return Res::Err;

View file

@ -186,8 +186,8 @@ struct BindingError {
#[derive(Debug)] #[derive(Debug)]
enum ResolutionError<'a> { enum ResolutionError<'a> {
/// Error E0401: can't use type or const parameters from outer function. /// Error E0401: can't use type or const parameters from outer item.
GenericParamsFromOuterFunction(Res, HasGenericParams), GenericParamsFromOuterItem(Res, HasGenericParams),
/// Error E0403: the name is already used for a type or const parameter in this generic /// Error E0403: the name is already used for a type or const parameter in this generic
/// parameter list. /// parameter list.
NameAlreadyUsedInParameterList(Symbol, Span), NameAlreadyUsedInParameterList(Symbol, Span),

View file

@ -1,6 +1,6 @@
fn foo<const X: u32>() { fn foo<const X: u32>() {
fn bar() -> u32 { fn bar() -> u32 {
X //~ ERROR can't use generic parameters from outer function X //~ ERROR can't use generic parameters from outer item
} }
} }

View file

@ -1,12 +1,12 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/const-param-from-outer-fn.rs:3:9 --> $DIR/const-param-from-outer-fn.rs:3:9
| |
LL | fn foo<const X: u32>() { LL | fn foo<const X: u32>() {
| - const parameter from outer function | - const parameter from outer item
LL | fn bar() -> u32 { LL | fn bar() -> u32 {
| - help: try using a local generic parameter instead: `<X>` | - help: try introducing a local generic parameter here: `<X>`
LL | X LL | X
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,26 +1,26 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/E0401.rs:4:39 --> $DIR/E0401.rs:4:39
| |
LL | fn foo<T>(x: T) { LL | fn foo<T>(x: T) {
| - type parameter from outer function | - type parameter from outer item
LL | fn bfnr<U, V: Baz<U>, W: Fn()>(y: T) { LL | fn bfnr<U, V: Baz<U>, W: Fn()>(y: T) {
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `T,` | help: try introducing a local generic parameter here: `T,`
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/E0401.rs:9:16 --> $DIR/E0401.rs:9:16
| |
LL | fn foo<T>(x: T) { LL | fn foo<T>(x: T) {
| - type parameter from outer function | - type parameter from outer item
... ...
LL | fn baz<U, LL | fn baz<U,
| - help: try using a local generic parameter instead: `T,` | - help: try introducing a local generic parameter here: `T,`
... ...
LL | (y: T) { LL | (y: T) {
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/E0401.rs:24:25 --> $DIR/E0401.rs:24:25
| |
LL | impl<T> Iterator for A<T> { LL | impl<T> Iterator for A<T> {
@ -29,8 +29,8 @@ LL | impl<T> Iterator for A<T> {
LL | fn helper(sel: &Self) -> u8 { LL | fn helper(sel: &Self) -> u8 {
| ^^^^ | ^^^^
| | | |
| use of generic parameter from outer function | use of generic parameter from outer item
| use a type here instead | refer to the type directly here instead
error[E0282]: type annotations needed error[E0282]: type annotations needed
--> $DIR/E0401.rs:11:5 --> $DIR/E0401.rs:11:5

View file

@ -4,7 +4,7 @@
fn<EFBFBD>a<e>(){fn<EFBFBD>p(){e}} //~ ERROR unknown start of token: \u{fffd} fn<EFBFBD>a<e>(){fn<EFBFBD>p(){e}} //~ ERROR unknown start of token: \u{fffd}
//~^ ERROR unknown start of token: \u{fffd} //~^ ERROR unknown start of token: \u{fffd}
//~^^ ERROR can't use generic parameters from outer function [E0401] //~^^ ERROR can't use generic parameters from outer item [E0401]
//~^^^ WARN type parameter `e` should have an upper camel case name //~^^^ WARN type parameter `e` should have an upper camel case name
fn main(){} fn main(){}

View file

@ -2,7 +2,7 @@ struct Struct<T>(T);
impl<T> Struct<T> { impl<T> Struct<T> {
const CONST: fn() = || { const CONST: fn() = || {
struct _Obligation where T:; //~ ERROR can't use generic parameters from outer function struct _Obligation where T:; //~ ERROR can't use generic parameters from outer item
}; };
} }

View file

@ -1,13 +1,13 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-98432.rs:5:34 --> $DIR/issue-98432.rs:5:34
| |
LL | impl<T> Struct<T> { LL | impl<T> Struct<T> {
| - type parameter from outer function | - type parameter from outer item
LL | const CONST: fn() = || { LL | const CONST: fn() = || {
LL | struct _Obligation where T:; LL | struct _Obligation where T:;
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<T>` | help: try introducing a local generic parameter here: `<T>`
error: aborting due to previous error error: aborting due to previous error

View file

@ -4,7 +4,7 @@ enum Bar<T> { What } //~ ERROR parameter `T` is never used
fn foo<T>() { fn foo<T>() {
static a: Bar<T> = Bar::What; static a: Bar<T> = Bar::What;
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
fn main() { fn main() {

View file

@ -1,10 +1,10 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/inner-static-type-parameter.rs:6:19 --> $DIR/inner-static-type-parameter.rs:6:19
| |
LL | fn foo<T>() { LL | fn foo<T>() {
| - type parameter from outer function | - type parameter from outer item
LL | static a: Bar<T> = Bar::What; LL | static a: Bar<T> = Bar::What;
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0392]: parameter `T` is never used error[E0392]: parameter `T` is never used
--> $DIR/inner-static-type-parameter.rs:3:10 --> $DIR/inner-static-type-parameter.rs:3:10

View file

@ -1,6 +1,6 @@
fn foo<T>() { fn foo<T>() {
struct Foo { struct Foo {
x: T, //~ ERROR can't use generic parameters from outer function x: T, //~ ERROR can't use generic parameters from outer item
} }
impl<T> Drop for Foo<T> { impl<T> Drop for Foo<T> {

View file

@ -1,12 +1,12 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-3214.rs:3:12 --> $DIR/issue-3214.rs:3:12
| |
LL | fn foo<T>() { LL | fn foo<T>() {
| - type parameter from outer function | - type parameter from outer item
LL | struct Foo { LL | struct Foo {
| - help: try using a local generic parameter instead: `<T>` | - help: try introducing a local generic parameter here: `<T>`
LL | x: T, LL | x: T,
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0107]: struct takes 0 generic arguments but 1 generic argument was supplied error[E0107]: struct takes 0 generic arguments but 1 generic argument was supplied
--> $DIR/issue-3214.rs:6:22 --> $DIR/issue-3214.rs:6:22

View file

@ -1,6 +1,6 @@
fn f<Z>() -> bool { fn f<Z>() -> bool {
enum E { V(Z) } enum E { V(Z) }
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
true true
} }

View file

@ -1,12 +1,12 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-5997-enum.rs:2:16 --> $DIR/issue-5997-enum.rs:2:16
| |
LL | fn f<Z>() -> bool { LL | fn f<Z>() -> bool {
| - type parameter from outer function | - type parameter from outer item
LL | enum E { V(Z) } LL | enum E { V(Z) }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<Z>` | help: try introducing a local generic parameter here: `<Z>`
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,5 +1,5 @@
fn f<T>() -> bool { fn f<T>() -> bool {
struct S(T); //~ ERROR can't use generic parameters from outer function struct S(T); //~ ERROR can't use generic parameters from outer item
true true
} }

View file

@ -1,12 +1,12 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-5997-struct.rs:2:14 --> $DIR/issue-5997-struct.rs:2:14
| |
LL | fn f<T>() -> bool { LL | fn f<T>() -> bool {
| - type parameter from outer function | - type parameter from outer item
LL | struct S(T); LL | struct S(T);
| -^ use of generic parameter from outer function | -^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<T>` | help: try introducing a local generic parameter here: `<T>`
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,4 +1,4 @@
// error-pattern:can't use generic parameters from outer function // error-pattern:can't use generic parameters from outer item
fn hd<U>(v: Vec<U> ) -> U { fn hd<U>(v: Vec<U> ) -> U {
fn hd1(w: [U]) -> U { return w[0]; } fn hd1(w: [U]) -> U { return w[0]; }

View file

@ -1,22 +1,22 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/nested-ty-params.rs:3:16 --> $DIR/nested-ty-params.rs:3:16
| |
LL | fn hd<U>(v: Vec<U> ) -> U { LL | fn hd<U>(v: Vec<U> ) -> U {
| - type parameter from outer function | - type parameter from outer item
LL | fn hd1(w: [U]) -> U { return w[0]; } LL | fn hd1(w: [U]) -> U { return w[0]; }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<U>` | help: try introducing a local generic parameter here: `<U>`
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/nested-ty-params.rs:3:23 --> $DIR/nested-ty-params.rs:3:23
| |
LL | fn hd<U>(v: Vec<U> ) -> U { LL | fn hd<U>(v: Vec<U> ) -> U {
| - type parameter from outer function | - type parameter from outer item
LL | fn hd1(w: [U]) -> U { return w[0]; } LL | fn hd1(w: [U]) -> U { return w[0]; }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<U>` | help: try introducing a local generic parameter here: `<U>`
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -1,12 +1,12 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/bad-type-env-capture.rs:2:15 --> $DIR/bad-type-env-capture.rs:2:15
| |
LL | fn foo<T>() { LL | fn foo<T>() {
| - type parameter from outer function | - type parameter from outer item
LL | fn bar(b: T) { } LL | fn bar(b: T) { }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<T>` | help: try introducing a local generic parameter here: `<T>`
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,7 +1,7 @@
trait Trait { trait Trait {
fn outer(&self) { fn outer(&self) {
fn inner(_: &Self) { fn inner(_: &Self) {
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }
} }

View file

@ -1,10 +1,10 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-12796.rs:3:22 --> $DIR/issue-12796.rs:3:22
| |
LL | fn inner(_: &Self) { LL | fn inner(_: &Self) {
| ^^^^ | ^^^^
| | | |
| use of generic parameter from outer function | use of generic parameter from outer item
| can't use `Self` here | can't use `Self` here
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,8 +1,8 @@
fn siphash<T>() { fn siphash<T>() {
trait U { trait U {
fn g(&self, x: T) -> T; //~ ERROR can't use generic parameters from outer function fn g(&self, x: T) -> T; //~ ERROR can't use generic parameters from outer item
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }

View file

@ -1,24 +1,24 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-3021-c.rs:4:24 --> $DIR/issue-3021-c.rs:4:24
| |
LL | fn siphash<T>() { LL | fn siphash<T>() {
| - type parameter from outer function | - type parameter from outer item
LL | LL |
LL | trait U { LL | trait U {
| - help: try using a local generic parameter instead: `<T>` | - help: try introducing a local generic parameter here: `<T>`
LL | fn g(&self, x: T) -> T; LL | fn g(&self, x: T) -> T;
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-3021-c.rs:4:30 --> $DIR/issue-3021-c.rs:4:30
| |
LL | fn siphash<T>() { LL | fn siphash<T>() {
| - type parameter from outer function | - type parameter from outer item
LL | LL |
LL | trait U { LL | trait U {
| - help: try using a local generic parameter instead: `<T>` | - help: try introducing a local generic parameter here: `<T>`
LL | fn g(&self, x: T) -> T; LL | fn g(&self, x: T) -> T;
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -1,7 +1,7 @@
unsafe fn foo<A>() { unsafe fn foo<A>() {
extern "C" { extern "C" {
static baz: *const A; static baz: *const A;
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
let bar: *const u64 = core::mem::transmute(&baz); let bar: *const u64 = core::mem::transmute(&baz);

View file

@ -1,11 +1,11 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-65025-extern-static-parent-generics.rs:3:28 --> $DIR/issue-65025-extern-static-parent-generics.rs:3:28
| |
LL | unsafe fn foo<A>() { LL | unsafe fn foo<A>() {
| - type parameter from outer function | - type parameter from outer item
LL | extern "C" { LL | extern "C" {
LL | static baz: *const A; LL | static baz: *const A;
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,26 +1,26 @@
fn f<T>() { fn f<T>() {
extern "C" { extern "C" {
static a: *const T; static a: *const T;
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }
fn g<T: Default>() { fn g<T: Default>() {
static a: *const T = Default::default(); static a: *const T = Default::default();
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
fn h<const N: usize>() { fn h<const N: usize>() {
extern "C" { extern "C" {
static a: [u8; N]; static a: [u8; N];
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }
fn i<const N: usize>() { fn i<const N: usize>() {
static a: [u8; N] = [0; N]; static a: [u8; N] = [0; N];
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
//~| ERROR can't use generic parameters from outer function //~| ERROR can't use generic parameters from outer item
} }
fn main() {} fn main() {}

View file

@ -1,44 +1,44 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-65035-static-with-parent-generics.rs:3:26 --> $DIR/issue-65035-static-with-parent-generics.rs:3:26
| |
LL | fn f<T>() { LL | fn f<T>() {
| - type parameter from outer function | - type parameter from outer item
LL | extern "C" { LL | extern "C" {
LL | static a: *const T; LL | static a: *const T;
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-65035-static-with-parent-generics.rs:9:22 --> $DIR/issue-65035-static-with-parent-generics.rs:9:22
| |
LL | fn g<T: Default>() { LL | fn g<T: Default>() {
| - type parameter from outer function | - type parameter from outer item
LL | static a: *const T = Default::default(); LL | static a: *const T = Default::default();
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-65035-static-with-parent-generics.rs:15:24 --> $DIR/issue-65035-static-with-parent-generics.rs:15:24
| |
LL | fn h<const N: usize>() { LL | fn h<const N: usize>() {
| - const parameter from outer function | - const parameter from outer item
LL | extern "C" { LL | extern "C" {
LL | static a: [u8; N]; LL | static a: [u8; N];
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-65035-static-with-parent-generics.rs:21:20 --> $DIR/issue-65035-static-with-parent-generics.rs:21:20
| |
LL | fn i<const N: usize>() { LL | fn i<const N: usize>() {
| - const parameter from outer function | - const parameter from outer item
LL | static a: [u8; N] = [0; N]; LL | static a: [u8; N] = [0; N];
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/issue-65035-static-with-parent-generics.rs:21:29 --> $DIR/issue-65035-static-with-parent-generics.rs:21:29
| |
LL | fn i<const N: usize>() { LL | fn i<const N: usize>() {
| - const parameter from outer function | - const parameter from outer item
LL | static a: [u8; N] = [0; N]; LL | static a: [u8; N] = [0; N];
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error: aborting due to 5 previous errors error: aborting due to 5 previous errors

View file

@ -6,7 +6,7 @@ trait TraitA<A> {
fn outer(&self) { fn outer(&self) {
enum Foo<B> { enum Foo<B> {
Variance(A) Variance(A)
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }
} }
@ -14,21 +14,21 @@ trait TraitA<A> {
trait TraitB<A> { trait TraitB<A> {
fn outer(&self) { fn outer(&self) {
struct Foo<B>(A); struct Foo<B>(A);
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }
trait TraitC<A> { trait TraitC<A> {
fn outer(&self) { fn outer(&self) {
struct Foo<B> { a: A } struct Foo<B> { a: A }
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }
trait TraitD<A> { trait TraitD<A> {
fn outer(&self) { fn outer(&self) {
fn foo<B>(a: A) { } fn foo<B>(a: A) { }
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
} }
} }

View file

@ -1,46 +1,46 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/resolve-type-param-in-item-in-trait.rs:8:22 --> $DIR/resolve-type-param-in-item-in-trait.rs:8:22
| |
LL | trait TraitA<A> { LL | trait TraitA<A> {
| - type parameter from outer function | - type parameter from outer item
LL | fn outer(&self) { LL | fn outer(&self) {
LL | enum Foo<B> { LL | enum Foo<B> {
| - help: try using a local generic parameter instead: `A,` | - help: try introducing a local generic parameter here: `A,`
LL | Variance(A) LL | Variance(A)
| ^ use of generic parameter from outer function | ^ use of generic parameter from outer item
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/resolve-type-param-in-item-in-trait.rs:16:23 --> $DIR/resolve-type-param-in-item-in-trait.rs:16:23
| |
LL | trait TraitB<A> { LL | trait TraitB<A> {
| - type parameter from outer function | - type parameter from outer item
LL | fn outer(&self) { LL | fn outer(&self) {
LL | struct Foo<B>(A); LL | struct Foo<B>(A);
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `A,` | help: try introducing a local generic parameter here: `A,`
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/resolve-type-param-in-item-in-trait.rs:23:28 --> $DIR/resolve-type-param-in-item-in-trait.rs:23:28
| |
LL | trait TraitC<A> { LL | trait TraitC<A> {
| - type parameter from outer function | - type parameter from outer item
LL | fn outer(&self) { LL | fn outer(&self) {
LL | struct Foo<B> { a: A } LL | struct Foo<B> { a: A }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `A,` | help: try introducing a local generic parameter here: `A,`
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/resolve-type-param-in-item-in-trait.rs:30:22 --> $DIR/resolve-type-param-in-item-in-trait.rs:30:22
| |
LL | trait TraitD<A> { LL | trait TraitD<A> {
| - type parameter from outer function | - type parameter from outer item
LL | fn outer(&self) { LL | fn outer(&self) {
LL | fn foo<B>(a: A) { } LL | fn foo<B>(a: A) { }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `A,` | help: try introducing a local generic parameter here: `A,`
error: aborting due to 4 previous errors error: aborting due to 4 previous errors

View file

@ -4,9 +4,9 @@ impl A {
//~^ NOTE `Self` type implicitly declared here, by this `impl` //~^ NOTE `Self` type implicitly declared here, by this `impl`
fn banana(&mut self) { fn banana(&mut self) {
fn peach(this: &Self) { fn peach(this: &Self) {
//~^ ERROR can't use generic parameters from outer function //~^ ERROR can't use generic parameters from outer item
//~| NOTE use of generic parameter from outer function //~| NOTE use of generic parameter from outer item
//~| NOTE use a type here instead //~| NOTE refer to the type directly here instead
} }
} }
} }

View file

@ -1,4 +1,4 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/use-self-in-inner-fn.rs:6:25 --> $DIR/use-self-in-inner-fn.rs:6:25
| |
LL | impl A { LL | impl A {
@ -7,8 +7,8 @@ LL | impl A {
LL | fn peach(this: &Self) { LL | fn peach(this: &Self) {
| ^^^^ | ^^^^
| | | |
| use of generic parameter from outer function | use of generic parameter from outer item
| use a type here instead | refer to the type directly here instead
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,4 +1,4 @@
// error-pattern:can't use generic parameters from outer function // error-pattern:can't use generic parameters from outer item
fn foo<T>(x: T) { fn foo<T>(x: T) {
fn bar(f: Box<dyn FnMut(T) -> T>) { } fn bar(f: Box<dyn FnMut(T) -> T>) { }
} }

View file

@ -1,22 +1,22 @@
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/type-arg-out-of-scope.rs:3:29 --> $DIR/type-arg-out-of-scope.rs:3:29
| |
LL | fn foo<T>(x: T) { LL | fn foo<T>(x: T) {
| - type parameter from outer function | - type parameter from outer item
LL | fn bar(f: Box<dyn FnMut(T) -> T>) { } LL | fn bar(f: Box<dyn FnMut(T) -> T>) { }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<T>` | help: try introducing a local generic parameter here: `<T>`
error[E0401]: can't use generic parameters from outer function error[E0401]: can't use generic parameters from outer item
--> $DIR/type-arg-out-of-scope.rs:3:35 --> $DIR/type-arg-out-of-scope.rs:3:35
| |
LL | fn foo<T>(x: T) { LL | fn foo<T>(x: T) {
| - type parameter from outer function | - type parameter from outer item
LL | fn bar(f: Box<dyn FnMut(T) -> T>) { } LL | fn bar(f: Box<dyn FnMut(T) -> T>) { }
| - ^ use of generic parameter from outer function | - ^ use of generic parameter from outer item
| | | |
| help: try using a local generic parameter instead: `<T>` | help: try introducing a local generic parameter here: `<T>`
error: aborting due to 2 previous errors error: aborting due to 2 previous errors