Skip to content
This repository has been archived by the owner on May 23, 2024. It is now read-only.

ices/76535.rs: fixed with errors #641

Merged
merged 1 commit into from
Feb 6, 2021
Merged

Conversation

github-actions[bot]
Copy link
Contributor

@github-actions github-actions bot commented Feb 6, 2021

Issue: rust-lang/rust#76535

#![feature(generic_associated_types)]

pub trait SubTrait {}

pub trait SuperTrait {
    type SubType<'a>: SubTrait;

    fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>;
}

pub struct SubStruct<'a> {
    sup: &'a mut SuperStruct,
}

impl<'a> SubTrait for SubStruct<'a> {}

pub struct SuperStruct {
    value: u8,
}

impl SuperStruct {
    pub fn new(value: u8) -> SuperStruct {
        SuperStruct { value }
    }
}

impl SuperTrait for SuperStruct {
    type SubType<'a> = SubStruct<'a>;

    fn get_sub<'a>(&'a mut self) -> Self::SubType<'a> {
        SubStruct { sup: self }
    }
}

fn main() {
    let sub: Box<dyn SuperTrait<SubType = SubStruct>> = Box::new(SuperStruct::new(0));
}
=== stdout ===
=== stderr ===
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
 --> /home/runner/work/glacier/glacier/ices/76535.rs:1:12
  |
1 | #![feature(generic_associated_types)]
  |            ^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(incomplete_features)]` on by default
  = note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information

error[E0107]: missing generics for associated type `SuperTrait::SubType`
 --> /home/runner/work/glacier/glacier/ices/76535.rs:6:10
  |
6 |     type SubType<'a>: SubTrait;
  |          ^^^^^^^ expected 1 lifetime argument
  |
note: associated type defined here, with 1 lifetime parameter: `'a`
 --> /home/runner/work/glacier/glacier/ices/76535.rs:6:10
  |
6 |     type SubType<'a>: SubTrait;
  |          ^^^^^^^ --
help: use angle brackets to add missing lifetime argument
  |
6 |     type SubType<'a><'a>: SubTrait;
  |                 ^^^^

error[E0038]: the trait `SuperTrait` cannot be made into an object
  --> /home/runner/work/glacier/glacier/ices/76535.rs:36:14
   |
36 |     let sub: Box<dyn SuperTrait<SubType = SubStruct>> = Box::new(SuperStruct::new(0));
   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SuperTrait` cannot be made into an object
   |
   = help: consider moving `get_sub` to another trait
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
  --> /home/runner/work/glacier/glacier/ices/76535.rs:8:37
   |
5  | pub trait SuperTrait {
   |           ---------- this trait cannot be made into an object...
...
8  |     fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>;
   |                                     ^^^^^^^^^^^^^^^^^ ...because method `get_sub` references the `Self` type in its return type

error[E0038]: the trait `SuperTrait` cannot be made into an object
  --> /home/runner/work/glacier/glacier/ices/76535.rs:36:57
   |
36 |     let sub: Box<dyn SuperTrait<SubType = SubStruct>> = Box::new(SuperStruct::new(0));
   |                                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SuperTrait` cannot be made into an object
   |
   = help: consider moving `get_sub` to another trait
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
  --> /home/runner/work/glacier/glacier/ices/76535.rs:8:37
   |
5  | pub trait SuperTrait {
   |           ---------- this trait cannot be made into an object...
...
8  |     fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>;
   |                                     ^^^^^^^^^^^^^^^^^ ...because method `get_sub` references the `Self` type in its return type
   = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn SuperTrait<SubType = SubStruct<'_>>>>` for `Box<SuperStruct>`
   = note: required by cast to type `Box<dyn SuperTrait<SubType = SubStruct<'_>>>`

error: aborting due to 3 previous errors; 1 warning emitted

Some errors have detailed explanations: E0038, E0107.
For more information about an error, try `rustc --explain E0038`.
==============

=== stdout ===
=== stderr ===
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
 --> /home/runner/work/glacier/glacier/ices/76535.rs:1:12
  |
1 | #![feature(generic_associated_types)]
  |            ^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(incomplete_features)]` on by default
  = note: see issue #44265 <rust-lang/rust#44265> for more information

error[E0107]: missing generics for associated type `SuperTrait::SubType`
 --> /home/runner/work/glacier/glacier/ices/76535.rs:6:10
  |
6 |     type SubType<'a>: SubTrait;
  |          ^^^^^^^ expected 1 lifetime argument
  |
note: associated type defined here, with 1 lifetime parameter: `'a`
 --> /home/runner/work/glacier/glacier/ices/76535.rs:6:10
  |
6 |     type SubType<'a>: SubTrait;
  |          ^^^^^^^ --
help: use angle brackets to add missing lifetime argument
  |
6 |     type SubType<'a><'a>: SubTrait;
  |                 ^^^^

error[E0038]: the trait `SuperTrait` cannot be made into an object
  --> /home/runner/work/glacier/glacier/ices/76535.rs:36:14
   |
36 |     let sub: Box<dyn SuperTrait<SubType = SubStruct>> = Box::new(SuperStruct::new(0));
   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SuperTrait` cannot be made into an object
   |
   = help: consider moving `get_sub` to another trait
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
  --> /home/runner/work/glacier/glacier/ices/76535.rs:8:37
   |
5  | pub trait SuperTrait {
   |           ---------- this trait cannot be made into an object...
...
8  |     fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>;
   |                                     ^^^^^^^^^^^^^^^^^ ...because method `get_sub` references the `Self` type in its return type

error[E0038]: the trait `SuperTrait` cannot be made into an object
  --> /home/runner/work/glacier/glacier/ices/76535.rs:36:57
   |
36 |     let sub: Box<dyn SuperTrait<SubType = SubStruct>> = Box::new(SuperStruct::new(0));
   |                                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SuperTrait` cannot be made into an object
   |
   = help: consider moving `get_sub` to another trait
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
  --> /home/runner/work/glacier/glacier/ices/76535.rs:8:37
   |
5  | pub trait SuperTrait {
   |           ---------- this trait cannot be made into an object...
...
8  |     fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>;
   |                                     ^^^^^^^^^^^^^^^^^ ...because method `get_sub` references the `Self` type in its return type
   = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn SuperTrait<SubType = SubStruct<'_>>>>` for `Box<SuperStruct>`
   = note: required by cast to type `Box<dyn SuperTrait<SubType = SubStruct<'_>>>`

error: aborting due to 3 previous errors; 1 warning emitted

Some errors have detailed explanations: E0038, E0107.
For more information about an error, try `rustc --explain E0038`.
==============
@Alexendoo Alexendoo merged commit 96e8a30 into master Feb 6, 2021
@Alexendoo Alexendoo deleted the autofix/ices/76535.rs branch February 6, 2021 13:41
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants