Mention implementers of unsatisfied trait
When encountering an unsatisfied trait bound, if there are no other suggestions, mention all the types that *do* implement that trait: ``` error[E0277]: the trait bound `f32: Foo` is not satisfied --> $DIR/impl_wf.rs:22:6 | LL | impl Baz<f32> for f32 { } | ^^^^^^^^ the trait `Foo` is not implemented for `f32` | = help: the following other types implement trait `Foo`: Option<T> i32 str note: required by a bound in `Baz` --> $DIR/impl_wf.rs:18:31 | LL | trait Baz<U: ?Sized> where U: Foo { } | ^^^ required by this bound in `Baz` ``` Mention implementers of traits in `ImplObligation`s. Do not mention other `impl`s for closures, ranges and `?`.
This commit is contained in:
parent
6a9080b25e
commit
3aac307ca6
115 changed files with 690 additions and 183 deletions
|
@ -1,10 +1,9 @@
|
|||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_middle::mir::visit::{PlaceContext, Visitor};
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_session::lint::builtin::UNALIGNED_REFERENCES;
|
||||
use rustc_span::symbol::sym;
|
||||
|
||||
use crate::util;
|
||||
use crate::MirLint;
|
||||
|
@ -50,22 +49,6 @@ fn unsafe_derive_on_repr_packed(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
|||
});
|
||||
}
|
||||
|
||||
fn builtin_derive_def_id(tcx: TyCtxt<'_>, def_id: DefId) -> Option<DefId> {
|
||||
debug!("builtin_derive_def_id({:?})", def_id);
|
||||
if let Some(impl_def_id) = tcx.impl_of_method(def_id) {
|
||||
if tcx.has_attr(impl_def_id, sym::automatically_derived) {
|
||||
debug!("builtin_derive_def_id({:?}) - is {:?}", def_id, impl_def_id);
|
||||
Some(impl_def_id)
|
||||
} else {
|
||||
debug!("builtin_derive_def_id({:?}) - not automatically derived", def_id);
|
||||
None
|
||||
}
|
||||
} else {
|
||||
debug!("builtin_derive_def_id({:?}) - not a method", def_id);
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Visitor<'tcx> for PackedRefChecker<'_, 'tcx> {
|
||||
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
||||
// Make sure we know where in the MIR we are.
|
||||
|
@ -83,7 +66,11 @@ impl<'tcx> Visitor<'tcx> for PackedRefChecker<'_, 'tcx> {
|
|||
if context.is_borrow() {
|
||||
if util::is_disaligned(self.tcx, self.body, self.param_env, *place) {
|
||||
let def_id = self.body.source.instance.def_id();
|
||||
if let Some(impl_def_id) = builtin_derive_def_id(self.tcx, def_id) {
|
||||
if let Some(impl_def_id) = self
|
||||
.tcx
|
||||
.impl_of_method(def_id)
|
||||
.filter(|&def_id| self.tcx.is_builtin_derive(def_id))
|
||||
{
|
||||
// If a method is defined in the local crate,
|
||||
// the impl containing that method should also be.
|
||||
self.tcx.ensure().unsafe_derive_on_repr_packed(impl_def_id.expect_local());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue