@@ -102,7 +102,7 @@ enum ResolutionError<'a> {
102
102
/// error E0402: cannot use an outer type parameter in this context
103
103
OuterTypeParameterContext ,
104
104
/// error E0403: the name is already used for a type parameter in this type parameter list
105
- NameAlreadyUsedInTypeParameterList ( Name ) ,
105
+ NameAlreadyUsedInTypeParameterList ( Name , & ' a Span ) ,
106
106
/// error E0404: is not a trait
107
107
IsNotATrait ( & ' a str ) ,
108
108
/// error E0405: use of undeclared trait name
@@ -209,13 +209,17 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
209
209
E0402 ,
210
210
"cannot use an outer type parameter in this context" )
211
211
}
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
+
219
223
}
220
224
ResolutionError :: IsNotATrait ( name) => {
221
225
let mut err = struct_span_err ! ( resolver. session,
@@ -1726,17 +1730,19 @@ impl<'a> Resolver<'a> {
1726
1730
match type_parameters {
1727
1731
HasTypeParameters ( generics, rib_kind) => {
1728
1732
let mut function_type_rib = Rib :: new ( rib_kind) ;
1729
- let mut seen_bindings = HashSet :: new ( ) ;
1733
+ let mut seen_bindings = HashMap :: new ( ) ;
1730
1734
for type_parameter in & generics. ty_params {
1731
1735
let name = type_parameter. ident . name ;
1732
1736
debug ! ( "with_type_parameter_rib: {}" , type_parameter. id) ;
1733
1737
1734
- if seen_bindings. contains ( & name) {
1738
+ if seen_bindings. contains_key ( & name) {
1739
+ let span = seen_bindings. get ( & name) . unwrap ( ) ;
1735
1740
resolve_error ( self ,
1736
1741
type_parameter. span ,
1737
- ResolutionError :: NameAlreadyUsedInTypeParameterList ( name) ) ;
1742
+ ResolutionError :: NameAlreadyUsedInTypeParameterList ( name,
1743
+ span) ) ;
1738
1744
}
1739
- seen_bindings. insert ( name) ;
1745
+ seen_bindings. entry ( name) . or_insert ( type_parameter . span ) ;
1740
1746
1741
1747
// plain insert (no renaming)
1742
1748
let def_id = self . definitions . local_def_id ( type_parameter. id ) ;
0 commit comments