mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-26 13:01:27 +03:00
111 lines
2.8 KiB
Rust
111 lines
2.8 KiB
Rust
//@ run-pass
|
|
|
|
#![feature(fn_delegation)]
|
|
|
|
// Almost original ICE with recursive delegation.
|
|
mod test_1 {
|
|
pub fn check() {
|
|
fn foo<const N: usize, T, U>(f: impl FnOnce() -> usize) -> usize {
|
|
f()
|
|
}
|
|
|
|
reuse foo::<1, String, String> as bar;
|
|
|
|
reuse bar as bar2;
|
|
|
|
assert_eq!(bar(|| 123), 123);
|
|
assert_eq!(bar2(|| 123), 123);
|
|
}
|
|
}
|
|
|
|
// Test recursive delegations through trait.
|
|
mod test_2 {
|
|
fn foo<'a, const B: bool, T, U>(_x: impl Trait<'a, T, B>, f: impl FnOnce() -> usize) -> usize {
|
|
f()
|
|
}
|
|
|
|
trait Trait<'a, A, const B: bool> {
|
|
reuse foo;
|
|
reuse foo::<'a, false, (), ()> as bar;
|
|
}
|
|
|
|
struct X;
|
|
impl<'a, A, const B: bool> Trait<'a, A, B> for X {}
|
|
|
|
reuse <X as Trait>::foo as foo2;
|
|
reuse <X as Trait>::bar as bar2;
|
|
|
|
pub fn check() {
|
|
assert_eq!(foo2::<'static, 'static, (), true, false, (), ()>(X, || 123), 123);
|
|
assert_eq!(bar2::<'static, (), true>(X, || 123), 123);
|
|
}
|
|
}
|
|
|
|
// Testing impl Traits with SelfAndUserSpecified case.
|
|
mod test_3 {
|
|
trait Trait<'a, A, const B: bool> {
|
|
fn foo<'b, const B2: bool, T, U>(&self, f: impl FnOnce() -> usize) -> usize {
|
|
f()
|
|
}
|
|
}
|
|
|
|
struct X;
|
|
impl<'a, A, const B: bool> Trait<'a, A, B> for X {}
|
|
|
|
reuse Trait::foo;
|
|
reuse Trait::<'static, (), true>::foo::<true, (), ()> as bar;
|
|
|
|
pub fn check() {
|
|
assert_eq!(foo::<'static, X, (), true, false, (), ()>(&X, || 123), 123);
|
|
assert_eq!(bar::<X>(&X, || 123), 123);
|
|
assert_eq!(bar(&X, || 123), 123);
|
|
}
|
|
}
|
|
|
|
// Test recursive delegation through trait
|
|
mod test_4 {
|
|
trait Trait<'a, A, const B: bool> {
|
|
fn foo<'b, const B2: bool, T, U>(&self, f: impl FnOnce() -> usize) -> usize {
|
|
f()
|
|
}
|
|
}
|
|
|
|
struct X;
|
|
impl<'a, A, const B: bool> Trait<'a, A, B> for X {}
|
|
|
|
reuse Trait::foo;
|
|
reuse Trait::<'static, (), true>::foo::<true, (), ()> as bar;
|
|
|
|
trait Trait2 {
|
|
reuse foo;
|
|
reuse bar;
|
|
}
|
|
|
|
impl Trait2 for () {}
|
|
|
|
reuse <() as Trait2>::foo as foo2;
|
|
reuse <() as Trait2>::foo::<'static, X, (), true, false, (), ()> as foo3;
|
|
reuse <() as Trait2>::bar as bar2;
|
|
reuse <() as Trait2>::bar::<X> as bar3;
|
|
|
|
pub fn check() {
|
|
assert_eq!(foo::<'static, X, (), true, false, (), ()>(&X, || 123), 123);
|
|
assert_eq!(bar::<X>(&X, || 123), 123);
|
|
assert_eq!(bar(&X, || 123), 123);
|
|
|
|
assert_eq!(foo2::<'static, X, (), true, false, (), ()>(&X, || 123), 123);
|
|
assert_eq!(bar2::<X>(&X, || 123), 123);
|
|
assert_eq!(bar2(&X, || 123), 123);
|
|
|
|
assert_eq!(foo3(&X, || 123), 123);
|
|
assert_eq!(bar3(&X, || 123), 123);
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
test_1::check();
|
|
test_2::check();
|
|
test_3::check();
|
|
test_4::check();
|
|
}
|