mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 04:19:13 +00:00
271 lines
5.5 KiB
Rust
271 lines
5.5 KiB
Rust
use crate::size_and_align_expr;
|
|
|
|
#[test]
|
|
fn zero_capture_simple() {
|
|
size_and_align_expr! {
|
|
|x: i32| x + 2
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn move_simple() {
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: []
|
|
let y: i32 = 5;
|
|
move |x: i32| {
|
|
x + y
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn ref_simple() {
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
let y: i32 = 5;
|
|
]
|
|
|x: i32| {
|
|
x + y
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
let mut y: i32 = 5;
|
|
]
|
|
|x: i32| {
|
|
y = y + x;
|
|
y
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy, deref_mut;
|
|
stmts: [
|
|
let y: &mut i32 = &mut 5;
|
|
]
|
|
|x: i32| {
|
|
*y += x;
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
struct X(i32, i64);
|
|
let x: X = X(2, 6);
|
|
]
|
|
|| {
|
|
x
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy, deref_mut;
|
|
stmts: [
|
|
struct X(i32, i64);
|
|
let x: &mut X = &mut X(2, 6);
|
|
]
|
|
|| {
|
|
(*x).0 as i64 + x.1
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn ref_then_mut_then_move() {
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
struct X(i32, i64);
|
|
let mut x: X = X(2, 6);
|
|
]
|
|
|| {
|
|
&x;
|
|
&mut x;
|
|
x;
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn nested_closures() {
|
|
size_and_align_expr! {
|
|
|| {
|
|
|| {
|
|
|| {
|
|
let x = 2;
|
|
move || {
|
|
move || {
|
|
x
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn capture_specific_fields2() {
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
let x = &mut 2;
|
|
]
|
|
|| {
|
|
*x = 5;
|
|
&x;
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn capture_specific_fields() {
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
y.0 + x + (y.2 .0 as i64)
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
let _ = &y;
|
|
y.0 + x + (y.2 .0 as i64)
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
]
|
|
let y = &y;
|
|
move |x: i64| {
|
|
y.0 + x + (y.2 .0 as i64)
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
let X(a, _, (b, _)) = y;
|
|
a + x + (b as i64)
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y = &&X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
let X(a, _, (b, _)) = y;
|
|
*a + x + (*b as i64)
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
match y {
|
|
X(a, _, (b, _)) => a + x + (b as i64),
|
|
}
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
let X(a @ 2, _, (b, _)) = y else { return 5 };
|
|
a + x + (b as i64)
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn match_pattern() {
|
|
size_and_align_expr! {
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
move |x: i64| {
|
|
match y {
|
|
_ => x,
|
|
}
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
]
|
|
|x: i64| {
|
|
match y {
|
|
X(_a, _, _c) => x,
|
|
}
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
]
|
|
|x: i64| {
|
|
match y {
|
|
_y => x,
|
|
}
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
minicore: copy;
|
|
stmts: [
|
|
struct X(i64, i32, (u8, i128));
|
|
let y: X = X(2, 5, (7, 3));
|
|
]
|
|
|x: i64| {
|
|
match y {
|
|
ref _y => x,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn ellipsis_pattern() {
|
|
size_and_align_expr! {
|
|
struct X(i8, u16, i32, u64, i128, u8);
|
|
let y: X = X(1, 2, 3, 4, 5, 6);
|
|
move |_: i64| {
|
|
let X(_a, .., _b, _c) = y;
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
struct X { a: i32, b: u8, c: i128}
|
|
let y: X = X { a: 1, b: 2, c: 3 };
|
|
move |_: i64| {
|
|
let X { a, b, .. } = y;
|
|
_ = (a, b);
|
|
}
|
|
}
|
|
size_and_align_expr! {
|
|
let y: (&&&(i8, u16, i32, u64, i128, u8), u16, i32, u64, i128, u8) = (&&&(1, 2, 3, 4, 5, 6), 2, 3, 4, 5, 6);
|
|
move |_: i64| {
|
|
let ((_a, .., _b, _c), .., _e, _f) = y;
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn regression_15623() {
|
|
size_and_align_expr! {
|
|
let a = 2;
|
|
let b = 3;
|
|
let c = 5;
|
|
move || {
|
|
let 0 = a else { return b; };
|
|
let y = c;
|
|
y
|
|
}
|
|
}
|
|
}
|