Rust: рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдУрдВ рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЕрдЧре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдореВрд▓ рдЪрд░реНрдЪрд╛: https://users.rust-lang.org/t/unexpected-behaviors-of-trait-bounds/12286/10

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ: https://github.com/rust-lang/rust/issues/29859

рдореВрд▓ рд░реВрдк рд╕реЗ, trait Complete рд▓рд┐рдП trait Partial trait Complete рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ trait Partial рдХреЛ trait PartialEq (рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ ( struct TypeB ) рдЬрд┐рд╕рдореЗрдВ impl Complete рдХреЛ impl PartialEq рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЬрдм рднреА <TypeB as Partial> рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреБрдХреНрдд рддреНрд░реБрдЯрд┐ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд░реЗрдкреНрд░реЛ рд╣реИ:

pub trait Partial: PartialEq {
    fn foo() -> Option<bool>;
}

pub trait Complete: Partial {
    fn foo() -> bool;
}

impl<T> Partial for T
where
    T: Complete,
{
    fn foo() -> Option<bool> {
        Some(<Self as Complete>::foo())
    }
}


// ----

#[derive(PartialEq)]
pub struct TypeA {}

impl Partial for TypeA {
    fn foo() -> Option<bool> {
        None
    }
}


// ----

// BUG: No compile warning about `PartialEq` not being implemented
// #[derive(PartialEq)]
pub struct TypeB {}

impl Complete for TypeB {
    fn foo() -> bool {
        true
    }
}


// ----

pub fn main() {
    println!("{:?}", TypeA::foo());

    // This works, but shouldn't!
    println!("{:?}", <TypeB as Complete>::foo());

    // This would trigger the issue, though.
    //println!("{:?}", <TypeB as Partial>::foo());
    /* Result in:
    error[E0277]: the trait bound `TypeB: std::cmp::PartialEq` is not satisfied
      --> src/bin/cyclic_traits.rs:48:22
       |
    48 |     println!("{:?}", <TypeB as Partial>::foo());
       |                      ^^^^^^^^^^^^^^^^^^^^^^^ can't compare `TypeB` with `TypeB`
       |
       = help: the trait `std::cmp::PartialEq` is not implemented for `TypeB`
       = note: required by `Partial::foo`
    */
}
A-typesystem C-bug T-compiler

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдБ ICE рдлреЙрд░реНрдо рдореЗрдВ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рд╣реИ:

trait Base {
    fn base() {}
}

trait Partial: Base {}
trait Complete: Partial {}

impl<T: Complete> Partial for T {}

struct TypeB;
impl Complete for TypeB {}

fn main() {
    ice::<TypeB>();
}

fn ice<P: Partial>() {
    P::base();
}
error: internal compiler error: /checkout/src/librustc/traits/trans/mod.rs:75: Encountered error `Unimplemented` selecting `Binder(<TypeB as Base>)` during trans

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.21.0-nightly (cbbe17aa7 2017-08-07) running on x86_64-unknown-linux-gnu

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣рд╛рдБ ICE рдлреЙрд░реНрдо рдореЗрдВ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рд╣реИ:

trait Base {
    fn base() {}
}

trait Partial: Base {}
trait Complete: Partial {}

impl<T: Complete> Partial for T {}

struct TypeB;
impl Complete for TypeB {}

fn main() {
    ice::<TypeB>();
}

fn ice<P: Partial>() {
    P::base();
}
error: internal compiler error: /checkout/src/librustc/traits/trans/mod.rs:75: Encountered error `Unimplemented` selecting `Binder(<TypeB as Base>)` during trans

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.21.0-nightly (cbbe17aa7 2017-08-07) running on x86_64-unknown-linux-gnu

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ arielb1 рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдореБрджреНрджрд╛ (#43784) рднреА рдЦреЛрд▓рд╛ рд╣реИред рд╡реИрд╕реЗ рднреА, рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) # 43786 рджреНрд╡рд╛рд░рд╛ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ # 43784 рдХреА рд╕рдорд╛рдкреНрддрд┐ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dwrensha picture dwrensha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

modsec picture modsec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lambda-fairy picture lambda-fairy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

defuz picture defuz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