Skip to content

ToOwned not implemented for Cow as it ought to be #100347

@marmeladema

Description

@marmeladema

I tried this code:

use std::borrow::Cow; #[derive(Clone)] enum Test <'a> { Int(u8), Array(Cow<'a, [Test<'a>]>), }

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=442442eaa00a34e7c38f9d9db3654160

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.T-libsRelevant to the library team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions