@@ -102,7 +102,7 @@ enum ResolutionError<'a> {
102102 /// error E0402: cannot use an outer type parameter in this context
103103 OuterTypeParameterContext ,
104104 /// error E0403: the name is already used for a type parameter in this type parameter list
105- NameAlreadyUsedInTypeParameterList ( Name ) ,
105+ NameAlreadyUsedInTypeParameterList ( Name , & ' a Span ) ,
106106 /// error E0404: is not a trait
107107 IsNotATrait ( & ' a str ) ,
108108 /// error E0405: use of undeclared trait name
@@ -209,13 +209,17 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
209209 E0402 ,
210210 "cannot use an outer type parameter in this context" )
211211 }
212- ResolutionError :: NameAlreadyUsedInTypeParameterList ( name) => {
213- struct_span_err ! ( resolver. session,
214- span,
215- E0403 ,
216- "the name `{}` is already used for a type parameter in this type \
217- parameter list",
218- name)
212+ ResolutionError :: NameAlreadyUsedInTypeParameterList ( name, first_use_span) => {
213+ let mut err = struct_span_err ! ( resolver. session,
214+ span,
215+ E0403 ,
216+ "the name `{}` is already used for a type parameter \
217+ in this type parameter list",
218+ name) ;
219+ err. span_label ( span, & format ! ( "already used" ) ) ;
220+ err. span_label ( first_use_span. clone ( ) , & format ! ( "first use of `{}`" , name) ) ;
221+ err
222+
219223 }
220224 ResolutionError :: IsNotATrait ( name) => {
221225 let mut err = struct_span_err ! ( resolver. session,
@@ -1726,17 +1730,19 @@ impl<'a> Resolver<'a> {
17261730 match type_parameters {
17271731 HasTypeParameters ( generics, rib_kind) => {
17281732 let mut function_type_rib = Rib :: new ( rib_kind) ;
1729- let mut seen_bindings = HashSet :: new ( ) ;
1733+ let mut seen_bindings = HashMap :: new ( ) ;
17301734 for type_parameter in & generics. ty_params {
17311735 let name = type_parameter. ident . name ;
17321736 debug ! ( "with_type_parameter_rib: {}" , type_parameter. id) ;
17331737
1734- if seen_bindings. contains ( & name) {
1738+ if seen_bindings. contains_key ( & name) {
1739+ let span = seen_bindings. get ( & name) . unwrap ( ) ;
17351740 resolve_error ( self ,
17361741 type_parameter. span ,
1737- ResolutionError :: NameAlreadyUsedInTypeParameterList ( name) ) ;
1742+ ResolutionError :: NameAlreadyUsedInTypeParameterList ( name,
1743+ span) ) ;
17381744 }
1739- seen_bindings. insert ( name) ;
1745+ seen_bindings. entry ( name) . or_insert ( type_parameter . span ) ;
17401746
17411747 // plain insert (no renaming)
17421748 let def_id = self . definitions . local_def_id ( type_parameter. id ) ;
0 commit comments