@@ -103,7 +103,7 @@ enum ResolutionError<'a> {
103
103
/// error E0402: cannot use an outer type parameter in this context
104
104
OuterTypeParameterContext ,
105
105
/// error E0403: the name is already used for a type parameter in this type parameter list
106
- NameAlreadyUsedInTypeParameterList ( Name ) ,
106
+ NameAlreadyUsedInTypeParameterList ( Name , & ' a Span ) ,
107
107
/// error E0404: is not a trait
108
108
IsNotATrait ( & ' a str ) ,
109
109
/// error E0405: use of undeclared trait name
@@ -210,13 +210,17 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
210
210
E0402 ,
211
211
"cannot use an outer type parameter in this context" )
212
212
}
213
- ResolutionError :: NameAlreadyUsedInTypeParameterList ( name) => {
214
- struct_span_err ! ( resolver. session,
215
- span,
216
- E0403 ,
217
- "the name `{}` is already used for a type parameter in this type \
218
- parameter list",
219
- name)
213
+ ResolutionError :: NameAlreadyUsedInTypeParameterList ( name, first_use_span) => {
214
+ let mut err = struct_span_err ! ( resolver. session,
215
+ span,
216
+ E0403 ,
217
+ "the name `{}` is already used for a type parameter \
218
+ in this type parameter list",
219
+ name) ;
220
+ err. span_label ( span, & format ! ( "already used" ) ) ;
221
+ err. span_label ( first_use_span. clone ( ) , & format ! ( "first use of `{}`" , name) ) ;
222
+ err
223
+
220
224
}
221
225
ResolutionError :: IsNotATrait ( name) => {
222
226
let mut err = struct_span_err ! ( resolver. session,
@@ -1731,17 +1735,19 @@ impl<'a> Resolver<'a> {
1731
1735
match type_parameters {
1732
1736
HasTypeParameters ( generics, space, rib_kind) => {
1733
1737
let mut function_type_rib = Rib :: new ( rib_kind) ;
1734
- let mut seen_bindings = HashSet :: new ( ) ;
1738
+ let mut seen_bindings = HashMap :: new ( ) ;
1735
1739
for ( index, type_parameter) in generics. ty_params . iter ( ) . enumerate ( ) {
1736
1740
let name = type_parameter. ident . name ;
1737
1741
debug ! ( "with_type_parameter_rib: {}" , type_parameter. id) ;
1738
1742
1739
- if seen_bindings. contains ( & name) {
1743
+ if seen_bindings. contains_key ( & name) {
1744
+ let span = seen_bindings. get ( & name) . unwrap ( ) ;
1740
1745
resolve_error ( self ,
1741
1746
type_parameter. span ,
1742
- ResolutionError :: NameAlreadyUsedInTypeParameterList ( name) ) ;
1747
+ ResolutionError :: NameAlreadyUsedInTypeParameterList ( name,
1748
+ span) ) ;
1743
1749
}
1744
- seen_bindings. insert ( name) ;
1750
+ seen_bindings. entry ( name) . or_insert ( type_parameter . span ) ;
1745
1751
1746
1752
// plain insert (no renaming)
1747
1753
let def_id = self . definitions . local_def_id ( type_parameter. id ) ;
0 commit comments