Rollup merge of #112508 - compiler-errors:trait-sig-lifetime-sugg-ice, r=cjgillot

Tweak spans for self arg, fix borrow suggestion for signature mismatch

1. Adjust a suggestion message that was annoying me
2. Fix #112503 by recording the right spans for the `self` part of the `&self` 0th argument
3. Remove the suggestion for adjusting a trait signature on type mismatch, bc that's gonna probably break all the other impls of the trait even if it fixes its one usage 😅
This commit is contained in:
Matthias Krüger 2023-07-22 19:57:35 +02:00 committed by GitHub
commit 0ed5f091a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 139 additions and 39 deletions

View File

@ -2353,7 +2353,12 @@ impl Param {
/// Builds a `Param` object from `ExplicitSelf`. /// Builds a `Param` object from `ExplicitSelf`.
pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param { pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
let span = eself.span.to(eself_ident.span); let span = eself.span.to(eself_ident.span);
let infer_ty = P(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span, tokens: None }); let infer_ty = P(Ty {
id: DUMMY_NODE_ID,
kind: TyKind::ImplicitSelf,
span: eself_ident.span,
tokens: None,
});
let (mutbl, ty) = match eself.node { let (mutbl, ty) = match eself.node {
SelfKind::Explicit(ty, mutbl) => (mutbl, ty), SelfKind::Explicit(ty, mutbl) => (mutbl, ty),
SelfKind::Value(mutbl) => (mutbl, infer_ty), SelfKind::Value(mutbl) => (mutbl, infer_ty),

View File

@ -1,3 +1,13 @@
trait_selection_adjust_signature_borrow = consider adjusting the signature so it borrows its {$len ->
[one] argument
*[other] arguments
}
trait_selection_adjust_signature_remove_borrow = consider adjusting the signature so it does not borrow its {$len ->
[one] argument
*[other] arguments
}
trait_selection_dump_vtable_entries = vtable entries for `{$trait_ref}`: {$entries} trait_selection_dump_vtable_entries = vtable entries for `{$trait_ref}`: {$entries}
trait_selection_empty_on_clause_in_rustc_on_unimplemented = empty `on`-clause in `#[rustc_on_unimplemented]` trait_selection_empty_on_clause_in_rustc_on_unimplemented = empty `on`-clause in `#[rustc_on_unimplemented]`

View File

@ -1,5 +1,8 @@
use crate::fluent_generated as fluent; use crate::fluent_generated as fluent;
use rustc_errors::{ErrorGuaranteed, Handler, IntoDiagnostic}; use rustc_errors::{
AddToDiagnostic, Applicability, Diagnostic, ErrorGuaranteed, Handler, IntoDiagnostic,
SubdiagnosticMessage,
};
use rustc_macros::Diagnostic; use rustc_macros::Diagnostic;
use rustc_middle::ty::{self, PolyTraitRef, Ty}; use rustc_middle::ty::{self, PolyTraitRef, Ty};
use rustc_span::{Span, Symbol}; use rustc_span::{Span, Symbol};
@ -97,3 +100,34 @@ pub struct InherentProjectionNormalizationOverflow {
pub span: Span, pub span: Span,
pub ty: String, pub ty: String,
} }
pub enum AdjustSignatureBorrow {
Borrow { to_borrow: Vec<(Span, String)> },
RemoveBorrow { remove_borrow: Vec<(Span, String)> },
}
impl AddToDiagnostic for AdjustSignatureBorrow {
fn add_to_diagnostic_with<F>(self, diag: &mut Diagnostic, _: F)
where
F: Fn(&mut Diagnostic, SubdiagnosticMessage) -> SubdiagnosticMessage,
{
match self {
AdjustSignatureBorrow::Borrow { to_borrow } => {
diag.set_arg("len", to_borrow.len());
diag.multipart_suggestion_verbose(
fluent::trait_selection_adjust_signature_borrow,
to_borrow,
Applicability::MaybeIncorrect,
);
}
AdjustSignatureBorrow::RemoveBorrow { remove_borrow } => {
diag.set_arg("len", remove_borrow.len());
diag.multipart_suggestion_verbose(
fluent::trait_selection_adjust_signature_remove_borrow,
remove_borrow,
Applicability::MaybeIncorrect,
);
}
}
}
}

View File

@ -5,6 +5,7 @@ use super::{
PredicateObligation, PredicateObligation,
}; };
use crate::errors;
use crate::infer::InferCtxt; use crate::infer::InferCtxt;
use crate::traits::{NormalizeExt, ObligationCtxt}; use crate::traits::{NormalizeExt, ObligationCtxt};
@ -4031,6 +4032,10 @@ fn hint_missing_borrow<'tcx>(
found_node: Node<'_>, found_node: Node<'_>,
err: &mut Diagnostic, err: &mut Diagnostic,
) { ) {
if matches!(found_node, Node::TraitItem(..)) {
return;
}
let found_args = match found.kind() { let found_args = match found.kind() {
ty::FnPtr(f) => infcx.instantiate_binder_with_placeholders(*f).inputs().iter(), ty::FnPtr(f) => infcx.instantiate_binder_with_placeholders(*f).inputs().iter(),
kind => { kind => {
@ -4102,19 +4107,11 @@ fn hint_missing_borrow<'tcx>(
} }
if !to_borrow.is_empty() { if !to_borrow.is_empty() {
err.multipart_suggestion_verbose( err.subdiagnostic(errors::AdjustSignatureBorrow::Borrow { to_borrow });
"consider borrowing the argument",
to_borrow,
Applicability::MaybeIncorrect,
);
} }
if !remove_borrow.is_empty() { if !remove_borrow.is_empty() {
err.multipart_suggestion_verbose( err.subdiagnostic(errors::AdjustSignatureBorrow::RemoveBorrow { remove_borrow });
"do not borrow the argument",
remove_borrow,
Applicability::MaybeIncorrect,
);
} }
} }

View File

@ -13,7 +13,7 @@ note: required by a bound in `f1`
| |
LL | fn f1<F>(_: F) where F: Fn(&(), &()) {} LL | fn f1<F>(_: F) where F: Fn(&(), &()) {}
| ^^^^^^^^^^^^ required by this bound in `f1` | ^^^^^^^^^^^^ required by this bound in `f1`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | f1(|_: &(), _: &()| {}); LL | f1(|_: &(), _: &()| {});
| + + | + +
@ -33,7 +33,7 @@ note: required by a bound in `f2`
| |
LL | fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {} LL | fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f2` | ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f2`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | f2(|_: &(), _: &()| {}); LL | f2(|_: &(), _: &()| {});
| + + | + +
@ -53,7 +53,7 @@ note: required by a bound in `f3`
| |
LL | fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {} LL | fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {}
| ^^^^^^^^^^^^^^^ required by this bound in `f3` | ^^^^^^^^^^^^^^^ required by this bound in `f3`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | f3(|_: &(), _: &()| {}); LL | f3(|_: &(), _: &()| {});
| + + | + +
@ -73,7 +73,7 @@ note: required by a bound in `f4`
| |
LL | fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {} LL | fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f4` | ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f4`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | f4(|_: &(), _: &()| {}); LL | f4(|_: &(), _: &()| {});
| + + | + +
@ -93,7 +93,7 @@ note: required by a bound in `f5`
| |
LL | fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {} LL | fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f5` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f5`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | f5(|_: &(), _: &()| {}); LL | f5(|_: &(), _: &()| {});
| + + | + +
@ -113,7 +113,7 @@ note: required by a bound in `g1`
| |
LL | fn g1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>) {} LL | fn g1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g1` | ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g1`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | g1(|_: &(), _: ()| {}); LL | g1(|_: &(), _: ()| {});
| + | +
@ -133,7 +133,7 @@ note: required by a bound in `g2`
| |
LL | fn g2<F>(_: F) where F: Fn(&(), fn(&())) {} LL | fn g2<F>(_: F) where F: Fn(&(), fn(&())) {}
| ^^^^^^^^^^^^^^^^ required by this bound in `g2` | ^^^^^^^^^^^^^^^^ required by this bound in `g2`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | g2(|_: &(), _: ()| {}); LL | g2(|_: &(), _: ()| {});
| + | +
@ -153,7 +153,7 @@ note: required by a bound in `g3`
| |
LL | fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<dyn Fn(&())>) {} LL | fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<dyn Fn(&())>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g3` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g3`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | g3(|_: &(), _: ()| {}); LL | g3(|_: &(), _: ()| {});
| + | +
@ -173,7 +173,7 @@ note: required by a bound in `g4`
| |
LL | fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {} LL | fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g4` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g4`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | g4(|_: &(), _: ()| {}); LL | g4(|_: &(), _: ()| {});
| + | +
@ -193,7 +193,7 @@ note: required by a bound in `h1`
| |
LL | fn h1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>, &(), fn(&(), &())) {} LL | fn h1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>, &(), fn(&(), &())) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h1` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h1`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | h1(|_: &(), _: (), _: &(), _: ()| {}); LL | h1(|_: &(), _: (), _: &(), _: ()| {});
| + + | + +
@ -213,7 +213,7 @@ note: required by a bound in `h2`
| |
LL | fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<dyn Fn(&())>, &'t0 (), fn(&(), &())) {} LL | fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<dyn Fn(&())>, &'t0 (), fn(&(), &())) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h2` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h2`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its arguments
| |
LL | h2(|_: &(), _: (), _: &(), _: ()| {}); LL | h2(|_: &(), _: (), _: &(), _: ()| {});
| + + | + +

