Skip to content

Commit

Permalink
Unrolled build for rust-lang#128910
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#128910 - estebank:assoc-fn, r=compiler-errors

Differentiate between methods and associated functions in diagnostics

Accurately refer to assoc fn without receiver as assoc fn instead of methods. Add `AssocItem::descr` method to centralize where we call methods and associated functions.
  • Loading branch information
rust-timer authored Aug 10, 2024
2 parents 8291d68 + 860c8cd commit 78ff8c4
Show file tree
Hide file tree
Showing 27 changed files with 79 additions and 72 deletions.
14 changes: 3 additions & 11 deletions compiler/rustc_hir_analysis/src/check/compare_impl_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1117,7 +1117,7 @@ fn check_region_bounds_on_impl_item<'tcx>(
.dcx()
.create_err(LifetimesOrBoundsMismatchOnTrait {
span,
item_kind: assoc_item_kind_str(&impl_m),
item_kind: impl_m.descr(),
ident: impl_m.ident(tcx),
generics_span,
bounds_span,
Expand Down Expand Up @@ -1294,7 +1294,7 @@ fn compare_number_of_generics<'tcx>(
("const", trait_own_counts.consts, impl_own_counts.consts),
];

let item_kind = assoc_item_kind_str(&impl_);
let item_kind = impl_.descr();

let mut err_occurred = None;
for (kind, trait_count, impl_count) in matchings {
Expand Down Expand Up @@ -1676,7 +1676,7 @@ fn compare_generic_param_kinds<'tcx>(
param_impl_span,
E0053,
"{} `{}` has an incompatible generic parameter for trait `{}`",
assoc_item_kind_str(&impl_item),
impl_item.descr(),
trait_item.name,
&tcx.def_path_str(tcx.parent(trait_item.def_id))
);
Expand Down Expand Up @@ -2249,14 +2249,6 @@ fn param_env_with_gat_bounds<'tcx>(
ty::ParamEnv::new(tcx.mk_clauses(&predicates), Reveal::UserFacing)
}

fn assoc_item_kind_str(impl_item: &ty::AssocItem) -> &'static str {
match impl_item.kind {
ty::AssocKind::Const => "const",
ty::AssocKind::Fn => "method",
ty::AssocKind::Type => "type",
}
}

/// Manually check here that `async fn foo()` wasn't matched against `fn foo()`,
/// and extract a better error if so.
fn try_report_async_mismatch<'tcx>(
Expand Down
18 changes: 12 additions & 6 deletions compiler/rustc_middle/src/hir/map/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1165,17 +1165,23 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String {
}
Node::ImplItem(ii) => {
let kind = match ii.kind {
ImplItemKind::Const(..) => "assoc const",
ImplItemKind::Fn(..) => "method",
ImplItemKind::Type(_) => "assoc type",
ImplItemKind::Const(..) => "associated constant",
ImplItemKind::Fn(fn_sig, _) => match fn_sig.decl.implicit_self {
ImplicitSelfKind::None => "associated function",
_ => "method",
},
ImplItemKind::Type(_) => "associated type",
};
format!("{id} ({kind} `{}` in {})", ii.ident, path_str(ii.owner_id.def_id))
}
Node::TraitItem(ti) => {
let kind = match ti.kind {
TraitItemKind::Const(..) => "assoc constant",
TraitItemKind::Fn(..) => "trait method",
TraitItemKind::Type(..) => "assoc type",
TraitItemKind::Const(..) => "associated constant",
TraitItemKind::Fn(fn_sig, _) => match fn_sig.decl.implicit_self {
ImplicitSelfKind::None => "associated function",
_ => "trait method",
},
TraitItemKind::Type(..) => "associated type",
};

format!("{id} ({kind} `{}` in {})", ti.ident, path_str(ti.owner_id.def_id))
Expand Down
9 changes: 9 additions & 0 deletions compiler/rustc_middle/src/ty/assoc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,15 @@ impl AssocItem {
}
}

