//! returns: 0
//! A supertrait declared later must contribute methods to its child trait.

trait Child: Parent {
    fn (*Child) child() -> i32;
}

trait Parent {
    fn (*Parent) parent() -> i32;
}

record Value {
    n: i32,
}

instance Parent for Value {
    fn (self: *Value) parent() -> i32 {
        return self.n;
    }
}

instance Child for Value {
    fn (self: *Value) child() -> i32 {
        return self.n + 1;
    }
}

@default fn main() -> i32 {
    let value = Value { n: 41 };
    let object: *opaque Child = &value;
    assert object.parent() == 41;
    assert object.child() == 42;
    return 0;
}
