mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-30 22:12:15 +00:00
parent
93e62a260f
commit
e8d4fb8aaa
@ -2652,6 +2652,29 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
|||||||
// Check for foreign traits being reachable.
|
// Check for foreign traits being reachable.
|
||||||
self.tcx.visible_parent_map(()).get(&def_id).is_some()
|
self.tcx.visible_parent_map(()).get(&def_id).is_some()
|
||||||
};
|
};
|
||||||
|
if Some(def_id) == self.tcx.lang_items().sized_trait()
|
||||||
|
&& let Some(hir::Node::TraitItem(hir::TraitItem {
|
||||||
|
ident,
|
||||||
|
kind: hir::TraitItemKind::Type(bounds, None),
|
||||||
|
..
|
||||||
|
})) = tcx.hir().get_if_local(item_def_id)
|
||||||
|
// Do not suggest relaxing if there is an explicit `Sized` obligation.
|
||||||
|
&& !bounds.iter()
|
||||||
|
.filter_map(|bound| bound.trait_ref())
|
||||||
|
.any(|tr| tr.trait_def_id() == self.tcx.lang_items().sized_trait())
|
||||||
|
{
|
||||||
|
let (span, separator) = if let [.., last] = bounds {
|
||||||
|
(last.span().shrink_to_hi(), " +")
|
||||||
|
} else {
|
||||||
|
(ident.span.shrink_to_hi(), ":")
|
||||||
|
};
|
||||||
|
err.span_suggestion_verbose(
|
||||||
|
span,
|
||||||
|
"consider relaxing the implicit `Sized` restriction",
|
||||||
|
format!("{separator} ?Sized"),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
);
|
||||||
|
}
|
||||||
if let DefKind::Trait = tcx.def_kind(item_def_id)
|
if let DefKind::Trait = tcx.def_kind(item_def_id)
|
||||||
&& !visible_item
|
&& !visible_item
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
// run-rustfix
|
||||||
|
trait TraitWithAType {
|
||||||
|
type Item: ?Sized;
|
||||||
|
}
|
||||||
|
trait Trait {}
|
||||||
|
struct A {}
|
||||||
|
impl TraitWithAType for A {
|
||||||
|
type Item = dyn Trait; //~ ERROR E0277
|
||||||
|
}
|
||||||
|
fn main() {}
|
10
tests/ui/object-safety/assoc_type_bounds_implicit_sized.rs
Normal file
10
tests/ui/object-safety/assoc_type_bounds_implicit_sized.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// run-rustfix
|
||||||
|
trait TraitWithAType {
|
||||||
|
type Item;
|
||||||
|
}
|
||||||
|
trait Trait {}
|
||||||
|
struct A {}
|
||||||
|
impl TraitWithAType for A {
|
||||||
|
type Item = dyn Trait; //~ ERROR E0277
|
||||||
|
}
|
||||||
|
fn main() {}
|
@ -0,0 +1,20 @@
|
|||||||
|
error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time
|
||||||
|
--> $DIR/assoc_type_bounds_implicit_sized.rs:8:17
|
||||||
|
|
|
||||||
|
LL | type Item = dyn Trait;
|
||||||
|
| ^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `(dyn Trait + 'static)`
|
||||||
|
note: required by a bound in `TraitWithAType::Item`
|
||||||
|
--> $DIR/assoc_type_bounds_implicit_sized.rs:3:5
|
||||||
|
|
|
||||||
|
LL | type Item;
|
||||||
|
| ^^^^^^^^^^ required by this bound in `TraitWithAType::Item`
|
||||||
|
help: consider relaxing the implicit `Sized` restriction
|
||||||
|
|
|
||||||
|
LL | type Item: ?Sized;
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
@ -33,6 +33,10 @@ help: consider removing the `?Sized` bound to make the type parameter `Sized`
|
|||||||
LL - fn bop<T: Bop + ?Sized>() {
|
LL - fn bop<T: Bop + ?Sized>() {
|
||||||
LL + fn bop<T: Bop>() {
|
LL + fn bop<T: Bop>() {
|
||||||
|
|
|
|
||||||
|
help: consider relaxing the implicit `Sized` restriction
|
||||||
|
|
|
||||||
|
LL | type Bar: Default + ?Sized
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user