1
Fork 0

Tweak output

This commit is contained in:
Esteban Küber 2022-06-02 13:15:56 -07:00
parent 8567b686f9
commit f9aa2e02cd
3 changed files with 14 additions and 14 deletions

View file

@ -2,7 +2,7 @@
//! up data structures required by type-checking/codegen. //! up data structures required by type-checking/codegen.
use crate::errors::{CopyImplOnNonAdt, CopyImplOnTypeWithDtor, DropImplOnWrongItem}; use crate::errors::{CopyImplOnNonAdt, CopyImplOnTypeWithDtor, DropImplOnWrongItem};
use rustc_errors::struct_span_err; use rustc_errors::{struct_span_err, MultiSpan};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::lang_items::LangItem; use rustc_hir::lang_items::LangItem;
@ -16,6 +16,7 @@ use rustc_trait_selection::traits::error_reporting::InferCtxtExt;
use rustc_trait_selection::traits::misc::{can_type_implement_copy, CopyImplementationError}; use rustc_trait_selection::traits::misc::{can_type_implement_copy, CopyImplementationError};
use rustc_trait_selection::traits::predicate_for_trait_def; use rustc_trait_selection::traits::predicate_for_trait_def;
use rustc_trait_selection::traits::{self, ObligationCause, TraitEngine, TraitEngineExt}; use rustc_trait_selection::traits::{self, ObligationCause, TraitEngine, TraitEngineExt};
use std::collections::BTreeMap;
pub fn check_trait(tcx: TyCtxt<'_>, trait_def_id: DefId) { pub fn check_trait(tcx: TyCtxt<'_>, trait_def_id: DefId) {
let lang_items = tcx.lang_items(); let lang_items = tcx.lang_items();
@ -101,6 +102,7 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) {
generics = self_item.kind.generics(); generics = self_item.kind.generics();
} }
} }
let mut errors: BTreeMap<_, Vec<_>> = Default::default();
let mut bounds = vec![]; let mut bounds = vec![];
for (field, ty) in fields { for (field, ty) in fields {
@ -127,13 +129,10 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) {
// FIXME: This error could be more descriptive, especially if the error_predicate // FIXME: This error could be more descriptive, especially if the error_predicate
// contains a foreign type or if it's a deeply nested type... // contains a foreign type or if it's a deeply nested type...
if error_predicate != error.root_obligation.predicate { if error_predicate != error.root_obligation.predicate {
err.span_note( errors
error.obligation.cause.span, .entry((ty.to_string(), error_predicate.to_string()))
&format!( .or_default()
"the `Copy` impl for `{}` requires that `{}`", .push(error.obligation.cause.span);
ty, error_predicate
),
);
} }
if let ty::PredicateKind::Trait(ty::TraitPredicate { if let ty::PredicateKind::Trait(ty::TraitPredicate {
trait_ref, trait_ref,
@ -153,6 +152,13 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) {
} }
}); });
} }
for ((ty, error_predicate), spans) in errors {
let span: MultiSpan = spans.into();
err.span_note(
span,
&format!("the `Copy` impl for `{}` requires that `{}`", ty, error_predicate),
);
}
if let Some(generics) = generics { if let Some(generics) = generics {
suggest_constraining_type_params( suggest_constraining_type_params(
tcx, tcx,

View file

@ -14,9 +14,6 @@ note: the `Copy` impl for `Vector2<K>` requires that `K: Debug`
| |
LL | pub loc: Vector2<K>, LL | pub loc: Vector2<K>,
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
note: the `Copy` impl for `Vector2<K>` requires that `K: Debug`
--> $DIR/missing-bound-in-derive-copy-impl-3.rs:13:5
|
LL | pub size: Vector2<K> LL | pub size: Vector2<K>
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^
= note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -14,9 +14,6 @@ note: the `Copy` impl for `Vector2<K>` requires that `K: Debug`
| |
LL | pub loc: Vector2<K>, LL | pub loc: Vector2<K>,
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
note: the `Copy` impl for `Vector2<K>` requires that `K: Debug`
--> $DIR/missing-bound-in-derive-copy-impl.rs:12:5
|
LL | pub size: Vector2<K> LL | pub size: Vector2<K>
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^
= note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)