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.
Erroneous code example:
@ -32,8 +32,8 @@ fn foo<T>(x: T) {
}
```
Items inside functions are basically just like top-level items, except
that they can only be used from the function they are in.
Items nested inside other items are basically just like top-level items, except
that they can only be used from the item they are in.
There are a couple of solutions for this.

View file

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

View file

@ -1229,10 +1229,7 @@ fn validate_res_from_ribs(
if let Some(span) = finalize {
self.report_error(
span,
ResolutionError::GenericParamsFromOuterFunction(
res,
has_generic_params,
),
ResolutionError::GenericParamsFromOuterItem(res, has_generic_params),
);
}
return Res::Err;
@ -1296,10 +1293,7 @@ fn validate_res_from_ribs(
if let Some(span) = finalize {
self.report_error(
span,
ResolutionError::GenericParamsFromOuterFunction(
res,
has_generic_params,
),
ResolutionError::GenericParamsFromOuterItem(res, has_generic_params),
);
}
return Res::Err;

View file

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

View file

@ -1,6 +1,6 @@
fn foo<const X: 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
|
LL | fn foo<const X: u32>() {
| - const parameter from outer function
| - const parameter from outer item
LL | fn bar() -> u32 {
| - help: try using a local generic parameter instead: `<X>`
| - help: try introducing a local generic parameter here: `<X>`
LL | X
| ^ use of generic parameter from outer function
| ^ use of generic parameter from outer item
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
|
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) {
| - ^ 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
|
LL | fn foo<T>(x: T) {
| - type parameter from outer function
| - type parameter from outer item
...
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) {
| ^ 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
|
LL | impl<T> Iterator for A<T> {
@ -29,8 +29,8 @@ LL | impl<T> Iterator for A<T> {
LL | fn helper(sel: &Self) -> u8 {
| ^^^^
| |
| use of generic parameter from outer function
| use a type here instead
| use of generic parameter from outer item
| refer to the type directly here instead
error[E0282]: type annotations needed
--> $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}
//~^ 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
fn main(){}

View file

@ -2,7 +2,7 @@
impl<T> Struct<T> {
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
|
LL | impl<T> Struct<T> {
| - type parameter from outer function
| - type parameter from outer item
LL | const CONST: fn() = || {
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

View file

@ -4,7 +4,7 @@ enum Bar<T> { What } //~ ERROR parameter `T` is never used
fn foo<T>() {
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() {

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
|
LL | fn foo<T>() {
| - type parameter from outer function
| - type parameter from outer item
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
--> $DIR/inner-static-type-parameter.rs:3:10

View file

@ -1,6 +1,6 @@
fn foo<T>() {
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> {

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
|
LL | fn foo<T>() {
| - type parameter from outer function
| - type parameter from outer item
LL | struct Foo {
| - help: try using a local generic parameter instead: `<T>`
| - help: try introducing a local generic parameter here: `<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
--> $DIR/issue-3214.rs:6:22

View file

@ -1,6 +1,6 @@
fn f<Z>() -> bool {
enum E { V(Z) }
//~^ ERROR can't use generic parameters from outer function
//~^ ERROR can't use generic parameters from outer item
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
|
LL | fn f<Z>() -> bool {
| - type parameter from outer function
| - type parameter from outer item
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

View file

@ -1,5 +1,5 @@
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
}

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
|
LL | fn f<T>() -> bool {
| - type parameter from outer function
| - type parameter from outer item
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

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 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
|
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]; }
| - ^ 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
|
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]; }
| - ^ 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

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
|
LL | fn foo<T>() {
| - type parameter from outer function
| - type parameter from outer item
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

View file

@ -1,7 +1,7 @@
trait Trait {
fn outer(&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
|
LL | fn inner(_: &Self) {
| ^^^^
| |
| use of generic parameter from outer function
| use of generic parameter from outer item
| can't use `Self` here
error: aborting due to previous error

View file

@ -1,8 +1,8 @@
fn siphash<T>() {
trait U {
fn g(&self, x: T) -> T; //~ ERROR can't use generic parameters from outer function
//~^ 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 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
|
LL | fn siphash<T>() {
| - type parameter from outer function
| - type parameter from outer item
LL |
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;
| ^ 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
|
LL | fn siphash<T>() {
| - type parameter from outer function
| - type parameter from outer item
LL |
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;
| ^ use of generic parameter from outer function
| ^ use of generic parameter from outer item
error: aborting due to 2 previous errors

View file

@ -1,7 +1,7 @@
unsafe fn foo<A>() {
extern "C" {
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);

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
|
LL | unsafe fn foo<A>() {
| - type parameter from outer function
| - type parameter from outer item
LL | extern "C" {
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

View file

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

View file

@ -6,7 +6,7 @@ trait TraitA<A> {
fn outer(&self) {
enum Foo<B> {
Variance(A)
//~^ ERROR can't use generic parameters from outer function
//~^ ERROR can't use generic parameters from outer item
}
}
}
@ -14,21 +14,21 @@ enum Foo<B> {
trait TraitB<A> {
fn outer(&self) {
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> {
fn outer(&self) {
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> {
fn outer(&self) {
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
|
LL | trait TraitA<A> {
| - type parameter from outer function
| - type parameter from outer item
LL | fn outer(&self) {
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)
| ^ 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
|
LL | trait TraitB<A> {
| - type parameter from outer function
| - type parameter from outer item
LL | fn outer(&self) {
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
|
LL | trait TraitC<A> {
| - type parameter from outer function
| - type parameter from outer item
LL | fn outer(&self) {
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
|
LL | trait TraitD<A> {
| - type parameter from outer function
| - type parameter from outer item
LL | fn outer(&self) {
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

View file

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