mirror of https://github.com/rust-lang/rust
102 lines
1.9 KiB
Rust
102 lines
1.9 KiB
Rust
#![feature(type_alias_impl_trait)]
|
|
//@ check-pass
|
|
//@ revisions: default edition2021
|
|
//@[edition2021] compile-flags: --edition 2021
|
|
|
|
fn main() {
|
|
type T = impl Copy;
|
|
let foo: T = Some((1u32, 2u32));
|
|
match foo {
|
|
None => (),
|
|
Some((a, b)) => (),
|
|
}
|
|
}
|
|
|
|
fn upvar() {
|
|
#[derive(Copy, Clone)]
|
|
struct Foo((u32, u32));
|
|
|
|
type T = impl Copy;
|
|
let foo: T = Foo((1u32, 2u32));
|
|
let x = move || {
|
|
let Foo((a, b)) = foo;
|
|
};
|
|
}
|
|
|
|
fn enum_upvar() {
|
|
type T = impl Copy;
|
|
let foo: T = Some((1u32, 2u32));
|
|
let x = move || match foo {
|
|
None => (),
|
|
Some((a, b)) => (),
|
|
};
|
|
}
|
|
|
|
fn r#struct() {
|
|
#[derive(Copy, Clone)]
|
|
struct Foo((u32, u32));
|
|
|
|
type U = impl Copy;
|
|
let foo: U = Foo((1u32, 2u32));
|
|
let Foo((a, b)) = foo;
|
|
}
|
|
|
|
mod only_pattern {
|
|
type T = impl Copy;
|
|
|
|
fn foo(foo: T) {
|
|
let (mut x, mut y) = foo;
|
|
x = 42;
|
|
y = "foo";
|
|
}
|
|
|
|
type U = impl Copy;
|
|
|
|
fn bar(bar: Option<U>) {
|
|
match bar {
|
|
Some((mut x, mut y)) => {
|
|
x = 42;
|
|
y = "foo";
|
|
}
|
|
None => {}
|
|
}
|
|
}
|
|
|
|
type V = impl Copy;
|
|
|
|
fn baz(baz: Option<V>) {
|
|
match baz {
|
|
_ => {}
|
|
Some((mut x, mut y)) => {
|
|
x = 42;
|
|
y = "foo";
|
|
}
|
|
None => {}
|
|
}
|
|
}
|
|
}
|
|
|
|
mod only_pattern_rpit {
|
|
#[allow(unconditional_recursion)]
|
|
fn foo(b: bool) -> impl Copy {
|
|
let (mut x, mut y) = foo(false);
|
|
x = 42;
|
|
y = "foo";
|
|
if b { panic!() } else { foo(true) }
|
|
}
|
|
|
|
fn bar(b: bool) -> Option<impl Copy> {
|
|
if b {
|
|
return None;
|
|
}
|
|
match bar(!b) {
|
|
Some((mut x, mut y)) => {
|
|
x = 42;
|
|
y = "foo";
|
|
}
|
|
None => {}
|
|
}
|
|
None
|
|
}
|
|
}
|