Skip to content

Suggest ?Sized on generics where applicable #38936

Closed
@J-F-Liu

Description

@J-F-Liu

I meet a compile error can be demonstrated by the following code, and think it's irrational:

trait Train {
    fn knots(&self) -> usize;
}

impl Train for str {
    fn knots(&self) -> usize {
        self.chars().count()
    }
}

fn train_length<T:Train>(text: &'static T) -> usize {
    text.knots()
}

fn str_length(text: &'static str) -> usize {
    text.knots()
}

fn main() {
    println!("{:?}", str_length("asdfas"));   // works
    println!("{:?}", train_length("asdfas")); // compile error
}

Activity

kevinmehall

kevinmehall commented on Jan 9, 2017

@kevinmehall
Contributor

Use fn train_length<T:Train + ?Sized>(text: &'static T) -> usize.

Bare str is an unsized type and generics assume that types are sized by default. Here's another post explaining unsized types.

J-F-Liu

J-F-Liu commented on Jan 9, 2017

@J-F-Liu
Author

Yes, add +?Sized can solve the problem, the compile message could be more helpful.

changed the title [-]irrational compile error[/-] [+]Suggest ?Sized on generics where applicable[/+] on May 19, 2017
estebank

estebank commented on Oct 11, 2019

@estebank
Contributor

Current output:

error[E0277]: the size for values of type `str` cannot be known at compilation time
  --> src/main.rs:23:35
   |
13 | fn train_length<T:Train>(text: &'static T) -> usize {
   |    ------------ - required by this bound in `train_length`
...
23 |     println!("{:?}", train_length("asdfas")); // compile error
   |                                   ^^^^^^^^ doesn't have a size known at compile-time
   |
   = help: the trait `std::marker::Sized` is not implemented for `str`
   = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>

It should be

error[E0277]: the size for values of type `str` cannot be known at compilation time
  --> src/main.rs:23:35
   |
13 | fn train_length<T:Train>(text: &'static T) -> usize {
   |    ------------ -      - help: relax the implicit restriction:  `+ ?Sized`
   |                 |
   |                 `Sized` implicitly required in this bound in `train_length`
...
23 |     println!("{:?}", train_length("asdfas")); // compile error
   |                                   ^^^^^^^^ doesn't have a size known at compile-time
   |
   = help: the trait `std::marker::Sized` is not implemented for `str`
   = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
added
D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.
D-papercutDiagnostics: An error or lint that needs small tweaks.
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Oct 11, 2019
estebank

estebank commented on Feb 5, 2020

@estebank
Contributor

Current output:

error[E0277]: the size for values of type `str` cannot be known at compilation time
  --> file4.rs:21:35
   |
11 | fn train_length<T:Train>(text: &'static T) -> usize {
   |    ------------ -      - help: consider relaxing the implicit `Sized` restriction: `+  ?Sized`
   |                 |
   |                 required by this bound in `train_length`
...
21 |     println!("{:?}", train_length("asdfas")); // compile error
   |                                   ^^^^^^^^ doesn't have a size known at compile-time
   |
   = help: the trait `std::marker::Sized` is not implemented for `str`
   = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>

Fixed in #68377.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-trait-systemArea: Trait systemC-enhancementCategory: An issue proposing an enhancement or a PR with one.D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.D-papercutDiagnostics: An error or lint that needs small tweaks.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @kevinmehall@J-F-Liu@estebank@Mark-Simulacrum@fmease

      Issue actions

        Suggest ?Sized on generics where applicable · Issue #38936 · rust-lang/rust