Modify bounds_span to ignore bounds coming from a derive macro

This commit is contained in:
Esteban Kuber 2021-11-17 23:35:38 +00:00
parent e70105f971
commit fa3eebb26e
2 changed files with 24 additions and 15 deletions

View file

@ -17,7 +17,7 @@ use rustc_index::vec::IndexVec;
use rustc_macros::HashStable_Generic;
use rustc_span::source_map::Spanned;
use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{def_id::LocalDefId, BytePos, MultiSpan, Span, DUMMY_SP};
use rustc_span::{def_id::LocalDefId, BytePos, ExpnKind, MacroKind, MultiSpan, Span, DUMMY_SP};
use rustc_target::asm::InlineAsmRegOrRegClass;
use rustc_target::spec::abi::Abi;
@ -527,8 +527,17 @@ pub struct GenericParam<'hir> {
impl GenericParam<'hir> {
pub fn bounds_span(&self) -> Option<Span> {
self.bounds.iter().fold(None, |span, bound| {
let span = span.map(|s| s.to(bound.span())).unwrap_or_else(|| bound.span());
Some(span)
if let ExpnKind::Macro(MacroKind::Derive, _) =
bound.span().ctxt().outer_expn_data().kind
{
// We ignore bounds that come from exclusively from a `#[derive(_)]`, because we
// can't really point at them, and we sometimes use this method to get a span
// appropriate for suggestions.
span
} else {
let span = span.map(|s| s.to(bound.span())).unwrap_or_else(|| bound.span());
Some(span)
}
})
}
}

View file

@ -31,10 +31,10 @@ LL | impl<T: Debug + Trait> Debug for Inner<T> {
= note: required because of the requirements on the impl of `Debug` for `&c::Inner<T>`
= note: required for the cast to the object type `dyn Debug`
= note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider further restricting this bound
help: consider restricting type parameter `T`
|
LL | #[derive(Debug + c::Trait)]
| ++++++++++
LL | struct Outer<T: c::Trait>(Inner<T>);
| ++++++++++
error[E0277]: the trait bound `T: d::Trait` is not satisfied
--> $DIR/derive-macro-missing-bounds.rs:56:21
@ -53,10 +53,10 @@ LL | impl<T> Debug for Inner<T> where T: Debug, T: Trait {
= note: required because of the requirements on the impl of `Debug` for `&d::Inner<T>`
= note: required for the cast to the object type `dyn Debug`
= note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider further restricting this bound
help: consider restricting type parameter `T`
|
LL | #[derive(Debug + d::Trait)]
| ++++++++++
LL | struct Outer<T: d::Trait>(Inner<T>);
| ++++++++++
error[E0277]: the trait bound `T: e::Trait` is not satisfied
--> $DIR/derive-macro-missing-bounds.rs:71:21
@ -75,10 +75,10 @@ LL | impl<T> Debug for Inner<T> where T: Debug + Trait {
= note: required because of the requirements on the impl of `Debug` for `&e::Inner<T>`
= note: required for the cast to the object type `dyn Debug`
= note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider further restricting this bound
help: consider restricting type parameter `T`
|
LL | #[derive(Debug + e::Trait)]
| ++++++++++
LL | struct Outer<T: e::Trait>(Inner<T>);
| ++++++++++
error[E0277]: the trait bound `T: f::Trait` is not satisfied
--> $DIR/derive-macro-missing-bounds.rs:86:21
@ -97,10 +97,10 @@ LL | impl<T: Debug> Debug for Inner<T> where T: Trait {
= note: required because of the requirements on the impl of `Debug` for `&f::Inner<T>`
= note: required for the cast to the object type `dyn Debug`
= note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider further restricting this bound
help: consider restricting type parameter `T`
|
LL | #[derive(Debug + f::Trait)]
| ++++++++++
LL | struct Outer<T: f::Trait>(Inner<T>);
| ++++++++++
error: aborting due to 5 previous errors