Don't lint for predicates generated in macros

This commit is contained in:
ThibsG 2020-07-03 11:48:28 +02:00
parent d5a8f03a35
commit 2d5930a3da
2 changed files with 38 additions and 14 deletions

@ -1,4 +1,5 @@
use crate::utils::{in_macro, snippet, snippet_with_applicability, span_lint_and_help, SpanlessHash};
use if_chain::if_chain;
use rustc_data_structures::fx::FxHashMap;
use rustc_errors::Applicability;
use rustc_hir::{GenericBound, Generics, WherePredicate};
@ -11,6 +12,8 @@ declare_clippy_lint! {
/// **Why is this bad?** Repeating the type for every bound makes the code
/// less readable than combining the bounds
///
/// **Known problems:** None.
///
/// **Example:**
/// ```rust
/// pub fn foo<T>(t: T) where T: Copy, T: Clone {}
@ -53,12 +56,14 @@ impl<'tcx> LateLintPass<'tcx> for TraitBounds {
let mut map = FxHashMap::default();
let mut applicability = Applicability::MaybeIncorrect;
for bound in gen.where_clause.predicates {
if let WherePredicate::BoundPredicate(ref p) = bound {
if p.bounds.len() as u64 > self.max_trait_bounds {
return;
}
if_chain! {
if let WherePredicate::BoundPredicate(ref p) = bound;
if p.bounds.len() as u64 <= self.max_trait_bounds;
if !in_macro(p.span);
let h = hash(&p.bounded_ty);
if let Some(ref v) = map.insert(h, p.bounds.iter().collect::<Vec<_>>()) {
if let Some(ref v) = map.insert(h, p.bounds.iter().collect::<Vec<_>>());
then {
let mut hint_string = format!(
"consider combining the bounds: `{}:",
snippet(cx, p.bounded_ty.span, "_")

@ -37,17 +37,36 @@ where
}
// Generic distinction (see #4323)
pub struct Foo<A>(A);
pub struct Bar<A, B> {
a: Foo<A>,
b: Foo<B>,
mod issue4323 {
pub struct Foo<A>(A);
pub struct Bar<A, B> {
a: Foo<A>,
b: Foo<B>,
}
impl<A, B> Unpin for Bar<A, B>
where
Foo<A>: Unpin,
Foo<B>: Unpin,
{
}
}
impl<A, B> Unpin for Bar<A, B>
where
Foo<A>: Unpin,
Foo<B>: Unpin,
{
// Extern macros shouldn't lint (see #4326)
extern crate serde;
mod issue4326 {
use serde::{Deserialize, Serialize};
trait Foo {}
impl Foo for String {}
#[derive(Debug, Serialize, Deserialize)]
struct Bar<S>
where
S: Foo,
{
foo: S,
}
}
fn main() {}