View File

@ -18,7 +18,7 @@ note: required by a bound in `foo`
| |
LL | fn foo<F: Fn(&char) -> bool + Fn(char) -> bool>(f: F) { LL | fn foo<F: Fn(&char) -> bool + Fn(char) -> bool>(f: F) {
| ^^^^^^^^^^^^^^^^ required by this bound in `foo` | ^^^^^^^^^^^^^^^^ required by this bound in `foo`
help: do not borrow the argument help: consider adjusting the signature so it does not borrow its argument
| |
LL | foo(move |char| v); LL | foo(move |char| v);
| ~~~~ | ~~~~

View File

@ -15,10 +15,10 @@ LL | [T; 1]: Copy, T: std::marker::Copy // But `[T; 1]: Copy` does not imply
| ~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~
error[E0277]: the trait bound `T: Copy` is not satisfied error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/explicit-drop-bounds.rs:32:13 --> $DIR/explicit-drop-bounds.rs:32:18
| |
LL | fn drop(&mut self) {} LL | fn drop(&mut self) {}
| ^^^^^^^^^ the trait `Copy` is not implemented for `T` | ^^^^ the trait `Copy` is not implemented for `T`
| |
note: required by a bound in `DropMe` note: required by a bound in `DropMe`
--> $DIR/explicit-drop-bounds.rs:7:18 --> $DIR/explicit-drop-bounds.rs:7:18

View File

@ -15,10 +15,10 @@ LL | impl<T: std::marker::Copy> Drop for DropMe<T>
| +++++++++++++++++++ | +++++++++++++++++++
error[E0277]: the trait bound `T: Copy` is not satisfied error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/explicit-drop-bounds.rs:40:13 --> $DIR/explicit-drop-bounds.rs:40:18
| |
LL | fn drop(&mut self) {} LL | fn drop(&mut self) {}
| ^^^^^^^^^ the trait `Copy` is not implemented for `T` | ^^^^ the trait `Copy` is not implemented for `T`
| |
note: required by a bound in `DropMe` note: required by a bound in `DropMe`
--> $DIR/explicit-drop-bounds.rs:7:18 --> $DIR/explicit-drop-bounds.rs:7:18

View File

@ -10,7 +10,7 @@ LL | let _ = (-10..=10).find(|x: i32| x.signum() == 0);
found closure signature `fn(i32) -> _` found closure signature `fn(i32) -> _`
note: required by a bound in `find` note: required by a bound in `find`
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | let _ = (-10..=10).find(|x: &i32| x.signum() == 0); LL | let _ = (-10..=10).find(|x: &i32| x.signum() == 0);
| + | +
@ -27,7 +27,7 @@ LL | let _ = (-10..=10).find(|x: &&&i32| x.signum() == 0);
found closure signature `for<'a, 'b, 'c> fn(&'a &'b &'c i32) -> _` found closure signature `for<'a, 'b, 'c> fn(&'a &'b &'c i32) -> _`
note: required by a bound in `find` note: required by a bound in `find`
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
help: do not borrow the argument help: consider adjusting the signature so it does not borrow its argument
| |
LL - let _ = (-10..=10).find(|x: &&&i32| x.signum() == 0); LL - let _ = (-10..=10).find(|x: &&&i32| x.signum() == 0);
LL + let _ = (-10..=10).find(|x: &i32| x.signum() == 0); LL + let _ = (-10..=10).find(|x: &i32| x.signum() == 0);

View File

@ -10,7 +10,7 @@ LL | a.iter().map(|_: (u32, u32)| 45);
found closure signature `fn((u32, u32)) -> _` found closure signature `fn((u32, u32)) -> _`
note: required by a bound in `map` note: required by a bound in `map`
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | a.iter().map(|_: &(u32, u32)| 45); LL | a.iter().map(|_: &(u32, u32)| 45);
| + | +

View File

@ -10,7 +10,7 @@ LL | once::<&str>("str").fuse().filter(|a: &str| true).count();
found closure signature `for<'a> fn(&'a str) -> _` found closure signature `for<'a> fn(&'a str) -> _`
note: required by a bound in `filter` note: required by a bound in `filter`
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | once::<&str>("str").fuse().filter(|a: &&str| true).count(); LL | once::<&str>("str").fuse().filter(|a: &&str| true).count();
| + | +

View File

@ -13,7 +13,7 @@ LL | let _has_inference_vars: Option<i32> = Some(0).map(deref_int);
found function signature `for<'a> fn(&'a i32) -> _` found function signature `for<'a> fn(&'a i32) -> _`
note: required by a bound in `Option::<T>::map` note: required by a bound in `Option::<T>::map`
--> $SRC_DIR/core/src/option.rs:LL:COL --> $SRC_DIR/core/src/option.rs:LL:COL
help: do not borrow the argument help: consider adjusting the signature so it does not borrow its argument
| |
LL - fn deref_int(a: &i32) -> i32 { LL - fn deref_int(a: &i32) -> i32 {
LL + fn deref_int(a: i32) -> i32 { LL + fn deref_int(a: i32) -> i32 {

View File

@ -17,7 +17,7 @@ fn generic<T>(_: T) -> Option<()> {
} }
fn generic_ref<T>(_: T) -> Option<()> { fn generic_ref<T>(_: T) -> Option<()> {
//~^ HELP do not borrow the argument //~^ HELP consider adjusting the signature so it does not borrow its argument
Some(()) Some(())
} }

View File

@ -17,7 +17,7 @@ fn generic<T>(_: T) -> Option<()> {
} }
fn generic_ref<T>(_: &T) -> Option<()> { fn generic_ref<T>(_: &T) -> Option<()> {
//~^ HELP do not borrow the argument //~^ HELP consider adjusting the signature so it does not borrow its argument
Some(()) Some(())
} }

View File

@ -73,7 +73,7 @@ LL | let _ = produces_string().and_then(generic_ref);
found function signature `for<'a> fn(&'a _) -> _` found function signature `for<'a> fn(&'a _) -> _`
note: required by a bound in `Option::<T>::and_then` note: required by a bound in `Option::<T>::and_then`
--> $SRC_DIR/core/src/option.rs:LL:COL --> $SRC_DIR/core/src/option.rs:LL:COL
help: do not borrow the argument help: consider adjusting the signature so it does not borrow its argument
| |
LL - fn generic_ref<T>(_: &T) -> Option<()> { LL - fn generic_ref<T>(_: &T) -> Option<()> {
LL + fn generic_ref<T>(_: T) -> Option<()> { LL + fn generic_ref<T>(_: T) -> Option<()> {

View File

@ -11,10 +11,10 @@ LL | impl<B: ?Sized + std::clone::Clone> Display for Cow<'_, B> {
| +++++++++++++++++++ | +++++++++++++++++++
error[E0277]: the trait bound `B: Clone` is not satisfied error[E0277]: the trait bound `B: Clone` is not satisfied
--> $DIR/issue-79224.rs:20:12 --> $DIR/issue-79224.rs:20:13
| |
LL | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { LL | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
| ^^^^^ the trait `Clone` is not implemented for `B` | ^^^^ the trait `Clone` is not implemented for `B`
| |
= note: required for `B` to implement `ToOwned` = note: required for `B` to implement `ToOwned`
help: consider further restricting this bound help: consider further restricting this bound

View File

@ -16,7 +16,7 @@ note: required by a bound in `Trader::<'a>::set_closure`
| |
LL | pub fn set_closure(&mut self, function: impl Fn(&mut Trader) + 'a) { LL | pub fn set_closure(&mut self, function: impl Fn(&mut Trader) + 'a) {
| ^^^^^^^^^^^^^^^ required by this bound in `Trader::<'a>::set_closure` | ^^^^^^^^^^^^^^^ required by this bound in `Trader::<'a>::set_closure`
help: consider borrowing the argument help: consider adjusting the signature so it borrows its argument
| |
LL | let closure = |trader : &mut Trader| { LL | let closure = |trader : &mut Trader| {
| ++++ | ++++

View File

@ -0,0 +1,17 @@
pub trait Insertable {
type Values;
fn values(&self) -> Self::Values;
}
impl<T> Insertable for Option<T> {
type Values = ();
fn values(self) -> Self::Values {
//~^ ERROR method `values` has an incompatible type for trait
self.map(Insertable::values).unwrap_or_default()
//~^ ERROR type mismatch in function arguments
}
}
fn main() {}

View File

@ -0,0 +1,37 @@
error[E0053]: method `values` has an incompatible type for trait
--> $DIR/mismatched-map-under-self.rs:10:15
|
LL | fn values(self) -> Self::Values {
| ^^^^
| |
| expected `&Option<T>`, found `Option<T>`
| help: change the self-receiver type to match the trait: `&self`
|
note: type in trait
--> $DIR/mismatched-map-under-self.rs:4:15
|
LL | fn values(&self) -> Self::Values;
| ^^^^^
= note: expected signature `fn(&Option<T>)`
found signature `fn(Option<T>)`
error[E0631]: type mismatch in function arguments
--> $DIR/mismatched-map-under-self.rs:12:18
|
LL | fn values(&self) -> Self::Values;
| --------------------------------- found signature defined here
...
LL | self.map(Insertable::values).unwrap_or_default()
| --- ^^^^^^^^^^^^^^^^^^ expected due to this
| |
| required by a bound introduced by this call
|
= note: expected function signature `fn(T) -> _`
found function signature `for<'a> fn(&'a _) -> _`
note: required by a bound in `Option::<T>::map`
--> $SRC_DIR/core/src/option.rs:LL:COL
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0053, E0631.
For more information about an error, try `rustc --explain E0053`.