mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Rollup merge of #65192 - estebank:restrict-bound, r=matthewjasper
Use structured suggestion for restricting bounds When a trait bound is not met and restricting a type parameter would make the restriction hold, use a structured suggestion pointing at an appropriate place (type param in param list or `where` clause). Account for opaque parameters where instead of suggesting extending the `where` clause, we suggest appending the new restriction: `fn foo(impl Trait + UnmetTrait)`. Fix #64565, fix #41817, fix #24354, cc #26026, cc #37808, cc #24159, fix #37138, fix #24354, cc #20671.
This commit is contained in:
commit
7e4ff91403
@ -669,6 +669,12 @@ impl WhereClause {
|
||||
Some(self.span)
|
||||
}
|
||||
}
|
||||
|
||||
/// The `WhereClause` under normal circumstances points at either the predicates or the empty
|
||||
/// space where the `where` clause should be. Only of use for diagnostic suggestions.
|
||||
pub fn span_for_predicates_or_empty_place(&self) -> Span {
|
||||
self.span
|
||||
}
|
||||
}
|
||||
|
||||
/// A single predicate in a where-clause.
|
||||
|
@ -715,8 +715,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
// these notes will often be of the form
|
||||
// "the type `T` can't be frobnicated"
|
||||
// which is somewhat confusing.
|
||||
err.help(&format!("consider adding a `where {}` bound",
|
||||
trait_ref.to_predicate()));
|
||||
self.suggest_restricting_param_bound(
|
||||
&mut err,
|
||||
&trait_ref,
|
||||
obligation.cause.body_id,
|
||||
);
|
||||
} else {
|
||||
if !have_alt_message {
|
||||
// Can't show anything else useful, try to find similar impls.
|
||||
@ -960,6 +963,175 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
err.emit();
|
||||
}
|
||||
|
||||
fn suggest_restricting_param_bound(
|
||||
&self,
|
||||
err: &mut DiagnosticBuilder<'_>,
|
||||
trait_ref: &ty::PolyTraitRef<'_>,
|
||||
body_id: hir::HirId,
|
||||
) {
|
||||
let self_ty = trait_ref.self_ty();
|
||||
let (param_ty, projection) = match &self_ty.kind {
|
||||
ty::Param(_) => (true, None),
|
||||
ty::Projection(projection) => (false, Some(projection)),
|
||||
_ => return,
|
||||
};
|
||||
|
||||
let mut suggest_restriction = |generics: &hir::Generics, msg| {
|
||||
let span = generics.where_clause.span_for_predicates_or_empty_place();
|
||||
if !span.from_expansion() && span.desugaring_kind().is_none() {
|
||||
err.span_suggestion(
|
||||
generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(),
|
||||
&format!("consider further restricting {}", msg),
|
||||
format!(
|
||||
"{} {} ",
|
||||
if !generics.where_clause.predicates.is_empty() {
|
||||
","
|
||||
} else {
|
||||
" where"
|
||||
},
|
||||
trait_ref.to_predicate(),
|
||||
),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: Add check for trait bound that is already present, particularly `?Sized` so we
|
||||
// don't suggest `T: Sized + ?Sized`.
|
||||
let mut hir_id = body_id;
|
||||
while let Some(node) = self.tcx.hir().find(hir_id) {
|
||||
match node {
|
||||
hir::Node::TraitItem(hir::TraitItem {
|
||||
generics,
|
||||
kind: hir::TraitItemKind::Method(..), ..
|
||||
}) if param_ty && self_ty == self.tcx.types.self_param => {
|
||||
// Restricting `Self` for a single method.
|
||||
suggest_restriction(&generics, "`Self`");
|
||||
return;
|
||||
}
|
||||
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Fn(_, _, generics, _), ..
|
||||
}) |
|
||||
hir::Node::TraitItem(hir::TraitItem {
|
||||
generics,
|
||||
kind: hir::TraitItemKind::Method(..), ..
|
||||
}) |
|
||||
hir::Node::ImplItem(hir::ImplItem {
|
||||
generics,
|
||||
kind: hir::ImplItemKind::Method(..), ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Trait(_, _, generics, _, _), ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Impl(_, _, _, generics, ..), ..
|
||||
}) if projection.is_some() => {
|
||||
// Missing associated type bound.
|
||||
suggest_restriction(&generics, "the associated type");
|
||||
return;
|
||||
}
|
||||
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Struct(_, generics), span, .. }) |
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Enum(_, generics), span, .. }) |
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Union(_, generics), span, .. }) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Trait(_, _, generics, ..), span, ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Impl(_, _, _, generics, ..), span, ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Fn(_, _, generics, _), span, ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::TyAlias(_, generics), span, ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::TraitAlias(generics, _), span, ..
|
||||
}) |
|
||||
hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::OpaqueTy(hir::OpaqueTy { generics, .. }), span, ..
|
||||
}) |
|
||||
hir::Node::TraitItem(hir::TraitItem { generics, span, .. }) |
|
||||
hir::Node::ImplItem(hir::ImplItem { generics, span, .. })
|
||||
if param_ty => {
|
||||
// Missing generic type parameter bound.
|
||||
let restrict_msg = "consider further restricting this bound";
|
||||
let param_name = self_ty.to_string();
|
||||
for param in generics.params.iter().filter(|p| {
|
||||
¶m_name == std::convert::AsRef::<str>::as_ref(&p.name.ident().as_str())
|
||||
}) {
|
||||
if param_name.starts_with("impl ") {
|
||||
// `impl Trait` in argument:
|
||||
// `fn foo(x: impl Trait) {}` → `fn foo(t: impl Trait + Trait2) {}`
|
||||
err.span_suggestion(
|
||||
param.span,
|
||||
restrict_msg,
|
||||
// `impl CurrentTrait + MissingTrait`
|
||||
format!("{} + {}", param.name.ident(), trait_ref),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
} else if generics.where_clause.predicates.is_empty() &&
|
||||
param.bounds.is_empty()
|
||||
{
|
||||
// If there are no bounds whatsoever, suggest adding a constraint
|
||||
// to the type parameter:
|
||||
// `fn foo<T>(t: T) {}` → `fn foo<T: Trait>(t: T) {}`
|
||||
err.span_suggestion(
|
||||
param.span,
|
||||
"consider restricting this bound",
|
||||
format!("{}", trait_ref.to_predicate()),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
} else if !generics.where_clause.predicates.is_empty() {
|
||||
// There is a `where` clause, so suggest expanding it:
|
||||
// `fn foo<T>(t: T) where T: Debug {}` →
|
||||
// `fn foo<T>(t: T) where T: Debug, T: Trait {}`
|
||||
err.span_suggestion(
|
||||
generics.where_clause.span().unwrap().shrink_to_hi(),
|
||||
&format!(
|
||||
"consider further restricting type parameter `{}`",
|
||||
param_name,
|
||||
),
|
||||
format!(", {}", trait_ref.to_predicate()),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
} else {
|
||||
// If there is no `where` clause lean towards constraining to the
|
||||
// type parameter:
|
||||
// `fn foo<X: Bar, T>(t: T, x: X) {}` → `fn foo<T: Trait>(t: T) {}`
|
||||
// `fn foo<T: Bar>(t: T) {}` → `fn foo<T: Bar + Trait>(t: T) {}`
|
||||
let sp = param.span.with_hi(span.hi());
|
||||
let span = self.tcx.sess.source_map()
|
||||
.span_through_char(sp, ':');
|
||||
if sp != param.span && sp != span {
|
||||
// Only suggest if we have high certainty that the span
|
||||
// covers the colon in `foo<T: Trait>`.
|
||||
err.span_suggestion(span, restrict_msg, format!(
|
||||
"{} + ",
|
||||
trait_ref.to_predicate(),
|
||||
), Applicability::MachineApplicable);
|
||||
} else {
|
||||
err.span_label(param.span, &format!(
|
||||
"consider adding a `where {}` bound",
|
||||
trait_ref.to_predicate(),
|
||||
));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
hir::Node::Crate => return,
|
||||
|
||||
_ => {}
|
||||
}
|
||||
|
||||
hir_id = self.tcx.hir().get_parent_item(hir_id);
|
||||
}
|
||||
}
|
||||
|
||||
/// When encountering an assignment of an unsized trait, like `let x = ""[..];`, provide a
|
||||
/// suggestion to borrow the initializer in order to use have a slice instead.
|
||||
fn suggest_borrow_on_unsized_slice(
|
||||
|
@ -350,11 +350,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
|
||||
// If the span is from a macro, then it's hard to extract the text
|
||||
// and make a good suggestion, so don't bother.
|
||||
let is_desugaring = match sp.desugaring_kind() {
|
||||
Some(k) => sp.is_desugaring(k),
|
||||
None => false
|
||||
};
|
||||
let is_macro = sp.from_expansion() && !is_desugaring;
|
||||
let is_macro = sp.from_expansion() && sp.desugaring_kind().is_none();
|
||||
|
||||
// `ExprKind::DropTemps` is semantically irrelevant for these suggestions.
|
||||
let expr = expr.peel_drop_temps();
|
||||
|
@ -4,10 +4,10 @@ error[E0277]: the trait bound `A: Foo` is not satisfied
|
||||
LL | const Y: usize;
|
||||
| --------------- required by `Foo::Y`
|
||||
...
|
||||
LL | pub fn test<A: Foo, B: Foo>() {
|
||||
| -- help: consider further restricting this bound: `A: Foo +`
|
||||
LL | let _array = [4; <A as Foo>::Y];
|
||||
| ^^^^^^^^^^^^^ the trait `Foo` is not implemented for `A`
|
||||
|
|
||||
= help: consider adding a `where A: Foo` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,10 @@ error[E0277]: the trait bound `A: Foo` is not satisfied
|
||||
LL | const Y: usize;
|
||||
| --------------- required by `Foo::Y`
|
||||
...
|
||||
LL | pub fn test<A: Foo, B: Foo>() {
|
||||
| -- help: consider further restricting this bound: `A: Foo +`
|
||||
LL | let _array: [u32; <A as Foo>::Y];
|
||||
| ^^^^^^^^^^^^^ the trait `Foo` is not implemented for `A`
|
||||
|
|
||||
= help: consider adding a `where A: Foo` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -9,7 +9,10 @@ LL | impl Case1 for S1 {
|
||||
error[E0277]: `<<T as Case1>::C as std::iter::Iterator>::Item` is not an iterator
|
||||
--> $DIR/bad-bounds-on-assoc-in-trait.rs:37:1
|
||||
|
|
||||
LL | / fn assume_case1<T: Case1>() {
|
||||
LL | fn assume_case1<T: Case1>() {
|
||||
| ^ - help: consider further restricting the associated type: `where <<T as Case1>::C as std::iter::Iterator>::Item: std::iter::Iterator`
|
||||
| _|
|
||||
| |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
@ -19,7 +22,6 @@ LL | | }
|
||||
| |_^ `<<T as Case1>::C as std::iter::Iterator>::Item` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `<<T as Case1>::C as std::iter::Iterator>::Item`
|
||||
= help: consider adding a `where <<T as Case1>::C as std::iter::Iterator>::Item: std::iter::Iterator` bound
|
||||
|
||||
error[E0277]: `<<T as Case1>::C as std::iter::Iterator>::Item` cannot be sent between threads safely
|
||||
--> $DIR/bad-bounds-on-assoc-in-trait.rs:37:1
|
||||
@ -27,7 +29,10 @@ error[E0277]: `<<T as Case1>::C as std::iter::Iterator>::Item` cannot be sent be
|
||||
LL | trait Case1 {
|
||||
| ----------- required by `Case1`
|
||||
...
|
||||
LL | / fn assume_case1<T: Case1>() {
|
||||
LL | fn assume_case1<T: Case1>() {
|
||||
| ^ - help: consider further restricting the associated type: `where <<T as Case1>::C as std::iter::Iterator>::Item: std::marker::Send`
|
||||
| _|
|
||||
| |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
@ -37,7 +42,6 @@ LL | | }
|
||||
| |_^ `<<T as Case1>::C as std::iter::Iterator>::Item` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `<<T as Case1>::C as std::iter::Iterator>::Item`
|
||||
= help: consider adding a `where <<T as Case1>::C as std::iter::Iterator>::Item: std::marker::Send` bound
|
||||
|
||||
error[E0277]: `<<T as Case1>::C as std::iter::Iterator>::Item` cannot be shared between threads safely
|
||||
--> $DIR/bad-bounds-on-assoc-in-trait.rs:37:1
|
||||
@ -45,7 +49,10 @@ error[E0277]: `<<T as Case1>::C as std::iter::Iterator>::Item` cannot be shared
|
||||
LL | trait Case1 {
|
||||
| ----------- required by `Case1`
|
||||
...
|
||||
LL | / fn assume_case1<T: Case1>() {
|
||||
LL | fn assume_case1<T: Case1>() {
|
||||
| ^ - help: consider further restricting the associated type: `where <<T as Case1>::C as std::iter::Iterator>::Item: std::marker::Sync`
|
||||
| _|
|
||||
| |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
@ -55,7 +62,6 @@ LL | | }
|
||||
| |_^ `<<T as Case1>::C as std::iter::Iterator>::Item` cannot be shared between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Sync` is not implemented for `<<T as Case1>::C as std::iter::Iterator>::Item`
|
||||
= help: consider adding a `where <<T as Case1>::C as std::iter::Iterator>::Item: std::marker::Sync` bound
|
||||
|
||||
error[E0277]: `<_ as Lam<&'a u8>>::App` doesn't implement `std::fmt::Debug`
|
||||
--> $DIR/bad-bounds-on-assoc-in-trait.rs:37:1
|
||||
|
@ -0,0 +1,29 @@
|
||||
// run-rustfix
|
||||
// Test equality constraints on associated types in a where clause.
|
||||
#![allow(dead_code)]
|
||||
|
||||
pub trait ToInt {
|
||||
fn to_int(&self) -> isize;
|
||||
}
|
||||
|
||||
pub trait GetToInt
|
||||
{
|
||||
type R;
|
||||
|
||||
fn get(&self) -> <Self as GetToInt>::R;
|
||||
}
|
||||
|
||||
fn foo<G>(g: G) -> isize
|
||||
where G : GetToInt, <G as GetToInt>::R: ToInt
|
||||
{
|
||||
ToInt::to_int(&g.get()) //~ ERROR E0277
|
||||
}
|
||||
|
||||
fn bar<G : GetToInt>(g: G) -> isize
|
||||
where G::R : ToInt
|
||||
{
|
||||
ToInt::to_int(&g.get()) // OK
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
// run-rustfix
|
||||
// Test equality constraints on associated types in a where clause.
|
||||
#![allow(dead_code)]
|
||||
|
||||
pub trait ToInt {
|
||||
fn to_int(&self) -> isize;
|
||||
|
@ -1,13 +1,14 @@
|
||||
error[E0277]: the trait bound `<G as GetToInt>::R: ToInt` is not satisfied
|
||||
--> $DIR/associated-types-bound-failure.rs:17:19
|
||||
--> $DIR/associated-types-bound-failure.rs:19:19
|
||||
|
|
||||
LL | fn to_int(&self) -> isize;
|
||||
| -------------------------- required by `ToInt::to_int`
|
||||
...
|
||||
LL | where G : GetToInt
|
||||
| - help: consider further restricting the associated type: `, <G as GetToInt>::R: ToInt`
|
||||
LL | {
|
||||
LL | ToInt::to_int(&g.get())
|
||||
| ^^^^^^^^ the trait `ToInt` is not implemented for `<G as GetToInt>::R`
|
||||
|
|
||||
= help: consider adding a `where <G as GetToInt>::R: ToInt` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -0,0 +1,15 @@
|
||||
// run-rustfix
|
||||
#![allow(unused_variables)]
|
||||
|
||||
trait Get {
|
||||
type Value;
|
||||
fn get(&self) -> <Self as Get>::Value;
|
||||
}
|
||||
|
||||
trait Other {
|
||||
fn uhoh<U:Get>(&self, foo: U, bar: <Self as Get>::Value) where Self: Get {}
|
||||
//~^ ERROR the trait bound `Self: Get` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
// run-rustfix
|
||||
#![allow(unused_variables)]
|
||||
|
||||
trait Get {
|
||||
type Value;
|
||||
fn get(&self) -> <Self as Get>::Value;
|
||||
|
@ -1,10 +1,11 @@
|
||||
error[E0277]: the trait bound `Self: Get` is not satisfied
|
||||
--> $DIR/associated-types-for-unimpl-trait.rs:7:5
|
||||
--> $DIR/associated-types-for-unimpl-trait.rs:10:5
|
||||
|
|
||||
LL | fn uhoh<U:Get>(&self, foo: U, bar: <Self as Get>::Value) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Get` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: Get` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-^^
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `where Self: Get`
|
||||
| the trait `Get` is not implemented for `Self`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
error[E0277]: the trait bound `T: Foo<usize>` is not satisfied
|
||||
--> $DIR/associated-types-invalid-trait-ref-issue-18865.rs:10:12
|
||||
|
|
||||
LL | fn f<T:Foo<isize>>(t: &T) {
|
||||
| -- help: consider further restricting this bound: `T: Foo<usize> +`
|
||||
LL | let u: <T as Foo<usize>>::Bar = t.get_bar();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `Foo<usize>` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Foo<usize>` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,9 +2,10 @@ error[E0277]: the trait bound `T: Get` is not satisfied
|
||||
--> $DIR/associated-types-no-suitable-bound.rs:11:5
|
||||
|
|
||||
LL | fn uhoh<T>(foo: <T as Get>::Value) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Get` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Get` bound
|
||||
| ^^^^^^^^-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| | |
|
||||
| | help: consider restricting this bound: `T: Get`
|
||||
| the trait `Get` is not implemented for `T`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,9 +2,10 @@ error[E0277]: the trait bound `Self: Get` is not satisfied
|
||||
--> $DIR/associated-types-no-suitable-supertrait-2.rs:17:5
|
||||
|
|
||||
LL | fn uhoh<U:Get>(&self, foo: U, bar: <Self as Get>::Value) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Get` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: Get` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-^^
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `where Self: Get`
|
||||
| the trait `Get` is not implemented for `Self`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,9 +2,10 @@ error[E0277]: the trait bound `Self: Get` is not satisfied
|
||||
--> $DIR/associated-types-no-suitable-supertrait.rs:17:5
|
||||
|
|
||||
LL | fn uhoh<U:Get>(&self, foo: U, bar: <Self as Get>::Value) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Get` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: Get` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-^^
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `where Self: Get`
|
||||
| the trait `Get` is not implemented for `Self`
|
||||
|
||||
error[E0277]: the trait bound `(T, U): Get` is not satisfied
|
||||
--> $DIR/associated-types-no-suitable-supertrait.rs:22:5
|
||||
|
@ -0,0 +1,30 @@
|
||||
// run-rustfix
|
||||
// Check that we get an error when you use `<Self as Get>::Value` in
|
||||
// the trait definition even if there is no default method.
|
||||
|
||||
trait Get {
|
||||
type Value;
|
||||
}
|
||||
|
||||
trait Other {
|
||||
fn okay<U:Get>(&self, foo: U, bar: <Self as Get>::Value) where Self: Get ;
|
||||
//~^ ERROR E0277
|
||||
}
|
||||
|
||||
impl Get for () {
|
||||
type Value = f32;
|
||||
}
|
||||
|
||||
impl Get for f64 {
|
||||
type Value = u32;
|
||||
}
|
||||
|
||||
impl Other for () {
|
||||
fn okay<U:Get>(&self, _foo: U, _bar: <Self as Get>::Value) { }
|
||||
}
|
||||
|
||||
impl Other for f64 {
|
||||
fn okay<U:Get>(&self, _foo: U, _bar: <Self as Get>::Value) { }
|
||||
}
|
||||
|
||||
fn main() { }
|
@ -1,3 +1,4 @@
|
||||
// run-rustfix
|
||||
// Check that we get an error when you use `<Self as Get>::Value` in
|
||||
// the trait definition even if there is no default method.
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
error[E0277]: the trait bound `Self: Get` is not satisfied
|
||||
--> $DIR/associated-types-projection-to-unrelated-trait-in-method-without-default.rs:9:5
|
||||
--> $DIR/associated-types-projection-to-unrelated-trait-in-method-without-default.rs:10:5
|
||||
|
|
||||
LL | fn okay<U:Get>(&self, foo: U, bar: <Self as Get>::Value);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Get` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: Get` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `where Self: Get`
|
||||
| the trait `Get` is not implemented for `Self`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
14
src/test/ui/associated-types/associated-types-unsized.fixed
Normal file
14
src/test/ui/associated-types/associated-types-unsized.fixed
Normal file
@ -0,0 +1,14 @@
|
||||
// run-rustfix
|
||||
#![allow(dead_code, unused_variables)]
|
||||
|
||||
trait Get {
|
||||
type Value: ?Sized;
|
||||
fn get(&self) -> <Self as Get>::Value;
|
||||
}
|
||||
|
||||
fn foo<T:Get>(t: T) where <T as Get>::Value: std::marker::Sized {
|
||||
let x = t.get(); //~ ERROR the size for values of type
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
// run-rustfix
|
||||
#![allow(dead_code, unused_variables)]
|
||||
|
||||
trait Get {
|
||||
type Value: ?Sized;
|
||||
fn get(&self) -> <Self as Get>::Value;
|
||||
|
@ -1,12 +1,13 @@
|
||||
error[E0277]: the size for values of type `<T as Get>::Value` cannot be known at compilation time
|
||||
--> $DIR/associated-types-unsized.rs:7:9
|
||||
--> $DIR/associated-types-unsized.rs:10:9
|
||||
|
|
||||
LL | fn foo<T:Get>(t: T) {
|
||||
| - help: consider further restricting the associated type: `where <T as Get>::Value: std::marker::Sized`
|
||||
LL | let x = t.get();
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `<T as Get>::Value`
|
||||
= 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 adding a `where <T as Get>::Value: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
|
@ -1,11 +1,12 @@
|
||||
error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/bad-method-typaram-kind.rs:2:7
|
||||
|
|
||||
LL | fn foo<T:'static>() {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Send +`
|
||||
LL | 1.bar::<T>();
|
||||
| ^^^ `T` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,20 +2,22 @@ error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/builtin-superkinds-double-superkind.rs:6:24
|
||||
|
|
||||
LL | impl <T: Sync+'static> Foo for (T,) { }
|
||||
| ^^^ `T` cannot be sent between threads safely
|
||||
| -- ^^^ `T` cannot be sent between threads safely
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Send +`
|
||||
|
|
||||
= help: within `(T,)`, the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
= note: required because it appears within the type `(T,)`
|
||||
|
||||
error[E0277]: `T` cannot be shared between threads safely
|
||||
--> $DIR/builtin-superkinds-double-superkind.rs:9:16
|
||||
|
|
||||
LL | impl <T: Send> Foo for (T,T) { }
|
||||
| ^^^ `T` cannot be shared between threads safely
|
||||
| -- ^^^ `T` cannot be shared between threads safely
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Sync +`
|
||||
|
|
||||
= help: within `(T, T)`, the trait `std::marker::Sync` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Sync` bound
|
||||
= note: required because it appears within the type `(T, T)`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -2,10 +2,11 @@ error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/builtin-superkinds-in-metadata.rs:13:23
|
||||
|
|
||||
LL | impl <T:Sync+'static> RequiresRequiresShareAndSend for X<T> { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `T` cannot be sent between threads safely
|
||||
| -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `T` cannot be sent between threads safely
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Send +`
|
||||
|
|
||||
= help: within `X<T>`, the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
= note: required because it appears within the type `X<T>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -2,10 +2,11 @@ error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/builtin-superkinds-typaram-not-send.rs:5:24
|
||||
|
|
||||
LL | impl <T: Sync+'static> Foo for T { }
|
||||
| ^^^ `T` cannot be sent between threads safely
|
||||
| -- ^^^ `T` cannot be sent between threads safely
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Send +`
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,14 +4,16 @@ error[E0277]: `F` cannot be sent between threads safely
|
||||
LL | struct X<F> where F: FnOnce() + 'static + Send {
|
||||
| ---------------------------------------------- required by `X`
|
||||
...
|
||||
LL | / fn foo<F>(blk: F) -> X<F> where F: FnOnce() + 'static {
|
||||
LL | fn foo<F>(blk: F) -> X<F> where F: FnOnce() + 'static {
|
||||
| ^ - help: consider further restricting type parameter `F`: `, F: std::marker::Send`
|
||||
| _|
|
||||
| |
|
||||
LL | |
|
||||
LL | | return X { field: blk };
|
||||
LL | | }
|
||||
| |_^ `F` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `F`
|
||||
= help: consider adding a `where F: std::marker::Send` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,11 +4,13 @@ error[E0277]: `F` cannot be shared between threads safely
|
||||
LL | fn take_const_owned<F>(_: F) where F: FnOnce() + Sync + Send {
|
||||
| ---------------- ---- required by this bound in `take_const_owned`
|
||||
...
|
||||
LL | fn give_owned<F>(f: F) where F: FnOnce() + Send {
|
||||
| - help: consider further restricting type parameter `F`: `, F: std::marker::Sync`
|
||||
LL | take_any(f);
|
||||
LL | take_const_owned(f);
|
||||
| ^ `F` cannot be shared between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Sync` is not implemented for `F`
|
||||
= help: consider adding a `where F: std::marker::Sync` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -16,26 +16,30 @@ error[E0277]: the size for values of type `A` cannot be known at compilation tim
|
||||
|
|
||||
LL | pub struct Foo<A, B>(A, B);
|
||||
| --------------------------- required by `Foo`
|
||||
LL |
|
||||
LL | impl<A, B> Foo<A, B> {
|
||||
| - help: consider restricting this bound: `A: std::marker::Sized`
|
||||
...
|
||||
LL | [5; Self::HOST_SIZE] == [6; 0]
|
||||
| ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `A`
|
||||
= 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 adding a `where A: std::marker::Sized` bound
|
||||
|
||||
error[E0277]: the size for values of type `B` cannot be known at compilation time
|
||||
--> $DIR/too_generic_eval_ice.rs:7:13
|
||||
|
|
||||
LL | pub struct Foo<A, B>(A, B);
|
||||
| --------------------------- required by `Foo`
|
||||
LL |
|
||||
LL | impl<A, B> Foo<A, B> {
|
||||
| - help: consider restricting this bound: `B: std::marker::Sized`
|
||||
...
|
||||
LL | [5; Self::HOST_SIZE] == [6; 0]
|
||||
| ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `B`
|
||||
= 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 adding a `where B: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -1,23 +1,25 @@
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/dst-object-from-unsized-type.rs:8:23
|
||||
|
|
||||
LL | fn test1<T: ?Sized + Foo>(t: &T) {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
LL | let u: &dyn Foo = t;
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: required for the cast to the object type `dyn Foo`
|
||||
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/dst-object-from-unsized-type.rs:13:23
|
||||
|
|
||||
LL | fn test2<T: ?Sized + Foo>(t: &T) {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
LL | let v: &dyn Foo = t as &dyn Foo;
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: required for the cast to the object type `dyn Foo`
|
||||
|
||||
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
||||
|
@ -6,10 +6,11 @@ LL | fn want_bar_for_any_ccx<B>(b: &B)
|
||||
LL | where B : for<'ccx> Bar<'ccx>
|
||||
| ------------------- required by this bound in `want_bar_for_any_ccx`
|
||||
...
|
||||
LL | where B : Qux
|
||||
| - help: consider further restricting type parameter `B`: `, for<'ccx> B: Bar<'ccx>`
|
||||
...
|
||||
LL | want_bar_for_any_ccx(b);
|
||||
| ^ the trait `for<'ccx> Bar<'ccx>` is not implemented for `B`
|
||||
|
|
||||
= help: consider adding a `where for<'ccx> B: Bar<'ccx>` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
error[E0277]: the trait bound `for<'tcx> F: Foo<'tcx>` is not satisfied
|
||||
--> $DIR/hrtb-higher-ranker-supertraits.rs:18:26
|
||||
|
|
||||
LL | where F : Foo<'x>
|
||||
| - help: consider further restricting type parameter `F`: `, for<'tcx> F: Foo<'tcx>`
|
||||
...
|
||||
LL | want_foo_for_any_tcx(f);
|
||||
| ^ the trait `for<'tcx> Foo<'tcx>` is not implemented for `F`
|
||||
...
|
||||
@ -8,12 +11,13 @@ LL | fn want_foo_for_any_tcx<F>(f: &F)
|
||||
| --------------------
|
||||
LL | where F : for<'tcx> Foo<'tcx>
|
||||
| ------------------- required by this bound in `want_foo_for_any_tcx`
|
||||
|
|
||||
= help: consider adding a `where for<'tcx> F: Foo<'tcx>` bound
|
||||
|
||||
error[E0277]: the trait bound `for<'ccx> B: Bar<'ccx>` is not satisfied
|
||||
--> $DIR/hrtb-higher-ranker-supertraits.rs:35:26
|
||||
|
|
||||
LL | where B : Bar<'x>
|
||||
| - help: consider further restricting type parameter `B`: `, for<'ccx> B: Bar<'ccx>`
|
||||
...
|
||||
LL | want_bar_for_any_ccx(b);
|
||||
| ^ the trait `for<'ccx> Bar<'ccx>` is not implemented for `B`
|
||||
...
|
||||
@ -21,8 +25,6 @@ LL | fn want_bar_for_any_ccx<B>(b: &B)
|
||||
| --------------------
|
||||
LL | where B : for<'ccx> Bar<'ccx>
|
||||
| ------------------- required by this bound in `want_bar_for_any_ccx`
|
||||
|
|
||||
= help: consider adding a `where for<'ccx> B: Bar<'ccx>` bound
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
error[E0277]: the trait bound `S: std::marker::Copy` is not satisfied in `(S, T)`
|
||||
--> $DIR/issue-55872-1.rs:12:5
|
||||
|
|
||||
LL | impl<S: Default> Bar for S {
|
||||
| -- help: consider further restricting this bound: `S: std::marker::Copy +`
|
||||
LL | type E = impl Copy;
|
||||
| ^^^^^^^^^^^^^^^^^^^ within `(S, T)`, the trait `std::marker::Copy` is not implemented for `S`
|
||||
|
|
||||
= help: consider adding a `where S: std::marker::Copy` bound
|
||||
= note: required because it appears within the type `(S, T)`
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
@ -13,8 +14,10 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied in `(S, T)
|
||||
|
|
||||
LL | type E = impl Copy;
|
||||
| ^^^^^^^^^^^^^^^^^^^ within `(S, T)`, the trait `std::marker::Copy` is not implemented for `T`
|
||||
...
|
||||
LL | fn foo<T: Default>() -> Self::E {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Copy +`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
= note: required because it appears within the type `(S, T)`
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
|
@ -7,13 +7,13 @@ LL | trait From<Src> {
|
||||
LL | / fn to<Dst>(
|
||||
LL | | self
|
||||
LL | | ) -> <Dst as From<Self>>::Result where Dst: From<Self> {
|
||||
| | - help: consider further restricting `Self`: `, Self: std::marker::Sized`
|
||||
LL | | From::from(self)
|
||||
LL | | }
|
||||
| |_____^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Self`
|
||||
= 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 adding a `where Self: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,9 +5,9 @@ LL | pub struct Foo<T: Bound>(T);
|
||||
| ---------------------------- required by `Foo`
|
||||
...
|
||||
LL | impl<T> Trait2 for Foo<T> {}
|
||||
| ^^^^^^ the trait `Bound` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Bound` bound
|
||||
| - ^^^^^^ the trait `Bound` is not implemented for `T`
|
||||
| |
|
||||
| help: consider restricting this bound: `T: Bound`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,11 +1,12 @@
|
||||
error[E0277]: `<P as Process<'_>>::Item` is not an iterator
|
||||
--> $DIR/issue-22872.rs:20:40
|
||||
|
|
||||
LL | fn push_process<P>(process: P) where P: Process<'static> {
|
||||
| - help: consider further restricting the associated type: `, <P as Process<'_>>::Item: std::iter::Iterator`
|
||||
LL | let _: Box<dyn for<'b> Wrap<'b>> = Box::new(Wrapper(process));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ `<P as Process<'_>>::Item` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `<P as Process<'_>>::Item`
|
||||
= help: consider adding a `where <P as Process<'_>>::Item: std::iter::Iterator` bound
|
||||
= note: required because of the requirements on the impl of `for<'b> Wrap<'b>` for `Wrapper<P>`
|
||||
= note: required for the cast to the object type `dyn for<'b> Wrap<'b>`
|
||||
|
||||
|
@ -1,12 +1,13 @@
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/issue-27060-2.rs:3:5
|
||||
|
|
||||
LL | pub struct Bad<T: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
LL | data: T,
|
||||
| ^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: the last field of a packed struct may only have a dynamically sized type if it does not need drop to be run
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -2,11 +2,12 @@ error[E0277]: the size for values of type `Self` cannot be known at compilation
|
||||
--> $DIR/issue-27078.rs:5:12
|
||||
|
|
||||
LL | fn foo(self) -> &'static i32 {
|
||||
| ^^^^ doesn't have a size known at compile-time
|
||||
| ^^^^ - help: consider further restricting `Self`: `where Self: std::marker::Sized`
|
||||
| |
|
||||
| doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Self`
|
||||
= 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 adding a `where Self: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
|
@ -4,7 +4,6 @@ error[E0277]: the trait bound `<Col as Expression>::SqlType: NotNull` is not sat
|
||||
LL | #[derive(Debug, Copy, Clone)]
|
||||
| ^^^^ the trait `NotNull` is not implemented for `<Col as Expression>::SqlType`
|
||||
|
|
||||
= help: consider adding a `where <Col as Expression>::SqlType: NotNull` bound
|
||||
= note: required because of the requirements on the impl of `IntoNullable` for `<Col as Expression>::SqlType`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -2,11 +2,12 @@ error[E0277]: the size for values of type `<Self as std::ops::Deref>::Target` ca
|
||||
--> $DIR/issue-42312.rs:4:29
|
||||
|
|
||||
LL | fn baz(_: Self::Target) where Self: Deref {}
|
||||
| ^ doesn't have a size known at compile-time
|
||||
| ^ - help: consider further restricting the associated type: `, <Self as std::ops::Deref>::Target: std::marker::Sized`
|
||||
| |
|
||||
| doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `<Self as std::ops::Deref>::Target`
|
||||
= 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 adding a `where <Self as std::ops::Deref>::Target: std::marker::Sized` bound
|
||||
= note: all function arguments must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
|
@ -2,9 +2,9 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/issue-43784-associated-type.rs:13:9
|
||||
|
|
||||
LL | impl<T> Complete for T {
|
||||
| ^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
| - ^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
| |
|
||||
| help: consider restricting this bound: `T: std::marker::Copy`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,9 +2,9 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/issue-43784-supertrait.rs:8:9
|
||||
|
|
||||
LL | impl<T> Complete for T {}
|
||||
| ^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
| - ^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
| |
|
||||
| help: consider restricting this bound: `T: std::marker::Copy`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,42 +1,50 @@
|
||||
error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/kindck-impl-type-params.rs:18:13
|
||||
|
|
||||
LL | fn f<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Send`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a = &t as &dyn Gettable<T>;
|
||||
| ^^ `T` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/kindck-impl-type-params.rs:18:13
|
||||
|
|
||||
LL | fn f<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a = &t as &dyn Gettable<T>;
|
||||
| ^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/kindck-impl-type-params.rs:25:31
|
||||
|
|
||||
LL | fn g<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Send`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a: &dyn Gettable<T> = &t;
|
||||
| ^^ `T` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/kindck-impl-type-params.rs:25:31
|
||||
|
|
||||
LL | fn g<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a: &dyn Gettable<T> = &t;
|
||||
| ^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
|
@ -1,42 +1,50 @@
|
||||
error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/kindck-impl-type-params.rs:18:13
|
||||
|
|
||||
LL | fn f<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Send`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a = &t as &dyn Gettable<T>;
|
||||
| ^^ `T` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/kindck-impl-type-params.rs:18:13
|
||||
|
|
||||
LL | fn f<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a = &t as &dyn Gettable<T>;
|
||||
| ^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/kindck-impl-type-params.rs:25:31
|
||||
|
|
||||
LL | fn g<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Send`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a: &dyn Gettable<T> = &t;
|
||||
| ^^ `T` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/kindck-impl-type-params.rs:25:31
|
||||
|
|
||||
LL | fn g<T>(val: T) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | let t: S<T> = S(marker::PhantomData);
|
||||
LL | let a: &dyn Gettable<T> = &t;
|
||||
| ^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
= note: required because of the requirements on the impl of `Gettable<T>` for `S<T>`
|
||||
= note: required for the cast to the object type `dyn Gettable<T>`
|
||||
|
||||
|
@ -5,7 +5,6 @@ LL | a == b;
|
||||
| ^^ no implementation for `&T == T`
|
||||
|
|
||||
= help: the trait `std::cmp::PartialEq<T>` is not implemented for `&T`
|
||||
= help: consider adding a `where &T: std::cmp::PartialEq<T>` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,12 +3,13 @@ error[E0277]: `T` cannot be shared between threads safely
|
||||
|
|
||||
LL | fn is_zen<T: Zen>(_: T) {}
|
||||
| ------ --- required by this bound in `is_zen`
|
||||
...
|
||||
LL |
|
||||
LL | fn not_sync<T>(x: Guard<T>) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Sync`
|
||||
LL | is_zen(x)
|
||||
| ^ `T` cannot be shared between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Sync` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Sync` bound
|
||||
= note: required because of the requirements on the impl of `Zen` for `&T`
|
||||
= note: required because it appears within the type `std::marker::PhantomData<&T>`
|
||||
= note: required because it appears within the type `Guard<'_, T>`
|
||||
@ -19,11 +20,12 @@ error[E0277]: `T` cannot be shared between threads safely
|
||||
LL | fn is_zen<T: Zen>(_: T) {}
|
||||
| ------ --- required by this bound in `is_zen`
|
||||
...
|
||||
LL | fn nested_not_sync<T>(x: Nested<Guard<T>>) {
|
||||
| - help: consider restricting this bound: `T: std::marker::Sync`
|
||||
LL | is_zen(x)
|
||||
| ^ `T` cannot be shared between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Sync` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Sync` bound
|
||||
= note: required because of the requirements on the impl of `Zen` for `&T`
|
||||
= note: required because it appears within the type `std::marker::PhantomData<&T>`
|
||||
= note: required because it appears within the type `Guard<'_, T>`
|
||||
|
@ -2,9 +2,9 @@ error[E0277]: the trait bound `U: std::cmp::Eq` is not satisfied
|
||||
--> $DIR/specialization-wfcheck.rs:7:17
|
||||
|
|
||||
LL | default impl<U> Foo<'static, U> for () {}
|
||||
| ^^^^^^^^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::cmp::Eq` bound
|
||||
| - ^^^^^^^^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `U`
|
||||
| |
|
||||
| help: consider restricting this bound: `U: std::cmp::Eq`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -0,0 +1,25 @@
|
||||
// Running rustfix would cause the same suggestion to be applied multiple times, which results in
|
||||
// invalid code.
|
||||
|
||||
trait Parent {
|
||||
type Ty;
|
||||
type Assoc: Child<Self::Ty>;
|
||||
}
|
||||
|
||||
trait Child<T> {}
|
||||
|
||||
struct ChildWrapper<T>(T);
|
||||
|
||||
impl<A, T> Child<A> for ChildWrapper<T> where T: Child<A> {}
|
||||
|
||||
struct ParentWrapper<T>(T);
|
||||
|
||||
impl<A, T: Parent<Ty = A>> Parent for ParentWrapper<T> {
|
||||
//~^ ERROR the trait bound `<T as Parent>::Assoc: Child<A>` is not satisfied
|
||||
//~| ERROR the trait bound `<T as Parent>::Assoc: Child<A>` is not satisfied
|
||||
type Ty = A;
|
||||
type Assoc = ChildWrapper<T::Assoc>;
|
||||
//~^ ERROR the trait bound `<T as Parent>::Assoc: Child<A>` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,43 @@
|
||||
error[E0277]: the trait bound `<T as Parent>::Assoc: Child<A>` is not satisfied
|
||||
--> $DIR/missing-assoc-type-bound-restriction.rs:17:1
|
||||
|
|
||||
LL | trait Parent {
|
||||
| ------------ required by `Parent`
|
||||
...
|
||||
LL | impl<A, T: Parent<Ty = A>> Parent for ParentWrapper<T> {
|
||||
| ^ - help: consider further restricting the associated type: `where <T as Parent>::Assoc: Child<A>`
|
||||
| _|
|
||||
| |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | type Ty = A;
|
||||
LL | | type Assoc = ChildWrapper<T::Assoc>;
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^ the trait `Child<A>` is not implemented for `<T as Parent>::Assoc`
|
||||
|
||||
error[E0277]: the trait bound `<T as Parent>::Assoc: Child<A>` is not satisfied
|
||||
--> $DIR/missing-assoc-type-bound-restriction.rs:17:28
|
||||
|
|
||||
LL | impl<A, T: Parent<Ty = A>> Parent for ParentWrapper<T> {
|
||||
| ^^^^^^ - help: consider further restricting the associated type: `where <T as Parent>::Assoc: Child<A>`
|
||||
| |
|
||||
| the trait `Child<A>` is not implemented for `<T as Parent>::Assoc`
|
||||
|
|
||||
= note: required because of the requirements on the impl of `Child<A>` for `ChildWrapper<<T as Parent>::Assoc>`
|
||||
|
||||
error[E0277]: the trait bound `<T as Parent>::Assoc: Child<A>` is not satisfied
|
||||
--> $DIR/missing-assoc-type-bound-restriction.rs:21:5
|
||||
|
|
||||
LL | trait Parent {
|
||||
| ------------ required by `Parent`
|
||||
...
|
||||
LL | impl<A, T: Parent<Ty = A>> Parent for ParentWrapper<T> {
|
||||
| - help: consider further restricting the associated type: `where <T as Parent>::Assoc: Child<A>`
|
||||
...
|
||||
LL | type Assoc = ChildWrapper<T::Assoc>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Child<A>` is not implemented for `<T as Parent>::Assoc`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
31
src/test/ui/suggestions/restrict-type-argument.rs
Normal file
31
src/test/ui/suggestions/restrict-type-argument.rs
Normal file
@ -0,0 +1,31 @@
|
||||
fn is_send<T: Send>(val: T) {}
|
||||
|
||||
fn use_impl_sync(val: impl Sync) {
|
||||
is_send(val); //~ ERROR `impl Sync` cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn use_where<S>(val: S) where S: Sync {
|
||||
is_send(val); //~ ERROR `S` cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn use_bound<S: Sync>(val: S) {
|
||||
is_send(val); //~ ERROR `S` cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn use_bound_2<
|
||||
S // Make sure we can synthezise a correct suggestion span for this case
|
||||
:
|
||||
Sync
|
||||
>(val: S) {
|
||||
is_send(val); //~ ERROR `S` cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn use_bound_and_where<S: Sync>(val: S) where S: std::fmt::Debug {
|
||||
is_send(val); //~ ERROR `S` cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn use_unbound<S>(val: S) {
|
||||
is_send(val); //~ ERROR `S` cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn main() {}
|
83
src/test/ui/suggestions/restrict-type-argument.stderr
Normal file
83
src/test/ui/suggestions/restrict-type-argument.stderr
Normal file
@ -0,0 +1,83 @@
|
||||
error[E0277]: `impl Sync` cannot be sent between threads safely
|
||||
--> $DIR/restrict-type-argument.rs:4:13
|
||||
|
|
||||
LL | fn is_send<T: Send>(val: T) {}
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
LL |
|
||||
LL | fn use_impl_sync(val: impl Sync) {
|
||||
| --------- help: consider further restricting this bound: `impl Sync + std::marker::Send`
|
||||
LL | is_send(val);
|
||||
| ^^^ `impl Sync` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `impl Sync`
|
||||
|
||||
error[E0277]: `S` cannot be sent between threads safely
|
||||
--> $DIR/restrict-type-argument.rs:8:13
|
||||
|
|
||||
LL | fn is_send<T: Send>(val: T) {}
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
...
|
||||
LL | fn use_where<S>(val: S) where S: Sync {
|
||||
| - help: consider further restricting type parameter `S`: `, S: std::marker::Send`
|
||||
LL | is_send(val);
|
||||
| ^^^ `S` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `S`
|
||||
|
||||
error[E0277]: `S` cannot be sent between threads safely
|
||||
--> $DIR/restrict-type-argument.rs:12:13
|
||||
|
|
||||
LL | fn is_send<T: Send>(val: T) {}
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
...
|
||||
LL | fn use_bound<S: Sync>(val: S) {
|
||||
| -- help: consider further restricting this bound: `S: std::marker::Send +`
|
||||
LL | is_send(val);
|
||||
| ^^^ `S` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `S`
|
||||
|
||||
error[E0277]: `S` cannot be sent between threads safely
|
||||
--> $DIR/restrict-type-argument.rs:20:13
|
||||
|
|
||||
LL | fn is_send<T: Send>(val: T) {}
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
...
|
||||
LL | / S // Make sure we can synthezise a correct suggestion span for this case
|
||||
LL | | :
|
||||
| |_____- help: consider further restricting this bound: `S: std::marker::Send +`
|
||||
...
|
||||
LL | is_send(val);
|
||||
| ^^^ `S` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `S`
|
||||
|
||||
error[E0277]: `S` cannot be sent between threads safely
|
||||
--> $DIR/restrict-type-argument.rs:24:13
|
||||
|
|
||||
LL | fn is_send<T: Send>(val: T) {}
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
...
|
||||
LL | fn use_bound_and_where<S: Sync>(val: S) where S: std::fmt::Debug {
|
||||
| - help: consider further restricting type parameter `S`: `, S: std::marker::Send`
|
||||
LL | is_send(val);
|
||||
| ^^^ `S` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `S`
|
||||
|
||||
error[E0277]: `S` cannot be sent between threads safely
|
||||
--> $DIR/restrict-type-argument.rs:28:13
|
||||
|
|
||||
LL | fn is_send<T: Send>(val: T) {}
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
...
|
||||
LL | fn use_unbound<S>(val: S) {
|
||||
| - help: consider restricting this bound: `S: std::marker::Send`
|
||||
LL | is_send(val);
|
||||
| ^^^ `S` cannot be sent between threads safely
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `S`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
@ -4,9 +4,10 @@ error[E0277]: the trait bound `T: Foo` is not satisfied
|
||||
LL | trait A<T: Foo> {}
|
||||
| --------------- required by `A`
|
||||
LL | trait B<T> = A<T>;
|
||||
| ^^^^^^^^^^^^^^^^^^ the trait `Foo` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Foo` bound
|
||||
| ^^^^^^^^-^^^^^^^^^
|
||||
| | |
|
||||
| | help: consider restricting this bound: `T: Foo`
|
||||
| the trait `Foo` is not implemented for `T`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,9 +5,9 @@ LL | struct Foo<T:Trait> {
|
||||
| ------------------- required by `Foo`
|
||||
...
|
||||
LL | impl<T> Foo<T> {
|
||||
| ^^^^^^ the trait `Trait` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Trait` bound
|
||||
| - ^^^^^^ the trait `Trait` is not implemented for `T`
|
||||
| |
|
||||
| help: consider restricting this bound: `T: Trait`
|
||||
|
||||
error[E0277]: the trait bound `isize: Trait` is not satisfied
|
||||
--> $DIR/trait-bounds-on-structs-and-enums.rs:19:5
|
||||
@ -33,10 +33,10 @@ error[E0277]: the trait bound `U: Trait` is not satisfied
|
||||
LL | struct Foo<T:Trait> {
|
||||
| ------------------- required by `Foo`
|
||||
...
|
||||
LL | struct Badness<U> {
|
||||
| - help: consider restricting this bound: `U: Trait`
|
||||
LL | b: Foo<U>,
|
||||
| ^^^^^^^^^ the trait `Trait` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: Trait` bound
|
||||
|
||||
error[E0277]: the trait bound `V: Trait` is not satisfied
|
||||
--> $DIR/trait-bounds-on-structs-and-enums.rs:31:21
|
||||
@ -44,10 +44,10 @@ error[E0277]: the trait bound `V: Trait` is not satisfied
|
||||
LL | enum Bar<T:Trait> {
|
||||
| ----------------- required by `Bar`
|
||||
...
|
||||
LL | enum MoreBadness<V> {
|
||||
| - help: consider restricting this bound: `V: Trait`
|
||||
LL | EvenMoreBadness(Bar<V>),
|
||||
| ^^^^^^ the trait `Trait` is not implemented for `V`
|
||||
|
|
||||
= help: consider adding a `where V: Trait` bound
|
||||
|
||||
error[E0277]: the trait bound `i32: Trait` is not satisfied
|
||||
--> $DIR/trait-bounds-on-structs-and-enums.rs:35:5
|
||||
|
@ -1,6 +1,9 @@
|
||||
error[E0277]: the size for values of type `U` cannot be known at compilation time
|
||||
--> $DIR/trait-suggest-where-clause.rs:9:20
|
||||
|
|
||||
LL | fn check<T: Iterator, U: ?Sized>() {
|
||||
| -- help: consider further restricting this bound: `U: std::marker::Sized +`
|
||||
LL | // suggest a where-clause, if needed
|
||||
LL | mem::size_of::<U>();
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
@ -11,11 +14,13 @@ LL | pub const fn size_of<T>() -> usize {
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `U`
|
||||
= 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 adding a `where U: std::marker::Sized` bound
|
||||
|
||||
error[E0277]: the size for values of type `U` cannot be known at compilation time
|
||||
--> $DIR/trait-suggest-where-clause.rs:12:5
|
||||
|
|
||||
LL | fn check<T: Iterator, U: ?Sized>() {
|
||||
| -- help: consider further restricting this bound: `U: std::marker::Sized +`
|
||||
...
|
||||
LL | mem::size_of::<Misc<U>>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
@ -26,7 +31,6 @@ LL | pub const fn size_of<T>() -> usize {
|
||||
|
|
||||
= help: within `Misc<U>`, the trait `std::marker::Sized` is not implemented for `U`
|
||||
= 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 adding a `where U: std::marker::Sized` bound
|
||||
= note: required because it appears within the type `Misc<U>`
|
||||
|
||||
error[E0277]: the trait bound `u64: std::convert::From<T>` is not satisfied
|
||||
@ -35,7 +39,6 @@ error[E0277]: the trait bound `u64: std::convert::From<T>` is not satisfied
|
||||
LL | <u64 as From<T>>::from;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<T>` is not implemented for `u64`
|
||||
|
|
||||
= help: consider adding a `where u64: std::convert::From<T>` bound
|
||||
= note: required by `std::convert::From::from`
|
||||
|
||||
error[E0277]: the trait bound `u64: std::convert::From<<T as std::iter::Iterator>::Item>` is not satisfied
|
||||
@ -44,7 +47,6 @@ error[E0277]: the trait bound `u64: std::convert::From<<T as std::iter::Iterator
|
||||
LL | <u64 as From<<T as Iterator>::Item>>::from;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<<T as std::iter::Iterator>::Item>` is not implemented for `u64`
|
||||
|
|
||||
= help: consider adding a `where u64: std::convert::From<<T as std::iter::Iterator>::Item>` bound
|
||||
= note: required by `std::convert::From::from`
|
||||
|
||||
error[E0277]: the trait bound `Misc<_>: std::convert::From<T>` is not satisfied
|
||||
|
@ -7,10 +7,10 @@ LL | c.same_as(22)
|
||||
error[E0277]: the trait bound `C: CompareTo<i32>` is not satisfied
|
||||
--> $DIR/traits-repeated-supertrait-ambig.rs:30:7
|
||||
|
|
||||
LL | fn with_trait<C:CompareToInts>(c: &C) -> bool {
|
||||
| -- help: consider further restricting this bound: `C: CompareTo<i32> +`
|
||||
LL | c.same_as(22)
|
||||
| ^^^^^^^ the trait `CompareTo<i32>` is not implemented for `C`
|
||||
|
|
||||
= help: consider adding a `where C: CompareTo<i32>` bound
|
||||
|
||||
error[E0277]: the trait bound `dyn CompareToInts: CompareTo<i32>` is not satisfied
|
||||
--> $DIR/traits-repeated-supertrait-ambig.rs:34:5
|
||||
@ -27,10 +27,10 @@ error[E0277]: the trait bound `C: CompareTo<i32>` is not satisfied
|
||||
LL | fn same_as(&self, t: T) -> bool;
|
||||
| -------------------------------- required by `CompareTo::same_as`
|
||||
...
|
||||
LL | fn with_ufcs2<C:CompareToInts>(c: &C) -> bool {
|
||||
| -- help: consider further restricting this bound: `C: CompareTo<i32> +`
|
||||
LL | CompareTo::same_as(c, 22)
|
||||
| ^^^^^^^^^^^^^^^^^^ the trait `CompareTo<i32>` is not implemented for `C`
|
||||
|
|
||||
= help: consider adding a `where C: CompareTo<i32>` bound
|
||||
|
||||
error[E0277]: the trait bound `i64: CompareTo<i32>` is not satisfied
|
||||
--> $DIR/traits-repeated-supertrait-ambig.rs:42:23
|
||||
|
@ -9,8 +9,10 @@ error[E0277]: the trait bound `T: Trait` is not satisfied
|
||||
|
|
||||
LL | type Underconstrained<T: Trait> = impl 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
|
||||
...
|
||||
LL | fn underconstrain<T>(_: T) -> Underconstrained<T> {
|
||||
| - help: consider restricting this bound: `T: Trait`
|
||||
|
|
||||
= help: consider adding a `where T: Trait` bound
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -15,9 +15,11 @@ error[E0277]: `U` doesn't implement `std::fmt::Debug`
|
||||
|
|
||||
LL | type Underconstrained<T: std::fmt::Debug> = impl 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `U` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
||||
...
|
||||
LL | fn underconstrained<U>(_: U) -> Underconstrained<U> {
|
||||
| - help: consider restricting this bound: `U: std::fmt::Debug`
|
||||
|
|
||||
= help: the trait `std::fmt::Debug` is not implemented for `U`
|
||||
= help: consider adding a `where U: std::fmt::Debug` bound
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error[E0277]: `V` doesn't implement `std::fmt::Debug`
|
||||
@ -25,9 +27,11 @@ error[E0277]: `V` doesn't implement `std::fmt::Debug`
|
||||
|
|
||||
LL | type Underconstrained2<T: std::fmt::Debug> = impl 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `V` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
||||
...
|
||||
LL | fn underconstrained2<U, V>(_: U, _: V) -> Underconstrained2<V> {
|
||||
| - help: consider restricting this bound: `V: std::fmt::Debug`
|
||||
|
|
||||
= help: the trait `std::fmt::Debug` is not implemented for `V`
|
||||
= help: consider adding a `where V: std::fmt::Debug` bound
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
@ -52,9 +52,10 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | trait Super<T: Copy> { }
|
||||
| -------------------- required by `Super`
|
||||
LL | trait Base<T = String>: Super<T> { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
| ^^^^^^^^^^^-^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| | |
|
||||
| | help: consider restricting this bound: `T: std::marker::Copy`
|
||||
| the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
||||
error[E0277]: cannot add `u8` to `i32`
|
||||
--> $DIR/type-check-defaults.rs:24:66
|
||||
|
@ -4,10 +4,10 @@ error[E0277]: the trait bound `Self: Tr<U>` is not satisfied
|
||||
LL | fn op(_: T) -> Self;
|
||||
| -------------------- required by `Tr::op`
|
||||
...
|
||||
LL | fn test<U>(u: U) -> Self {
|
||||
| - help: consider further restricting `Self`: `where Self: Tr<U>`
|
||||
LL | Tr::op(u)
|
||||
| ^^^^^^ the trait `Tr<U>` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: Tr<U>` bound
|
||||
|
||||
error[E0277]: the trait bound `Self: Tr<U>` is not satisfied
|
||||
--> $DIR/type-params-in-different-spaces-2.rs:16:9
|
||||
@ -15,10 +15,10 @@ error[E0277]: the trait bound `Self: Tr<U>` is not satisfied
|
||||
LL | fn op(_: T) -> Self;
|
||||
| -------------------- required by `Tr::op`
|
||||
...
|
||||
LL | fn test<U>(u: U) -> Self {
|
||||
| - help: consider further restricting `Self`: `where Self: Tr<U>`
|
||||
LL | Tr::op(u)
|
||||
| ^^^^^^ the trait `Tr<U>` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: Tr<U>` bound
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -0,0 +1,17 @@
|
||||
// run-rustfix
|
||||
// Test that we do not consider associated types to be sendable without
|
||||
// some applicable trait bound (and we don't ICE).
|
||||
#![allow(dead_code)]
|
||||
|
||||
trait Trait {
|
||||
type AssocType;
|
||||
fn dummy(&self) { }
|
||||
}
|
||||
fn bar<T:Trait+Send>() where <T as Trait>::AssocType: std::marker::Send {
|
||||
is_send::<T::AssocType>(); //~ ERROR E0277
|
||||
}
|
||||
|
||||
fn is_send<T:Send>() {
|
||||
}
|
||||
|
||||
fn main() { }
|
@ -1,5 +1,7 @@
|
||||
// run-rustfix
|
||||
// Test that we do not consider associated types to be sendable without
|
||||
// some applicable trait bound (and we don't ICE).
|
||||
#![allow(dead_code)]
|
||||
|
||||
trait Trait {
|
||||
type AssocType;
|
||||
|
@ -1,6 +1,8 @@
|
||||
error[E0277]: `<T as Trait>::AssocType` cannot be sent between threads safely
|
||||
--> $DIR/typeck-default-trait-impl-assoc-type.rs:9:5
|
||||
--> $DIR/typeck-default-trait-impl-assoc-type.rs:11:5
|
||||
|
|
||||
LL | fn bar<T:Trait+Send>() {
|
||||
| - help: consider further restricting the associated type: `where <T as Trait>::AssocType: std::marker::Send`
|
||||
LL | is_send::<T::AssocType>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ `<T as Trait>::AssocType` cannot be sent between threads safely
|
||||
...
|
||||
@ -8,7 +10,6 @@ LL | fn is_send<T:Send>() {
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `<T as Trait>::AssocType`
|
||||
= help: consider adding a `where <T as Trait>::AssocType: std::marker::Send` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
error[E0277]: `T` cannot be sent between threads safely
|
||||
--> $DIR/typeck-default-trait-impl-send-param.rs:5:15
|
||||
|
|
||||
LL | fn foo<T>() {
|
||||
| - help: consider restricting this bound: `T: std::marker::Send`
|
||||
LL | is_send::<T>()
|
||||
| ^ `T` cannot be sent between threads safely
|
||||
...
|
||||
@ -8,7 +10,6 @@ LL | fn is_send<T:Send>() {
|
||||
| ------- ---- required by this bound in `is_send`
|
||||
|
|
||||
= help: the trait `std::marker::Send` is not implemented for `T`
|
||||
= help: consider adding a `where T: std::marker::Send` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,34 +1,37 @@
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/union-sized-field.rs:4:5
|
||||
|
|
||||
LL | union Foo<T: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
LL | value: T,
|
||||
| ^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: no field of a union may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/union-sized-field.rs:9:5
|
||||
|
|
||||
LL | struct Foo2<T: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
LL | value: T,
|
||||
| ^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: only the last field of a struct may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/union-sized-field.rs:15:11
|
||||
|
|
||||
LL | enum Foo3<T: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
LL | Value(T),
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
@ -4,11 +4,12 @@ error[E0277]: the size for values of type `T` cannot be known at compilation tim
|
||||
LL | fn bar<T: Sized>() { }
|
||||
| --- - required by this bound in `bar`
|
||||
LL | fn foo<T: ?Sized>() { bar::<T>() }
|
||||
| ^ doesn't have a size known at compile-time
|
||||
| -- ^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,11 +5,12 @@ LL | enum Foo<U> { FooSome(U), FooNone }
|
||||
| ----------- required by `Foo`
|
||||
LL | fn foo1<T>() { not_sized::<Foo<T>>() } // Hunky dory.
|
||||
LL | fn foo2<T: ?Sized>() { not_sized::<Foo<T>>() }
|
||||
| ^^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,45 +1,53 @@
|
||||
error[E0277]: the size for values of type `W` cannot be known at compilation time
|
||||
--> $DIR/unsized-enum2.rs:23:8
|
||||
|
|
||||
LL | enum E<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `W: std::marker::Sized +`
|
||||
LL | // parameter
|
||||
LL | VA(W),
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `W`
|
||||
= 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 adding a `where W: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized-enum2.rs:25:8
|
||||
|
|
||||
LL | enum E<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
...
|
||||
LL | VB{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 adding a `where X: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `Y` cannot be known at compilation time
|
||||
--> $DIR/unsized-enum2.rs:27:15
|
||||
|
|
||||
LL | enum E<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `Y: std::marker::Sized +`
|
||||
...
|
||||
LL | VC(isize, Y),
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Y`
|
||||
= 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 adding a `where Y: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `Z` cannot be known at compilation time
|
||||
--> $DIR/unsized-enum2.rs:29:18
|
||||
|
|
||||
LL | enum E<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `Z: std::marker::Sized +`
|
||||
...
|
||||
LL | VD{u: isize, x: Z},
|
||||
| ^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Z`
|
||||
= 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 adding a `where Z: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
|
@ -5,11 +5,12 @@ LL | struct S5<Y>(Y);
|
||||
| ---------------- required by `S5`
|
||||
LL |
|
||||
LL | impl<X: ?Sized> S5<X> {
|
||||
| ^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,11 +5,12 @@ LL | struct Foo<T> { data: T }
|
||||
| ------------- required by `Foo`
|
||||
LL | fn foo1<T>() { not_sized::<Foo<T>>() } // Hunky dory.
|
||||
LL | fn foo2<T: ?Sized>() { not_sized::<Foo<T>>() }
|
||||
| ^^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/unsized-struct.rs:13:24
|
||||
@ -18,11 +19,12 @@ LL | fn is_sized<T:Sized>() { }
|
||||
| -------- - required by this bound in `is_sized`
|
||||
...
|
||||
LL | fn bar2<T: ?Sized>() { is_sized::<Bar<T>>() }
|
||||
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `T: std::marker::Sized +`
|
||||
|
|
||||
= help: within `Bar<T>`, the trait `std::marker::Sized` is not implemented for `T`
|
||||
= 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 adding a `where T: std::marker::Sized` bound
|
||||
= note: required because it appears within the type `Bar<T>`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -5,11 +5,12 @@ LL | struct S5<Y>(Y);
|
||||
| ---------------- required by `S5`
|
||||
LL |
|
||||
LL | impl<X: ?Sized> T3<X> for S5<X> {
|
||||
| ^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,11 +2,12 @@ error[E0277]: the size for values of type `X` cannot be known at compilation tim
|
||||
--> $DIR/unsized-trait-impl-trait-arg.rs:8:17
|
||||
|
|
||||
LL | impl<X: ?Sized> T2<X> for S4<X> {
|
||||
| ^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
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
|
||||
...
|
||||
@ -9,11 +11,12 @@ LL | fn f2<X>(x: &X) {
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
|
||||
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
|
||||
...
|
||||
@ -22,7 +25,6 @@ LL | fn f4<X: T>(x: &X) {
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized3.rs:33:8
|
||||
@ -30,35 +32,38 @@ error[E0277]: the size for values of type `X` cannot be known at compilation tim
|
||||
LL | fn f5<Y>(x: &Y) {}
|
||||
| -- - required by this bound in `f5`
|
||||
...
|
||||
LL | fn f8<X: ?Sized>(x1: &S<X>, x2: &S<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | f5(x1);
|
||||
| ^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `S<X>`, 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: required because it appears within the type `S<X>`
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized3.rs:40:8
|
||||
|
|
||||
LL | fn f9<X: ?Sized>(x1: Box<S<X>>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | f5(&(*x1, 34));
|
||||
| ^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `S<X>`, 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: required because it appears within the type `S<X>`
|
||||
= note: only the last element of a tuple may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized3.rs:45:9
|
||||
|
|
||||
LL | fn f10<X: ?Sized>(x1: Box<S<X>>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | f5(&(32, *x1));
|
||||
| ^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `({integer}, S<X>)`, 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: required because it appears within the type `S<X>`
|
||||
= note: required because it appears within the type `({integer}, S<X>)`
|
||||
= note: tuples must have a statically known size to be initialized
|
||||
@ -69,12 +74,13 @@ error[E0277]: the size for values of type `X` cannot be known at compilation tim
|
||||
LL | fn f5<Y>(x: &Y) {}
|
||||
| -- - required by this bound in `f5`
|
||||
...
|
||||
LL | fn f10<X: ?Sized>(x1: Box<S<X>>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | f5(&(32, *x1));
|
||||
| ^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `({integer}, S<X>)`, 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: required because it appears within the type `S<X>`
|
||||
= note: required because it appears within the type `({integer}, S<X>)`
|
||||
|
||||
|
@ -1,23 +1,26 @@
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized5.rs:4:5
|
||||
|
|
||||
LL | struct S1<X: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | f1: 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: only the last field of a struct may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized5.rs:10:5
|
||||
|
|
||||
LL | struct S2<X: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | f: isize,
|
||||
LL | g: 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: only the last field of a struct may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
||||
@ -43,23 +46,25 @@ LL | f: [u8],
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized5.rs:25:8
|
||||
|
|
||||
LL | enum E<X: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | V1(X, isize),
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized5.rs:29:8
|
||||
|
|
||||
LL | enum F<X: ?Sized> {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | V2{f1: X, f: isize},
|
||||
| ^^^^^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: no field of an enum variant may have a dynamically sized type
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
@ -1,129 +1,148 @@
|
||||
error[E0277]: the size for values of type `Y` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:9:9
|
||||
|
|
||||
LL | fn f1<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized>(x: &X) {
|
||||
| -- help: consider further restricting this bound: `Y: std::marker::Sized +`
|
||||
...
|
||||
LL | let y: Y;
|
||||
| ^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Y`
|
||||
= 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 adding a `where Y: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:7:12
|
||||
|
|
||||
LL | fn f1<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized>(x: &X) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | let _: W; // <-- this is OK, no bindings created, no initializer.
|
||||
LL | let _: (isize, (X, isize));
|
||||
| ^^^^^^^^^^^^^^^^^^^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: only the last element of a tuple may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `Z` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:11:12
|
||||
|
|
||||
LL | fn f1<W: ?Sized, X: ?Sized, Y: ?Sized, Z: ?Sized>(x: &X) {
|
||||
| -- help: consider further restricting this bound: `Z: std::marker::Sized +`
|
||||
...
|
||||
LL | let y: (isize, (Z, usize));
|
||||
| ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Z`
|
||||
= 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 adding a `where Z: std::marker::Sized` bound
|
||||
= note: only the last element of a tuple may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:15:9
|
||||
|
|
||||
LL | fn f2<X: ?Sized, Y: ?Sized>(x: &X) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | let y: 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `Y` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:17:12
|
||||
|
|
||||
LL | fn f2<X: ?Sized, Y: ?Sized>(x: &X) {
|
||||
| -- help: consider further restricting this bound: `Y: std::marker::Sized +`
|
||||
...
|
||||
LL | let y: (isize, (Y, isize));
|
||||
| ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `std::marker::Sized` is not implemented for `Y`
|
||||
= 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 adding a `where Y: std::marker::Sized` bound
|
||||
= note: only the last element of a tuple may have a dynamically sized type
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:22:9
|
||||
|
|
||||
LL | fn f3<X: ?Sized>(x1: Box<X>, x2: Box<X>, x3: Box<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | let y: X = *x1;
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:24:9
|
||||
|
|
||||
LL | fn f3<X: ?Sized>(x1: Box<X>, x2: Box<X>, x3: Box<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
...
|
||||
LL | let y = *x2;
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:26:10
|
||||
|
|
||||
LL | fn f3<X: ?Sized>(x1: Box<X>, x2: Box<X>, x3: Box<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
...
|
||||
LL | let (y, z) = (*x3, 4);
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:30:9
|
||||
|
|
||||
LL | fn f4<X: ?Sized + T>(x1: Box<X>, x2: Box<X>, x3: Box<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
LL | let y: X = *x1;
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:32:9
|
||||
|
|
||||
LL | fn f4<X: ?Sized + T>(x1: Box<X>, x2: Box<X>, x3: Box<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
...
|
||||
LL | let y = *x2;
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
error[E0277]: the size for values of type `X` cannot be known at compilation time
|
||||
--> $DIR/unsized6.rs:34:10
|
||||
|
|
||||
LL | fn f4<X: ?Sized + T>(x1: Box<X>, x2: Box<X>, x3: Box<X>) {
|
||||
| -- help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
...
|
||||
LL | let (y, z) = (*x3, 4);
|
||||
| ^ 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
@ -131,11 +150,12 @@ error[E0277]: the size for values of type `X` cannot be known at compilation tim
|
||||
--> $DIR/unsized6.rs:38:18
|
||||
|
|
||||
LL | fn g1<X: ?Sized>(x: X) {}
|
||||
| ^ doesn't have a size known at compile-time
|
||||
| -- ^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
@ -143,11 +163,12 @@ error[E0277]: the size for values of type `X` cannot be known at compilation tim
|
||||
--> $DIR/unsized6.rs:40:22
|
||||
|
|
||||
LL | fn g2<X: ?Sized + T>(x: X) {}
|
||||
| ^ doesn't have a size known at compile-time
|
||||
| -- ^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
|
||||
|
@ -2,11 +2,12 @@ error[E0277]: the size for values of type `X` cannot be known at compilation tim
|
||||
--> $DIR/unsized7.rs:12:21
|
||||
|
|
||||
LL | impl<X: ?Sized + T> T1<X> for S3<X> {
|
||||
| ^^^^^ doesn't have a size known at compile-time
|
||||
| -- ^^^^^ doesn't have a size known at compile-time
|
||||
| |
|
||||
| help: consider further restricting this bound: `X: std::marker::Sized +`
|
||||
|
|
||||
= 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 adding a `where X: std::marker::Sized` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,12 +6,11 @@ LL | trait ExtraCopy<T:Copy> { }
|
||||
LL |
|
||||
LL | / enum SomeEnum<T,U>
|
||||
LL | | where T: ExtraCopy<U>
|
||||
| | - help: consider further restricting type parameter `U`: `, U: std::marker::Copy`
|
||||
LL | | {
|
||||
LL | | SomeVariant(T,U)
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,11 @@ error[E0277]: the trait bound `A: std::marker::Copy` is not satisfied
|
||||
LL | struct IsCopy<T:Copy> {
|
||||
| --------------------- required by `IsCopy`
|
||||
...
|
||||
LL | enum AnotherEnum<A> {
|
||||
| - help: consider restricting this bound: `A: std::marker::Copy`
|
||||
LL | AnotherVariant {
|
||||
LL | f: IsCopy<A>
|
||||
| ^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `A`
|
||||
|
|
||||
= help: consider adding a `where A: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,10 @@ error[E0277]: the trait bound `A: std::marker::Copy` is not satisfied
|
||||
LL | struct IsCopy<T:Copy> {
|
||||
| --------------------- required by `IsCopy`
|
||||
...
|
||||
LL | enum SomeEnum<A> {
|
||||
| - help: consider restricting this bound: `A: std::marker::Copy`
|
||||
LL | SomeVariant(IsCopy<A>)
|
||||
| ^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `A`
|
||||
|
|
||||
= help: consider adding a `where A: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,12 +4,13 @@ error[E0277]: the trait bound `U: std::marker::Copy` is not satisfied
|
||||
LL | trait ExtraCopy<T:Copy> { }
|
||||
| ----------------------- required by `ExtraCopy`
|
||||
LL |
|
||||
LL | / fn foo<T,U>() where T: ExtraCopy<U>
|
||||
LL | fn foo<T,U>() where T: ExtraCopy<U>
|
||||
| ^ - help: consider further restricting type parameter `U`: `, U: std::marker::Copy`
|
||||
| _|
|
||||
| |
|
||||
LL | | {
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error[E0277]: the size for values of type `(dyn std::marker::Copy + 'static)` cannot be known at compilation time
|
||||
--> $DIR/wf-fn-where-clause.rs:12:1
|
||||
|
@ -4,10 +4,10 @@ error[E0277]: the trait bound `T: MyHash` is not satisfied
|
||||
LL | pub struct MySet<T:MyHash> {
|
||||
| -------------------------- required by `MySet`
|
||||
...
|
||||
LL | impl<T> Foo for T {
|
||||
| - help: consider restricting this bound: `T: MyHash`
|
||||
LL | type Bar = MySet<T>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^ the trait `MyHash` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: MyHash` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,12 +4,13 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ------------------------- required by `MustBeCopy`
|
||||
...
|
||||
LL | / fn bar<T>(_: &MustBeCopy<T>)
|
||||
LL | fn bar<T>(_: &MustBeCopy<T>)
|
||||
| ^ - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
| _|
|
||||
| |
|
||||
LL | | {
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,12 +4,13 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ------------------------- required by `MustBeCopy`
|
||||
...
|
||||
LL | / fn bar<T>() -> MustBeCopy<T>
|
||||
LL | fn bar<T>() -> MustBeCopy<T>
|
||||
| ^ - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
| _|
|
||||
| |
|
||||
LL | | {
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,11 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ------------------------- required by `MustBeCopy`
|
||||
...
|
||||
LL | struct Bar<T> {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | // needs T: Copy
|
||||
LL | x: fn(MustBeCopy<T>)
|
||||
| ^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,11 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ------------------------- required by `MustBeCopy`
|
||||
...
|
||||
LL | struct Foo<T> {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | // needs T: 'static
|
||||
LL | x: fn() -> MustBeCopy<T>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,11 +6,10 @@ LL | trait MustBeCopy<T:Copy> {
|
||||
...
|
||||
LL | / fn bar<T,U>()
|
||||
LL | | where T: MustBeCopy<U>
|
||||
| | - help: consider further restricting type parameter `U`: `, U: std::marker::Copy`
|
||||
LL | | {
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,11 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ------------------------- required by `MustBeCopy`
|
||||
...
|
||||
LL | struct Bar<T> {
|
||||
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | // needs T: Copy
|
||||
LL | x: dyn Object<MustBeCopy<T>>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,11 +4,11 @@ error[E0277]: the trait bound `U: std::marker::Copy` is not satisfied
|
||||
LL | trait ExtraCopy<T:Copy> { }
|
||||
| ----------------------- required by `ExtraCopy`
|
||||
...
|
||||
LL | impl<T,U> Foo<T,U> {
|
||||
| - help: consider restricting this bound: `U: std::marker::Copy`
|
||||
LL | / fn foo(self) where T: ExtraCopy<U>
|
||||
LL | | {}
|
||||
| |______^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,12 +4,13 @@ error[E0277]: the trait bound `U: std::marker::Copy` is not satisfied
|
||||
LL | trait ExtraCopy<T:Copy> { }
|
||||
| ----------------------- required by `ExtraCopy`
|
||||
...
|
||||
LL | / impl<T,U> Foo<T,U> where T: ExtraCopy<U>
|
||||
LL | impl<T,U> Foo<T,U> where T: ExtraCopy<U>
|
||||
| ^ - help: consider further restricting type parameter `U`: `, U: std::marker::Copy`
|
||||
| _|
|
||||
| |
|
||||
LL | | {
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,12 +6,11 @@ LL | trait ExtraCopy<T:Copy> { }
|
||||
LL |
|
||||
LL | / struct SomeStruct<T,U>
|
||||
LL | | where T: ExtraCopy<U>
|
||||
| | - help: consider further restricting type parameter `U`: `, U: std::marker::Copy`
|
||||
LL | | {
|
||||
LL | | data: (T,U)
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,10 +4,10 @@ error[E0277]: the trait bound `A: std::marker::Copy` is not satisfied
|
||||
LL | struct IsCopy<T:Copy> {
|
||||
| --------------------- required by `IsCopy`
|
||||
...
|
||||
LL | struct SomeStruct<A> {
|
||||
| - help: consider restricting this bound: `A: std::marker::Copy`
|
||||
LL | data: IsCopy<A>
|
||||
| ^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `A`
|
||||
|
|
||||
= help: consider adding a `where A: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,12 +4,13 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | trait ExtraCopy<T:Copy> { }
|
||||
| ----------------------- required by `ExtraCopy`
|
||||
LL |
|
||||
LL | / trait SomeTrait<T> {
|
||||
LL | trait SomeTrait<T> {
|
||||
| ^ - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
| _|
|
||||
| |
|
||||
LL | | type Type1: ExtraCopy<T>;
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,11 +3,12 @@ error[E0277]: the trait bound `<Self as SomeTrait>::Type1: std::marker::Copy` is
|
||||
|
|
||||
LL | struct IsCopy<T:Copy> { x: T }
|
||||
| --------------------- required by `IsCopy`
|
||||
...
|
||||
LL |
|
||||
LL | trait SomeTrait {
|
||||
| - help: consider further restricting the associated type: `where <Self as SomeTrait>::Type1: std::marker::Copy`
|
||||
LL | type Type1;
|
||||
LL | type Type2 = IsCopy<Self::Type1>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `<Self as SomeTrait>::Type1`
|
||||
|
|
||||
= help: consider adding a `where <Self as SomeTrait>::Type1: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,11 +6,10 @@ LL | trait ExtraCopy<T:Copy> { }
|
||||
LL |
|
||||
LL | / trait SomeTrait<T,U>
|
||||
LL | | where T: ExtraCopy<U>
|
||||
| | - help: consider further restricting type parameter `U`: `, U: std::marker::Copy`
|
||||
LL | | {
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `U`
|
||||
|
|
||||
= help: consider adding a `where U: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,14 +4,15 @@ error[E0277]: the trait bound `Self: std::cmp::Eq` is not satisfied
|
||||
LL | struct Bar<T:Eq+?Sized> { value: Box<T> }
|
||||
| ----------------------- required by `Bar`
|
||||
...
|
||||
LL | / fn bar(&self, x: &Bar<Self>) {
|
||||
LL | fn bar(&self, x: &Bar<Self>) {
|
||||
| ^ - help: consider further restricting `Self`: `where Self: std::cmp::Eq`
|
||||
| _____|
|
||||
| |
|
||||
LL | |
|
||||
LL | | //
|
||||
LL | | // Here, Eq ought to be implemented.
|
||||
LL | | }
|
||||
| |_____^ the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: std::cmp::Eq` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,15 +4,16 @@ error[E0277]: the trait bound `Self: std::cmp::Eq` is not satisfied
|
||||
LL | struct Bar<T:Eq+?Sized> { value: Box<T> }
|
||||
| ----------------------- required by `Bar`
|
||||
...
|
||||
LL | / fn bar(&self) -> Bar<Self> {
|
||||
LL | fn bar(&self) -> Bar<Self> {
|
||||
| ^ - help: consider further restricting `Self`: `where Self: std::cmp::Eq`
|
||||
| _____|
|
||||
| |
|
||||
LL | |
|
||||
LL | | //
|
||||
LL | | // Here, Eq ought to be implemented.
|
||||
LL | | loop { }
|
||||
LL | | }
|
||||
| |_____^ the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: std::cmp::Eq` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,14 +4,15 @@ error[E0277]: the trait bound `Self: std::cmp::Eq` is not satisfied
|
||||
LL | trait Bar<T:Eq+?Sized> { }
|
||||
| ---------------------- required by `Bar`
|
||||
...
|
||||
LL | / fn bar<A>(&self) where A: Bar<Self> {
|
||||
LL | fn bar<A>(&self) where A: Bar<Self> {
|
||||
| ^ - help: consider further restricting `Self`: `, Self: std::cmp::Eq`
|
||||
| _____|
|
||||
| |
|
||||
LL | |
|
||||
LL | | //
|
||||
LL | | // Here, Eq ought to be implemented.
|
||||
LL | | }
|
||||
| |_____^ the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: std::cmp::Eq` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,9 +5,10 @@ LL | struct Bar<T:Eq+?Sized> { value: Box<T> }
|
||||
| ----------------------- required by `Bar`
|
||||
...
|
||||
LL | fn bar(&self, x: &Bar<Self>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: std::cmp::Eq` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `where Self: std::cmp::Eq`
|
||||
| the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,9 +5,10 @@ LL | struct Bar<T:Eq+?Sized> { value: Box<T> }
|
||||
| ----------------------- required by `Bar`
|
||||
...
|
||||
LL | fn bar(&self) -> &Bar<Self>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: std::cmp::Eq` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^-
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `where Self: std::cmp::Eq`
|
||||
| the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,9 +5,10 @@ LL | struct Bar<T:Eq+?Sized> { value: Box<T> }
|
||||
| ----------------------- required by `Bar`
|
||||
...
|
||||
LL | fn bar(&self) where Self: Sized, Bar<Self>: Copy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
|
||||
= help: consider adding a `where Self: std::cmp::Eq` bound
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
|
||||
| | |
|
||||
| | help: consider further restricting `Self`: `, Self: std::cmp::Eq`
|
||||
| the trait `std::cmp::Eq` is not implemented for `Self`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,11 +4,12 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
LL | trait ExtraCopy<T:Copy> { }
|
||||
| ----------------------- required by `ExtraCopy`
|
||||
LL |
|
||||
LL | / trait SomeTrait<T>: ExtraCopy<T> {
|
||||
LL | trait SomeTrait<T>: ExtraCopy<T> {
|
||||
| ^ - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
| _|
|
||||
| |
|
||||
LL | | }
|
||||
| |_^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user