Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
marmeladema opened this issue Aug 9, 2022 · 0 comments
Open

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

marmeladema opened this issue Aug 9, 2022 · 0 comments
Labels
C-bug Category: This is a bug. T-types Relevant to the types team, which will review and decide on the PR/issue.

Comments

@marmeladema
Copy link
Contributor

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.

@marmeladema marmeladema added the C-bug Category: This is a bug. label Aug 9, 2022
@lcnr lcnr added the T-types Relevant to the types team, which will review and decide on the PR/issue. label Aug 10, 2022
@Enselic Enselic changed the title ToOwned not implemented as it ought to be ToOwned not implemented for Cow as it ought to be Apr 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. T-types Relevant to the types team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

2 participants