Skip to content

Commit

Permalink
Auto merge of rust-lang#10894 - Centri3:type_repetition_in_bounds, r=…
Browse files Browse the repository at this point in the history
…blyxyas,xFrednet

[`type_repetition_in_bounds`]: Don't lint on derived code

fixes rust-lang#10504.

changelog: [`type_repetition_in_bounds`]: Don't lint on derived code
  • Loading branch information
bors committed Jun 12, 2023
2 parents 841f219 + 4191de3 commit 903fe3b
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 9 deletions.
6 changes: 3 additions & 3 deletions clippy_lints/src/trait_bounds.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use clippy_utils::diagnostics::{span_lint_and_help, span_lint_and_sugg};
use clippy_utils::source::{snippet, snippet_opt, snippet_with_applicability};
use clippy_utils::{SpanlessEq, SpanlessHash};
use clippy_utils::{is_from_proc_macro, SpanlessEq, SpanlessHash};
use core::hash::{Hash, Hasher};
use if_chain::if_chain;
use itertools::Itertools;
Expand Down Expand Up @@ -260,7 +260,7 @@ impl TraitBounds {
SpanlessTy { ty: p.bounded_ty, cx },
p.bounds.iter().collect::<Vec<_>>()
);

if !is_from_proc_macro(cx, p.bounded_ty);
then {
let trait_bounds = v
.iter()
Expand Down Expand Up @@ -342,7 +342,7 @@ fn check_trait_bound_duplication(cx: &LateContext<'_>, gen: &'_ Generics<'_>) {
"this trait bound is already specified in the where clause",
None,
"consider removing this trait bound",
);
);
}
}
}
Expand Down
30 changes: 28 additions & 2 deletions clippy_utils/src/check_proc_macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ use rustc_ast::{
};
use rustc_hir::{
intravisit::FnKind, Block, BlockCheckMode, Body, Closure, Destination, Expr, ExprKind, FieldDef, FnHeader, HirId,
Impl, ImplItem, ImplItemKind, IsAuto, Item, ItemKind, LoopSource, MatchSource, Node, QPath, TraitItem,
TraitItemKind, UnOp, UnsafeSource, Unsafety, Variant, VariantData, YieldSource,
Impl, ImplItem, ImplItemKind, IsAuto, Item, ItemKind, LoopSource, MatchSource, MutTy, Node, QPath, TraitItem,
TraitItemKind, Ty, TyKind, UnOp, UnsafeSource, Unsafety, Variant, VariantData, YieldSource,
};
use rustc_lint::{LateContext, LintContext};
use rustc_middle::ty::TyCtxt;
Expand Down Expand Up @@ -319,6 +319,31 @@ fn attr_search_pat(attr: &Attribute) -> (Pat, Pat) {
}
}

fn ty_search_pat(ty: &Ty<'_>) -> (Pat, Pat) {
match ty.kind {
TyKind::Slice(..) | TyKind::Array(..) => (Pat::Str("["), Pat::Str("]")),
TyKind::Ptr(MutTy { mutbl, ty }) => (
if mutbl.is_mut() {
Pat::Str("*const")
} else {
Pat::Str("*mut")
},
ty_search_pat(ty).1,
),
TyKind::Ref(_, MutTy { ty, .. }) => (Pat::Str("&"), ty_search_pat(ty).1),
TyKind::BareFn(bare_fn) => (
Pat::OwnedStr(format!("{}{} fn", bare_fn.unsafety.prefix_str(), bare_fn.abi.name())),
ty_search_pat(ty).1,
),
TyKind::Never => (Pat::Str("!"), Pat::Str("")),
TyKind::Tup(..) => (Pat::Str("("), Pat::Str(")")),
TyKind::OpaqueDef(..) => (Pat::Str("impl"), Pat::Str("")),
TyKind::Path(qpath) => qpath_search_pat(&qpath),
// NOTE: This is missing `TraitObject`. It always return true then.
_ => (Pat::Str(""), Pat::Str("")),
}
}

pub trait WithSearchPat {
type Context: LintContext;
fn search_pat(&self, cx: &Self::Context) -> (Pat, Pat);
Expand All @@ -345,6 +370,7 @@ impl_with_search_pat!(LateContext: TraitItem with trait_item_search_pat);
impl_with_search_pat!(LateContext: ImplItem with impl_item_search_pat);
impl_with_search_pat!(LateContext: FieldDef with field_def_search_pat);
impl_with_search_pat!(LateContext: Variant with variant_search_pat);
impl_with_search_pat!(LateContext: Ty with ty_search_pat);

impl<'cx> WithSearchPat for (&FnKind<'cx>, &Body<'cx>, HirId, Span) {
type Context = LateContext<'cx>;
Expand Down
15 changes: 15 additions & 0 deletions tests/ui/type_repetition_in_bounds.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#![deny(clippy::type_repetition_in_bounds)]
#![allow(clippy::extra_unused_type_parameters)]

use serde::Deserialize;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};

pub fn foo<T>(_t: T)
Expand Down Expand Up @@ -70,6 +71,20 @@ mod issue4326 {
}
}

// Extern macros shouldn't lint, again (see #10504)
mod issue10504 {
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
use std::hash::Hash;

#[derive(Debug, Serialize, Deserialize)]
#[serde(bound(
serialize = "T: Serialize + Hash + Eq",
deserialize = "Box<T>: serde::de::DeserializeOwned + Hash + Eq"
))]
struct OpaqueParams<T: ?Sized + Debug>(std::marker::PhantomData<T>);
}

// Issue #7360
struct Foo<T, U>
where
Expand Down
8 changes: 4 additions & 4 deletions tests/ui/type_repetition_in_bounds.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: this type has already been used as a bound predicate
--> $DIR/type_repetition_in_bounds.rs:9:5
--> $DIR/type_repetition_in_bounds.rs:10:5
|
LL | T: Clone,
| ^^^^^^^^
Expand All @@ -12,23 +12,23 @@ LL | #![deny(clippy::type_repetition_in_bounds)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: this type has already been used as a bound predicate
--> $DIR/type_repetition_in_bounds.rs:26:5
--> $DIR/type_repetition_in_bounds.rs:27:5
|
LL | Self: Copy + Default + Ord,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider combining the bounds: `Self: Clone + Copy + Default + Ord`

error: this type has already been used as a bound predicate
--> $DIR/type_repetition_in_bounds.rs:86:5
--> $DIR/type_repetition_in_bounds.rs:101:5
|
LL | T: Clone,
| ^^^^^^^^
|
= help: consider combining the bounds: `T: ?Sized + Clone`

error: this type has already been used as a bound predicate
--> $DIR/type_repetition_in_bounds.rs:91:5
--> $DIR/type_repetition_in_bounds.rs:106:5
|
LL | T: ?Sized,
| ^^^^^^^^^
Expand Down

0 comments on commit 903fe3b

Please sign in to comment.