about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2020-03-23 18:46:09 -0700
committerEsteban Küber <esteban@kuber.com.ar>2020-03-24 11:36:08 -0700
commitcfeedec823b75a244e2c815d56b073fdd619fff6 (patch)
treea834f34b4bd9a607459bde9e271fb4a840baff9f
parent374ab25585f0a817fe7bd6986737f12347b12d0b (diff)
downloadrust-cfeedec823b75a244e2c815d56b073fdd619fff6.tar.gz
rust-cfeedec823b75a244e2c815d56b073fdd619fff6.zip
Fix placement of suggested generic param when bounds are present
-rw-r--r--src/librustc_typeck/collect.rs4
-rw-r--r--src/test/ui/did_you_mean/bad-assoc-ty.stderr8
2 files changed, 7 insertions, 5 deletions
diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs
index 8136417de03..7806f7832c1 100644
--- a/src/librustc_typeck/collect.rs
+++ b/src/librustc_typeck/collect.rs
@@ -162,8 +162,10 @@ crate fn placeholder_type_error(
         // `struct S<T>(T);` instead of `struct S<_, T>(T);`.
         sugg.push((arg.span, (*type_name).to_string()));
     } else {
+        let last = generics.iter().last().unwrap();
         sugg.push((
-            generics.iter().last().unwrap().span.shrink_to_hi(),
+            // Account for bounds, we want `fn foo<T: E, K>(_: K)` not `fn foo<T, K: E>(_: K)`.
+            last.bounds_span().unwrap_or(last.span).shrink_to_hi(),
             format!(", {}", type_name),
         ));
     }
diff --git a/src/test/ui/did_you_mean/bad-assoc-ty.stderr b/src/test/ui/did_you_mean/bad-assoc-ty.stderr
index 875c02bae4a..c409ea9c657 100644
--- a/src/test/ui/did_you_mean/bad-assoc-ty.stderr
+++ b/src/test/ui/did_you_mean/bad-assoc-ty.stderr
@@ -145,8 +145,8 @@ LL | fn foo<X: K<_, _>>(x: X) {}
    |
 help: use type parameters instead
    |
-LL | fn foo<X, T: K<T, T>>(x: X) {}
-   |         ^^^    ^  ^
+LL | fn foo<X: K<T, T>, T>(x: X) {}
+   |             ^  ^ ^^^
 
 error[E0121]: the type placeholder `_` is not allowed within types on item signatures
   --> $DIR/bad-assoc-ty.rs:52:34
@@ -167,8 +167,8 @@ LL | fn baz<F: Fn() -> _>(_: F) {}
    |
 help: use type parameters instead
    |
-LL | fn baz<F, T: Fn() -> T>(_: F) {}
-   |         ^^^          ^
+LL | fn baz<F: Fn() -> T, T>(_: F) {}
+   |                   ^^^^
 
 error[E0121]: the type placeholder `_` is not allowed within types on item signatures
   --> $DIR/bad-assoc-ty.rs:58:33