pub fn descr(&self) -> &'static str {
match self.kind {
ty::AssocKind::Const => "const",
ty::AssocKind::Fn if self.fn_has_self_parameter => "method",
ty::AssocKind::Fn => "associated function",
ty::AssocKind::Type => "type",
}
}

pub fn is_impl_trait_in_trait(&self) -> bool {
self.opt_rpitit_info.is_some()
}
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/async-await/in-trait/generics-mismatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ trait Foo {

impl Foo for () {
async fn foo<const N: usize>() {}
//~^ ERROR: method `foo` has an incompatible generic parameter for trait `Foo` [E0053]
//~^ ERROR: associated function `foo` has an incompatible generic parameter for trait `Foo` [E0053]
}

fn main() {}
2 changes: 1 addition & 1 deletion tests/ui/async-await/in-trait/generics-mismatch.stderr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0053]: method `foo` has an incompatible generic parameter for trait `Foo`
error[E0053]: associated function `foo` has an incompatible generic parameter for trait `Foo`
--> $DIR/generics-mismatch.rs:8:18
|
LL | trait Foo {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,39 @@ trait Trait {
}
impl Trait for () {
fn foo<const M: u64>() {}
//~^ error: method `foo` has an incompatible generic parameter for trait
//~^ error: associated function `foo` has an incompatible generic parameter for trait
}

trait Other {
fn bar<const M: u8>() {}
}
impl Other for () {
fn bar<T>() {}
//~^ error: method `bar` has an incompatible generic parameter for trait
//~^ error: associated function `bar` has an incompatible generic parameter for trait
}

trait Uwu {
fn baz<const N: u32>() {}
}
impl Uwu for () {
fn baz<const N: i32>() {}
//~^ error: method `baz` has an incompatible generic parameter for trait
//~^ error: associated function `baz` has an incompatible generic parameter for trait
}

trait Aaaaaa {
fn bbbb<const N: u32, T>() {}
}
impl Aaaaaa for () {
fn bbbb<T, const N: u32>() {}
//~^ error: method `bbbb` has an incompatible generic parameter for trait
//~^ error: associated function `bbbb` has an incompatible generic parameter for trait
}

trait Names {
fn abcd<T, const N: u32>() {}
}
impl Names for () {
fn abcd<const N: u32, T>() {}
//~^ error: method `abcd` has an incompatible generic parameter for trait
//~^ error: associated function `abcd` has an incompatible generic parameter for trait
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0053]: method `foo` has an incompatible generic parameter for trait `Trait`
error[E0053]: associated function `foo` has an incompatible generic parameter for trait `Trait`
--> $DIR/mismatched_ty_const_in_trait_impl.rs:5:12
|
LL | trait Trait {
Expand All @@ -11,7 +11,7 @@ LL | impl Trait for () {
LL | fn foo<const M: u64>() {}
| ^^^^^^^^^^^^ found const parameter of type `u64`

error[E0053]: method `bar` has an incompatible generic parameter for trait `Other`
error[E0053]: associated function `bar` has an incompatible generic parameter for trait `Other`
--> $DIR/mismatched_ty_const_in_trait_impl.rs:13:12
|
LL | trait Other {
Expand All @@ -24,7 +24,7 @@ LL | impl Other for () {
LL | fn bar<T>() {}
| ^ found type parameter

error[E0053]: method `baz` has an incompatible generic parameter for trait `Uwu`
error[E0053]: associated function `baz` has an incompatible generic parameter for trait `Uwu`
--> $DIR/mismatched_ty_const_in_trait_impl.rs:21:12
|
LL | trait Uwu {
Expand All @@ -37,7 +37,7 @@ LL | impl Uwu for () {
LL | fn baz<const N: i32>() {}
| ^^^^^^^^^^^^ found const parameter of type `i32`

error[E0053]: method `bbbb` has an incompatible generic parameter for trait `Aaaaaa`
error[E0053]: associated function `bbbb` has an incompatible generic parameter for trait `Aaaaaa`
--> $DIR/mismatched_ty_const_in_trait_impl.rs:29:13
|
LL | trait Aaaaaa {
Expand All @@ -50,7 +50,7 @@ LL | impl Aaaaaa for () {
LL | fn bbbb<T, const N: u32>() {}
| ^ found type parameter

error[E0053]: method `abcd` has an incompatible generic parameter for trait `Names`
error[E0053]: associated function `abcd` has an incompatible generic parameter for trait `Names`
--> $DIR/mismatched_ty_const_in_trait_impl.rs:37:13
|
LL | trait Names {
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/delegation/not-supported.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ mod generics {
//~| ERROR method `foo2` has 0 type parameters but its trait declaration has 1 type parameter
reuse <F as Trait>::foo3;
//~^ ERROR early bound generics are not supported for associated delegation items
//~| ERROR lifetime parameters or bounds on method `foo3` do not match the trait declaration
//~| ERROR lifetime parameters or bounds on associated function `foo3` do not match the trait declaration
}

struct GenericS<T>(T);
Expand Down
6 changes: 3 additions & 3 deletions tests/ui/delegation/not-supported.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,14 @@ LL | fn foo3<'a: 'a>(_: &'a u32) {}
LL | reuse <F as Trait>::foo3;
| ^^^^

error[E0195]: lifetime parameters or bounds on method `foo3` do not match the trait declaration
error[E0195]: lifetime parameters or bounds on associated function `foo3` do not match the trait declaration
--> $DIR/not-supported.rs:54:29
|
LL | fn foo3<'a: 'a>(_: &'a u32) {}
| -------- lifetimes in impl do not match this method in trait
| -------- lifetimes in impl do not match this associated function in trait
...
LL | reuse <F as Trait>::foo3;
| ^^^^ lifetimes do not match method in trait
| ^^^^ lifetimes do not match associated function in trait

error: delegation to a function with effect parameter is not supported yet
--> $DIR/not-supported.rs:112:18
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/error-codes/E0049.stderr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0049]: method `foo` has 0 type parameters but its trait declaration has 1 type parameter
error[E0049]: associated function `foo` has 0 type parameters but its trait declaration has 1 type parameter
--> $DIR/E0049.rs:8:11
|
LL | fn foo<T: Default>(x: T) -> Self;
Expand All @@ -7,7 +7,7 @@ LL | fn foo<T: Default>(x: T) -> Self;
LL | fn foo(x: bool) -> Self { Bar }
| ^ found 0 type parameters

error[E0049]: method `fuzz` has 0 type parameters but its trait declaration has 2 type parameters
error[E0049]: associated function `fuzz` has 0 type parameters but its trait declaration has 2 type parameters
--> $DIR/E0049.rs:18:12
|
LL | fn fuzz<A: Default, B>(x: A, y: B) -> Self;
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/error-codes/E0195.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
trait Trait {
fn bar<'a,'b:'a>(x: &'a str, y: &'b str);
//~^ NOTE lifetimes in impl do not match this method in trait
//~^ NOTE lifetimes in impl do not match this associated function in trait
}

struct Foo;

impl Trait for Foo {
fn bar<'a,'b>(x: &'a str, y: &'b str) { //~ ERROR E0195
//~^ NOTE lifetimes do not match method in trait
//~^ NOTE lifetimes do not match associated function in trait
}
}

Expand Down
6 changes: 3 additions & 3 deletions tests/ui/error-codes/E0195.stderr
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
error[E0195]: lifetime parameters or bounds on method `bar` do not match the trait declaration
error[E0195]: lifetime parameters or bounds on associated function `bar` do not match the trait declaration
--> $DIR/E0195.rs:9:11
|
LL | fn bar<'a,'b:'a>(x: &'a str, y: &'b str);
| ---------- lifetimes in impl do not match this method in trait
| ---------- lifetimes in impl do not match this associated function in trait
...
LL | fn bar<'a,'b>(x: &'a str, y: &'b str) {
| ^^^^^^^ lifetimes do not match method in trait
| ^^^^^^^ lifetimes do not match associated function in trait

error: aborting due to 1 previous error

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ impl<T> X for T { //~ ERROR: not all trait items implemented
fn foo<'a, T1: X<Y = T1>>(t : T1) -> T1::Y<'a> {
//~^ ERROR missing generics for associated type
//~^^ ERROR missing generics for associated type
//~| ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters
//~| ERROR associated function `foo` has 1 type parameter but its trait declaration has 0 type parameters
t
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
error[E0049]: associated function `foo` has 1 type parameter but its trait declaration has 0 type parameters
--> $DIR/gat-trait-path-missing-lifetime.rs:8:10
|
LL | fn foo<'a>(t : Self::Y<'a>) -> Self::Y<'a> { t }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ trait Foo {

impl Foo for S {
fn bar() -> impl Sized {}
//~^ ERROR method `bar` has 0 type parameters but its trait declaration has 1 type parameter
//~^ ERROR associated function `bar` has 0 type parameters but its trait declaration has 1 type parameter
}

fn main() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0049]: method `bar` has 0 type parameters but its trait declaration has 1 type parameter
error[E0049]: associated function `bar` has 0 type parameters but its trait declaration has 1 type parameter
--> $DIR/trait-more-generics-than-impl.rs:8:11
|
LL | fn bar<T>() -> impl Sized;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ error: `~const` can only be applied to `#[const_trait]` traits
LL | const fn a<T: ~const Destruct>(_: T) {}
| ^^^^^^^^

error[E0049]: method `foo` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `foo` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-drop.rs:54:5
|
LL | #[const_trait]
Expand All @@ -49,7 +49,7 @@ LL | pub trait SomeTrait {
LL | fn foo();
| - expected 0 const parameters

error[E0049]: method `foo` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `foo` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-drop.rs:54:5
|
LL | #[const_trait]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ error: `~const` can only be applied to `#[const_trait]` traits
LL | const fn a<T: ~const Destruct>(_: T) {}
| ^^^^^^^^

error[E0049]: method `foo` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `foo` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-drop.rs:54:5
|
LL | #[const_trait]
Expand All @@ -49,7 +49,7 @@ LL | pub trait SomeTrait {
LL | fn foo();
| - expected 0 const parameters

error[E0049]: method `foo` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `foo` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-drop.rs:54:5
|
LL | #[const_trait]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0049]: method `bar` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `bar` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-default-bound-non-const-specialized-bound.rs:16:1
|
LL | #[const_trait]
Expand All @@ -16,7 +16,7 @@ LL | | T: Foo, //FIXME ~ ERROR missing `~const` qualifier
LL | | T: Specialize,
| |__________________^

error[E0049]: method `baz` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `baz` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-default-bound-non-const-specialized-bound.rs:36:1
|
LL | #[const_trait]
Expand All @@ -25,7 +25,7 @@ LL | trait Baz {
LL | fn baz();
| - expected 0 const parameters

error[E0049]: method `baz` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `baz` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-default-bound-non-const-specialized-bound.rs:36:1
|
LL | #[const_trait]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0049]: method `value` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `value` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-default-const-specialized.rs:10:1
|
LL | #[const_trait]
Expand All @@ -7,7 +7,7 @@ LL | trait Value {
LL | fn value() -> u32;
| - expected 0 const parameters

error[E0049]: method `value` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `value` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/const-default-const-specialized.rs:10:1
|
LL | #[const_trait]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0049]: method `foo` has 1 const parameter but its trait declaration has 0 const parameters
error[E0049]: associated function `foo` has 1 const parameter but its trait declaration has 0 const parameters
--> $DIR/default-keyword.rs:7:1
|
LL | #[const_trait]
Expand Down
Loading

0 comments on commit 78ff8c4

Please sign in to comment.