blob: a916dde881ec519cab7b98235c123a5d1503ed44 [file] [edit]
//@ known-bug: unknown
#![feature(reborrow)]
#![allow(dead_code)]
use std::marker::{CoerceShared, Reborrow};
struct InnerMut<'a, T> {
value: &'a mut T,
}
impl<'a, T> Reborrow for InnerMut<'a, T> {}
struct InnerRef<'a, T> {
value: &'a T,
}
impl<'a, T> Clone for InnerRef<'a, T> {
fn clone(&self) -> Self {
*self
}
}
impl<'a, T> Copy for InnerRef<'a, T> {}
impl<'a, T> CoerceShared<InnerRef<'a, T>> for InnerMut<'a, T> {}
struct OuterMut<'a, T> {
inner: InnerMut<'a, T>,
tag: usize,
}
impl<'a, T> Reborrow for OuterMut<'a, T> {}
struct OuterRef<'a, T> {
inner: InnerRef<'a, T>,
tag: usize,
}
impl<'a, T> Clone for OuterRef<'a, T> {
fn clone(&self) -> Self {
*self
}
}
impl<'a, T> Copy for OuterRef<'a, T> {}
impl<'a, T> CoerceShared<OuterRef<'a, T>> for OuterMut<'a, T> {}
fn get<'a>(outer: OuterRef<'a, i32>) -> (&'a i32, usize) {
(outer.inner.value, outer.tag)
}
fn main() {
let mut value = 22;
let outer = OuterMut { inner: InnerMut { value: &mut value }, tag: 7 };
let (first, tag) = get(outer);
assert_eq!((*first, tag), (22, 7));
let (second, tag) = get(outer);
assert_eq!((*second, tag), (22, 7));
}