Skip to content

Kind bounds specified as supertraits don't propagate through trait objects. #17604

Closed
@sfackler

Description

@sfackler
trait Foo: Send {}

impl Foo for Box<Foo> {}

fn main() {}
test.rs:3:1: 3:25 error: the trait `core::kinds::Send` is not implemented for the type `Box<Foo+'static>`
test.rs:3 impl Foo for Box<Foo> {}
          ^~~~~~~~~~~~~~~~~~~~~~~~
test.rs:3:1: 3:25 note: the trait `core::kinds::Send` must be implemented because it is required by `Foo`
test.rs:3 impl Foo for Box<Foo> {}
          ^~~~~~~~~~~~~~~~~~~~~~~~

or similarly

trait Foo: Send {}

struct Bar(Box<Foo>);

fn test() {
    fn is_send<U: Send>() {}
    is_send::<Bar>()
}

fn main() {}
test.rs:7:5: 7:19 error: the trait `core::kinds::Send` is not implemented for the type `Bar`
test.rs:7     is_send::<Bar>()
              ^~~~~~~~~~~~~~
test.rs:7:5: 7:19 note: the trait `core::kinds::Send` must be implemented because it is required by `test::is_send`
test.rs:7     is_send::<Bar>()
              ^~~~~~~~~~~~~~
error: aborting due to previous error

The compiler correctly tracks the Send kind in other contexts. This properly compiles, for example:

trait Foo: Send {}

fn test<T: Foo>() {
    fn is_send<U: Send>() {}
    is_send::<T>()
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions