diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2016-08-18 06:12:21 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-18 06:12:21 +0300 |
| commit | 71759ec52c170eb8450fa28f0d1f5c33b47c52b2 (patch) | |
| tree | 4691268374a43cb7a3c6b53310171c5df1c8d4b7 | |
| parent | 5e9a5b3bd7a631b39391acd3d6bbf67118d510d2 (diff) | |
| parent | 6a1efbd08ed10595ba2a9ac942be23bfb84d977f (diff) | |
| download | rust-71759ec52c170eb8450fa28f0d1f5c33b47c52b2.tar.gz rust-71759ec52c170eb8450fa28f0d1f5c33b47c52b2.zip | |
Rollup merge of #35739 - circuitfox:E0403-update-error-format, r=jonathandturner
E0403 update error format Fixes #35696 Part of #35233 r? @jonathandturner Also did the bonus for this one.
| -rw-r--r-- | src/librustc_resolve/lib.rs | 30 | ||||
| -rw-r--r-- | src/test/compile-fail/E0403.rs | 2 |
2 files changed, 20 insertions, 12 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index d90a932a63d..525b8b3e30d 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -102,7 +102,7 @@ enum ResolutionError<'a> { /// error E0402: cannot use an outer type parameter in this context OuterTypeParameterContext, /// error E0403: the name is already used for a type parameter in this type parameter list - NameAlreadyUsedInTypeParameterList(Name), + NameAlreadyUsedInTypeParameterList(Name, &'a Span), /// error E0404: is not a trait IsNotATrait(&'a str), /// error E0405: use of undeclared trait name @@ -209,13 +209,17 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>, E0402, "cannot use an outer type parameter in this context") } - ResolutionError::NameAlreadyUsedInTypeParameterList(name) => { - struct_span_err!(resolver.session, - span, - E0403, - "the name `{}` is already used for a type parameter in this type \ - parameter list", - name) + ResolutionError::NameAlreadyUsedInTypeParameterList(name, first_use_span) => { + let mut err = struct_span_err!(resolver.session, + span, + E0403, + "the name `{}` is already used for a type parameter \ + in this type parameter list", + name); + err.span_label(span, &format!("already used")); + err.span_label(first_use_span.clone(), &format!("first use of `{}`", name)); + err + } ResolutionError::IsNotATrait(name) => { let mut err = struct_span_err!(resolver.session, @@ -1726,17 +1730,19 @@ impl<'a> Resolver<'a> { match type_parameters { HasTypeParameters(generics, rib_kind) => { let mut function_type_rib = Rib::new(rib_kind); - let mut seen_bindings = HashSet::new(); + let mut seen_bindings = HashMap::new(); for type_parameter in &generics.ty_params { let name = type_parameter.ident.name; debug!("with_type_parameter_rib: {}", type_parameter.id); - if seen_bindings.contains(&name) { + if seen_bindings.contains_key(&name) { + let span = seen_bindings.get(&name).unwrap(); resolve_error(self, type_parameter.span, - ResolutionError::NameAlreadyUsedInTypeParameterList(name)); + ResolutionError::NameAlreadyUsedInTypeParameterList(name, + span)); } - seen_bindings.insert(name); + seen_bindings.entry(name).or_insert(type_parameter.span); // plain insert (no renaming) let def_id = self.definitions.local_def_id(type_parameter.id); diff --git a/src/test/compile-fail/E0403.rs b/src/test/compile-fail/E0403.rs index 6a68013dc6f..cd8532fc4c3 100644 --- a/src/test/compile-fail/E0403.rs +++ b/src/test/compile-fail/E0403.rs @@ -9,6 +9,8 @@ // except according to those terms. fn foo<T, T>(s: T, u: T) {} //~ ERROR E0403 + //~| NOTE already used + //~| NOTE first use of `T` fn main() { } |
