&obligation.cause.code,
&mut vec![],
);
+ self.suggest_unsized_bound_if_applicable(err, obligation);
+ }
+ }
+
+ fn suggest_unsized_bound_if_applicable(
+ &self,
+ err: &mut DiagnosticBuilder<'_>,
+ obligation: &PredicateObligation<'tcx>,
+ ) {
+ if let (
+ ty::Predicate::Trait(pred, _),
+ ObligationCauseCode::BindingObligation(item_def_id, span),
+ ) = (&obligation.predicate, &obligation.cause.code)
+ {
+ if let (Some(generics), true) = (
+ self.tcx.hir().get_if_local(*item_def_id).as_ref().and_then(|n| n.generics()),
+ Some(pred.def_id()) == self.tcx.lang_items().sized_trait(),
+ ) {
+ for param in generics.params {
+ if param.span == *span
+ && !param.bounds.iter().any(|bound| {
+ bound.trait_def_id() == self.tcx.lang_items().sized_trait()
+ })
+ {
+ let (span, separator) = match param.bounds {
+ [] => (span.shrink_to_hi(), ":"),
+ [.., bound] => (bound.span().shrink_to_hi(), " + "),
+ };
+ err.span_suggestion(
+ span,
+ "consider relaxing the implicit `Sized` restriction",
+ format!("{} ?Sized", separator),
+ Applicability::MachineApplicable,
+ );
+ return;
+ }
+ }
+ }
}
}
--> $DIR/extern-types-unsized.rs:22:20
|
LL | fn assert_sized<T>() { }
- | ------------ - required by this bound in `assert_sized`
+ | ------------ -- help: consider relaxing the implicit `Sized` restriction: `: ?Sized`
+ | |
+ | required by this bound in `assert_sized`
...
LL | assert_sized::<A>();
| ^ doesn't have a size known at compile-time
--> $DIR/str-mut-idx.rs:4:15
|
LL | fn bot<T>() -> T { loop {} }
- | --- - required by this bound in `bot`
+ | --- -- help: consider relaxing the implicit `Sized` restriction: `: ?Sized`
+ | |
+ | required by this bound in `bot`
...
LL | s[1..2] = bot();
| ^^^ doesn't have a size known at compile-time
error[E0277]: the size for values of type `X` cannot be known at compilation time
--> $DIR/unsized3.rs:7:13
|
-LL | fn f1<X: ?Sized>(x: &X) {
- | -- help: consider further restricting this bound: `X: std::marker::Sized +`
LL | f2::<X>(x);
| ^ doesn't have a size known at compile-time
...
|
= help: the trait `std::marker::Sized` is not implemented for `X`
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
+help: consider further restricting this bound
+ |
+LL | fn f1<X: std::marker::Sized + ?Sized>(x: &X) {
+ | ^^^^^^^^^^^^^^^^^^^^^^^
+help: consider relaxing the implicit `Sized` restriction
+ |
+LL | fn f2<X: ?Sized>(x: &X) {
+ | ^^^^^^^^
error[E0277]: the size for values of type `X` cannot be known at compilation time
--> $DIR/unsized3.rs:18:13
|
-LL | fn f3<X: ?Sized + T>(x: &X) {
- | -- help: consider further restricting this bound: `X: std::marker::Sized +`
LL | f4::<X>(x);
| ^ doesn't have a size known at compile-time
...
|
= help: the trait `std::marker::Sized` is not implemented for `X`
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
+help: consider further restricting this bound
+ |
+LL | fn f3<X: std::marker::Sized + ?Sized + T>(x: &X) {
+ | ^^^^^^^^^^^^^^^^^^^^^^^
+help: consider relaxing the implicit `Sized` restriction
+ |
+LL | fn f4<X: T + ?Sized>(x: &X) {
+ | ^^^^^^^^^
error[E0277]: the size for values of type `X` cannot be known at compilation time
--> $DIR/unsized3.rs:33:8