Closed
Description
I tried this code:
use std::borrow::Cow;
#[derive(Clone)]
enum Test <'a> {
Int(u8),
Array(Cow<'a, [Test<'a>]>),
}
I expected to see this happen: it compiles successfully.
Instead, this happened: it fails to compile with the following error:
error[[E0277]](https://doc.rust-lang.org/stable/error-index.html#E0277): the trait bound `[Test<'a>]: ToOwned` is not satisfied in `Cow<'a, [Test<'a>]>`
--> src/lib.rs:5:11
|
5 | Array(Cow<'a, [Test<'a>]>),
| ^^^^^^^^^^^^^^^^^^^ within `Cow<'a, [Test<'a>]>`, the trait `ToOwned` is not implemented for `[Test<'a>]`
|
= help: the trait `ToOwned` is implemented for `[T]`
= note: required because it appears within the type `Cow<'a, [Test<'a>]>`
= note: no field of an enum variant may have a dynamically sized type
= help: change the field's type to have a statically known size
help: borrowed types always have a statically known size
|
5 | Array(&Cow<'a, [Test<'a>]>),
| +
help: the `Box` type always has a statically known size and allocates its contents in the heap
|
5 | Array(Box<Cow<'a, [Test<'a>]>>),
| ++++ +
error[[E0277]](https://doc.rust-lang.org/stable/error-index.html#E0277): the trait bound `[Test<'a>]: ToOwned` is not satisfied in `Test<'a>`
--> src/lib.rs:3:10
|
3 | #[derive(Clone)]
| ^^^^^ within `Test<'a>`, the trait `ToOwned` is not implemented for `[Test<'a>]`
|
= help: the trait `ToOwned` is implemented for `[T]`
note: required because it appears within the type `Test<'a>`
--> src/lib.rs:4:6
|
4 | enum Test <'a> {
| ^^^^
note: required by a bound in `Clone`
= note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
For more information about this error, try `rustc --explain E0277`.
Meta
As of today's stable version 1.61.1, no versions have ever successfully accepted this code. However I believe there is nothing inherently wrong about it and I have faced this failure for such pattern multiple times already.
Workaround
You can workaround the issue by writing your Cow
-like type.