Skip to content

Commit 2c0ab51

Browse files
committed
Auto merge of #1430 - RalfJung:unsize, r=RalfJung
add interesting unsizing test @bors r+
2 parents 70d5caf + e6ced2f commit 2c0ab51

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

tests/run-pass/dyn-lcsit.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Taken from the rustc test suite; this triggers an interesting case in unsizing.
2+
3+
#![allow(non_upper_case_globals, incomplete_features)]
4+
#![feature(associated_type_bounds)]
5+
#![feature(impl_trait_in_bindings)]
6+
7+
use std::ops::Add;
8+
9+
trait Tr1 { type As1; fn mk(&self) -> Self::As1; }
10+
trait Tr2<'a> { fn tr2(self) -> &'a Self; }
11+
12+
fn assert_copy<T: Copy>(x: T) { let _x = x; let _x = x; }
13+
fn assert_static<T: 'static>(_: T) {}
14+
fn assert_forall_tr2<T: for<'a> Tr2<'a>>(_: T) {}
15+
16+
#[derive(Copy, Clone)]
17+
struct S1;
18+
#[derive(Copy, Clone)]
19+
struct S2;
20+
impl Tr1 for S1 { type As1 = S2; fn mk(&self) -> Self::As1 { S2 } }
21+
22+
const cdef_et1: &dyn Tr1<As1: Copy> = &S1;
23+
const sdef_et1: &dyn Tr1<As1: Copy> = &S1;
24+
pub fn use_et1() { assert_copy(cdef_et1.mk()); assert_copy(sdef_et1.mk()); }
25+
26+
const cdef_et2: &(dyn Tr1<As1: 'static> + Sync) = &S1;
27+
static sdef_et2: &(dyn Tr1<As1: 'static> + Sync) = &S1;
28+
pub fn use_et2() { assert_static(cdef_et2.mk()); assert_static(sdef_et2.mk()); }
29+
30+
const cdef_et3: &dyn Tr1<As1: Clone + Iterator<Item: Add<u8, Output: Into<u8>>>> = {
31+
struct A;
32+
impl Tr1 for A {
33+
type As1 = core::ops::Range<u8>;
34+
fn mk(&self) -> Self::As1 { 0..10 }
35+
};
36+
&A
37+
};
38+
pub fn use_et3() {
39+
let _0 = cdef_et3.mk().clone();
40+
let mut s = 0u8;
41+
for _1 in _0 {
42+
let _2 = _1 + 1u8;
43+
s += _2.into();
44+
}
45+
assert_eq!(s, (0..10).map(|x| x + 1).sum());
46+
}
47+
48+
const cdef_et4: &(dyn Tr1<As1: for<'a> Tr2<'a>> + Sync) = {
49+
#[derive(Copy, Clone)]
50+
struct A;
51+
impl Tr1 for A {
52+
type As1 = A;
53+
fn mk(&self) -> A { A }
54+
}
55+
impl<'a> Tr2<'a> for A {
56+
fn tr2(self) -> &'a Self { &A }
57+
}
58+
&A
59+
};
60+
static sdef_et4: &(dyn Tr1<As1: for<'a> Tr2<'a>> + Sync) = cdef_et4;
61+
pub fn use_et4() { assert_forall_tr2(cdef_et4.mk()); assert_forall_tr2(sdef_et4.mk()); }
62+
63+
fn main() {
64+
let _ = use_et1();
65+
let _ = use_et2();
66+
let _ = use_et3();
67+
let _ = use_et4();
68+
}

0 commit comments

Comments
 (0)