From 669a4035eff7e3cc6b295a68ce43cc342ec29ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 22 Oct 2019 12:40:46 -0700 Subject: [PATCH] review comments: move code, fix indentation and change span --- src/librustc/ty/wf.rs | 92 +++++++++++-------- ...int-at-type-on-obligation-failure-2.stderr | 13 ++- ...point-at-type-on-obligation-failure.stderr | 14 ++- .../issues/issue-43784-associated-type.stderr | 16 ++-- .../ui/traits/cycle-cache-err-60010.stderr | 13 ++- 5 files changed, 78 insertions(+), 70 deletions(-) diff --git a/src/librustc/ty/wf.rs b/src/librustc/ty/wf.rs index f9abd318505..84bcec6bd19 100644 --- a/src/librustc/ty/wf.rs +++ b/src/librustc/ty/wf.rs @@ -170,6 +170,53 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { let cause = self.cause(traits::MiscObligation); let param_env = self.param_env; + let item = &self.item; + let extend_cause_with_original_assoc_item_obligation = | + cause: &mut traits::ObligationCause<'_>, + pred: &ty::Predicate<'_>, + trait_assoc_items: ty::AssocItemsIterator<'_>, + | { + let item_span = item.map(|i| tcx.sess.source_map().def_span(i.span)); + match pred { + ty::Predicate::Projection(proj) => { + if let Some(hir::ItemKind::Impl(.., impl_items)) = item.map(|i| &i.kind) { + let trait_assoc_item = tcx.associated_item(proj.projection_def_id()); + if let Some(impl_item) = impl_items.iter().filter(|item| { + item.ident == trait_assoc_item.ident + }).next() { + cause.span = impl_item.span; + cause.code = traits::AssocTypeBound( + item_span, + trait_assoc_item.ident.span, + ); + } + } + } + ty::Predicate::Trait(proj) => { + if let ( + ty::Projection(ty::ProjectionTy { item_def_id, .. }), + Some(hir::ItemKind::Impl(.., impl_items)), + ) = (&proj.skip_binder().self_ty().kind, item.map(|i| &i.kind)) { + if let Some((impl_item, trait_assoc_item)) = trait_assoc_items + .filter(|i| i.def_id == *item_def_id) + .next() + .and_then(|trait_assoc_item| impl_items.iter() + .filter(|i| i.ident == trait_assoc_item.ident) + .next() + .map(|impl_item| (impl_item, trait_assoc_item))) + { + cause.span = impl_item.span; + cause.code = traits::AssocTypeBound( + item_span, + trait_assoc_item.ident.span, + ); + } + } + } + _ => {} + } + }; + if let Elaborate::All = elaborate { let trait_assoc_items = tcx.associated_items(trait_ref.def_id); @@ -177,48 +224,13 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { .map(|obligation| obligation.predicate.clone()) .collect(); let implied_obligations = traits::elaborate_predicates(tcx, predicates); - let item_span: Option = self.item.map(|i| i.span); - let item = &self.item; let implied_obligations = implied_obligations.map(|pred| { let mut cause = cause.clone(); - match &pred { - ty::Predicate::Projection(proj) => { - if let Some(hir::ItemKind::Impl(.., impl_items)) = item.map(|i| &i.kind) { - let trait_assoc_item = tcx.associated_item(proj.projection_def_id()); - if let Some(impl_item) = impl_items.iter().filter(|item| { - item.ident == trait_assoc_item.ident - }).next() { - cause.span = impl_item.span; - cause.code = traits::AssocTypeBound( - item_span, - trait_assoc_item.ident.span, - ); - } - } - } - ty::Predicate::Trait(proj) => { - if let ( - ty::Projection(ty::ProjectionTy { item_def_id, .. }), - Some(hir::ItemKind::Impl(.., impl_items)), - ) = (&proj.skip_binder().self_ty().kind, item.map(|i| &i.kind)) { - if let Some((impl_item, trait_assoc_item)) = trait_assoc_items.clone() - .filter(|i| i.def_id == *item_def_id) - .next() - .and_then(|trait_assoc_item| impl_items.iter() - .filter(|i| i.ident == trait_assoc_item.ident) - .next() - .map(|impl_item| (impl_item, trait_assoc_item))) - { - cause.span = impl_item.span; - cause.code = traits::AssocTypeBound( - item_span, - trait_assoc_item.ident.span, - ); - } - } - } - _ => {} - } + extend_cause_with_original_assoc_item_obligation( + &mut cause, + &pred, + trait_assoc_items.clone(), + ); traits::Obligation::new(cause, param_env, pred) }); self.out.extend(implied_obligations); diff --git a/src/test/ui/associated-types/point-at-type-on-obligation-failure-2.stderr b/src/test/ui/associated-types/point-at-type-on-obligation-failure-2.stderr index 62bb9388633..f1a2e343a7e 100644 --- a/src/test/ui/associated-types/point-at-type-on-obligation-failure-2.stderr +++ b/src/test/ui/associated-types/point-at-type-on-obligation-failure-2.stderr @@ -1,14 +1,13 @@ error[E0277]: the trait bound `bool: Bar` is not satisfied --> $DIR/point-at-type-on-obligation-failure-2.rs:8:5 | -LL | type Assoc: Bar; - | ----- associated type defined here +LL | type Assoc: Bar; + | ----- associated type defined here ... -LL | / impl Foo for () { -LL | | type Assoc = bool; - | | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool` -LL | | } - | |_- in this `impl` item +LL | impl Foo for () { + | --------------- in this `impl` item +LL | type Assoc = bool; + | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool` error: aborting due to previous error diff --git a/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr b/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr index 95e8ebdd180..e4bd39c8ba6 100644 --- a/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr +++ b/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr @@ -1,15 +1,13 @@ error[E0271]: type mismatch resolving `::Ok == ()` --> $DIR/point-at-type-on-obligation-failure.rs:13:5 | -LL | type Ok; - | -- associated type defined here +LL | type Ok; + | -- associated type defined here ... -LL | / impl Bar for Foo { -LL | | type Ok = (); - | | ^^^^^^^^^^^^^ expected u32, found () -LL | | type Sibling = Foo2; -LL | | } - | |_- in this `impl` item +LL | impl Bar for Foo { + | ---------------- in this `impl` item +LL | type Ok = (); + | ^^^^^^^^^^^^^ expected u32, found () | = note: expected type `u32` found type `()` diff --git a/src/test/ui/issues/issue-43784-associated-type.stderr b/src/test/ui/issues/issue-43784-associated-type.stderr index cfab66302cd..33692bd254e 100644 --- a/src/test/ui/issues/issue-43784-associated-type.stderr +++ b/src/test/ui/issues/issue-43784-associated-type.stderr @@ -1,15 +1,15 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied --> $DIR/issue-43784-associated-type.rs:14:5 | -LL | type Assoc: Partial; - | ----- associated type defined here +LL | type Assoc: Partial; + | ----- associated type defined here ... -LL | / impl Complete for T { - | | - help: consider restricting this bound: `T: std::marker::Copy` -LL | | type Assoc = T; - | | ^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T` -LL | | } - | |_- in this `impl` item +LL | impl Complete for T { + | ---------------------- in this `impl` item + | | + | help: consider restricting this bound: `T: std::marker::Copy` +LL | type Assoc = T; + | ^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T` | = help: consider adding a `where T: std::marker::Copy` bound diff --git a/src/test/ui/traits/cycle-cache-err-60010.stderr b/src/test/ui/traits/cycle-cache-err-60010.stderr index a7b8dd05527..f439de88261 100644 --- a/src/test/ui/traits/cycle-cache-err-60010.stderr +++ b/src/test/ui/traits/cycle-cache-err-60010.stderr @@ -9,14 +9,13 @@ LL | _parse: >::Data, error[E0275]: overflow evaluating the requirement `RootDatabase: SourceDatabase` --> $DIR/cycle-cache-err-60010.rs:31:5 | -LL | type Storage; - | ------- associated type defined here +LL | type Storage; + | ------- associated type defined here ... -LL | / impl Database for RootDatabase { -LL | | type Storage = SalsaStorage; - | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -LL | | } - | |_- in this `impl` item +LL | impl Database for RootDatabase { + | ------------------------------ in this `impl` item +LL | type Storage = SalsaStorage; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: required because of the requirements on the impl of `Query` for `ParseQuery` = note: required because it appears within the type `SalsaStorage`