Skip to content

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

Closed
@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