Skip to content

Commit 71759ec

Browse files
authored
Rollup merge of rust-lang#35739 - circuitfox:E0403-update-error-format, r=jonathandturner
E0403 update error format Fixes rust-lang#35696 Part of rust-lang#35233 r? @jonathandturner Also did the bonus for this one.
2 parents 5e9a5b3 + 6a1efbd commit 71759ec

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

src/librustc_resolve/lib.rs

+18-12
Original file line numberDiff line numberDiff line change
@@ -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);

src/test/compile-fail/E0403.rs

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// except according to those terms.
1010

1111
fn foo<T, T>(s: T, u: T) {} //~ ERROR E0403
12+
//~| NOTE already used
13+
//~| NOTE first use of `T`
1214

1315
fn main() {
1416
}

0 commit comments

Comments
 (0)