34 lines
620 B
Rust
34 lines
620 B
Rust
//@ check-pass
|
|
|
|
struct Ctxt {
|
|
v: usize,
|
|
}
|
|
|
|
trait GetCtxt {
|
|
// Here the `&` is bound in the method definition:
|
|
fn get_ctxt(&self) -> &Ctxt;
|
|
}
|
|
|
|
struct HasCtxt<'a> {
|
|
c: &'a Ctxt,
|
|
}
|
|
|
|
impl<'a> GetCtxt for HasCtxt<'a> {
|
|
// Ok: Have implied bound of WF(&'b HasCtxt<'a>)
|
|
// so know 'a: 'b
|
|
// so know &'a Ctxt <: &'b Ctxt
|
|
fn get_ctxt<'b>(&'b self) -> &'a Ctxt {
|
|
self.c
|
|
}
|
|
}
|
|
|
|
fn get_v(gc: Box<dyn GetCtxt + '_>) -> usize {
|
|
gc.get_ctxt().v
|
|
}
|
|
|
|
fn main() {
|
|
let ctxt = Ctxt { v: 22 };
|
|
let hc = HasCtxt { c: &ctxt };
|
|
assert_eq!(get_v(Box::new(hc) as Box<dyn GetCtxt>), 22);
|
|
}
|