Skip to content

Commit 93e5a74

Browse files
committed
Avoid repeated trait bounds in derived impls
1 parent a41178e commit 93e5a74

File tree

1 file changed

+11
-0
lines changed
  • src/libsyntax/ext/deriving/generic

1 file changed

+11
-0
lines changed

src/libsyntax/ext/deriving/generic/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ pub use self::SubstructureFields::*;
188188
use self::StructType::*;
189189

190190
use std::cell::RefCell;
191+
use std::collections::HashSet;
191192
use std::vec;
192193

193194
use abi::Abi;
@@ -549,10 +550,20 @@ impl<'a> TraitDef<'a> {
549550
.map(|ty_param| ty_param.ident.name)
550551
.collect();
551552

553+
let mut processed_field_types = HashSet::new();
552554
for field_ty in field_tys {
553555
let tys = find_type_parameters(&*field_ty, &ty_param_names);
554556

555557
for ty in tys {
558+
// if we have already handled this type, skip it
559+
if let ast::TyPath(_, ref p) = ty.node {
560+
if p.segments.len() == 1
561+
&& ty_param_names.contains(&p.segments[0].identifier.name)
562+
|| processed_field_types.contains(&p.segments) {
563+
continue;
564+
};
565+
processed_field_types.insert(p.segments.clone());
566+
}
556567
let mut bounds: Vec<_> = self.additional_bounds.iter().map(|p| {
557568
cx.typarambound(p.to_path(cx, self.span, type_ident, generics))
558569
}).collect();

0 commit comments

Comments
 (0)