diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2022-06-02 13:15:56 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2022-06-02 15:04:46 -0700 |
| commit | f9aa2e02cdfdeea64ed58d2956047c2c155186f3 (patch) | |
| tree | 4411fe18f1a15bd57dcde122fc8442207269e20a /compiler | |
| parent | 8567b686f9b5f85b18341d77814088a4a7409238 (diff) | |
| download | rust-f9aa2e02cdfdeea64ed58d2956047c2c155186f3.tar.gz rust-f9aa2e02cdfdeea64ed58d2956047c2c155186f3.zip | |
Tweak output
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_typeck/src/coherence/builtin.rs | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/compiler/rustc_typeck/src/coherence/builtin.rs b/compiler/rustc_typeck/src/coherence/builtin.rs index 5953a13506d..c809b8bdd73 100644 --- a/compiler/rustc_typeck/src/coherence/builtin.rs +++ b/compiler/rustc_typeck/src/coherence/builtin.rs @@ -2,7 +2,7 @@ //! up data structures required by type-checking/codegen. 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::def_id::{DefId, LocalDefId}; 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::predicate_for_trait_def; use rustc_trait_selection::traits::{self, ObligationCause, TraitEngine, TraitEngineExt}; +use std::collections::BTreeMap; pub fn check_trait(tcx: TyCtxt<'_>, trait_def_id: DefId) { 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(); } } + let mut errors: BTreeMap<_, Vec<_>> = Default::default(); let mut bounds = vec![]; 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 // contains a foreign type or if it's a deeply nested type... if error_predicate != error.root_obligation.predicate { - err.span_note( - error.obligation.cause.span, - &format!( - "the `Copy` impl for `{}` requires that `{}`", - ty, error_predicate - ), - ); + errors + .entry((ty.to_string(), error_predicate.to_string())) + .or_default() + .push(error.obligation.cause.span); } if let ty::PredicateKind::Trait(ty::TraitPredicate { 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 { suggest_constraining_type_params( tcx, |
