mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 14:21:44 +00:00
Support more intrinsics in mir interpreter
This commit is contained in:
parent
403433a355
commit
5eb4796d3d
6 changed files with 493 additions and 60 deletions
|
@ -14,6 +14,66 @@ fn size_of() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn size_of_val() {
|
||||
check_number(
|
||||
r#"
|
||||
//- minicore: coerce_unsized
|
||||
extern "rust-intrinsic" {
|
||||
pub fn size_of_val<T: ?Sized>(_: *const T) -> usize;
|
||||
}
|
||||
|
||||
struct X(i32, u8);
|
||||
|
||||
const GOAL: usize = size_of_val(&X(1, 2));
|
||||
"#,
|
||||
8,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
//- minicore: coerce_unsized
|
||||
extern "rust-intrinsic" {
|
||||
pub fn size_of_val<T: ?Sized>(_: *const T) -> usize;
|
||||
}
|
||||
|
||||
const GOAL: usize = {
|
||||
let x: &[i32] = &[1, 2, 3];
|
||||
size_of_val(x)
|
||||
};
|
||||
"#,
|
||||
12,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
//- minicore: coerce_unsized, fmt, builtin_impls
|
||||
extern "rust-intrinsic" {
|
||||
pub fn size_of_val<T: ?Sized>(_: *const T) -> usize;
|
||||
}
|
||||
|
||||
const GOAL: usize = {
|
||||
let x: &i16 = &5;
|
||||
let y: &dyn core::fmt::Debug = x;
|
||||
let z: &dyn core::fmt::Debug = &y;
|
||||
size_of_val(x) + size_of_val(y) * 10 + size_of_val(z) * 100
|
||||
};
|
||||
"#,
|
||||
1622,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
//- minicore: coerce_unsized
|
||||
extern "rust-intrinsic" {
|
||||
pub fn size_of_val<T: ?Sized>(_: *const T) -> usize;
|
||||
}
|
||||
|
||||
const GOAL: usize = {
|
||||
size_of_val("salam")
|
||||
};
|
||||
"#,
|
||||
5,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn transmute() {
|
||||
check_number(
|
||||
|
@ -69,7 +129,7 @@ fn wrapping_add() {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn saturating_add() {
|
||||
fn saturating() {
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
|
@ -80,6 +140,16 @@ fn saturating_add() {
|
|||
"#,
|
||||
255,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
pub fn saturating_sub<T>(a: T, b: T) -> T;
|
||||
}
|
||||
|
||||
const GOAL: bool = saturating_sub(5u8, 7) == 0 && saturating_sub(8u8, 4) == 4;
|
||||
"#,
|
||||
1,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
|
@ -160,6 +230,24 @@ fn needs_drop() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn discriminant_value() {
|
||||
check_number(
|
||||
r#"
|
||||
//- minicore: discriminant, option
|
||||
use core::marker::DiscriminantKind;
|
||||
extern "rust-intrinsic" {
|
||||
pub fn discriminant_value<T>(v: &T) -> <T as DiscriminantKind>::Discriminant;
|
||||
}
|
||||
const GOAL: bool = {
|
||||
discriminant_value(&Some(2i32)) == discriminant_value(&Some(5i32))
|
||||
&& discriminant_value(&Some(2i32)) != discriminant_value(&None::<i32>)
|
||||
};
|
||||
"#,
|
||||
1,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn likely() {
|
||||
check_number(
|
||||
|
@ -376,3 +464,47 @@ fn cttz() {
|
|||
3,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rotate() {
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
pub fn rotate_left<T: Copy>(x: T, y: T) -> T;
|
||||
}
|
||||
|
||||
const GOAL: i64 = rotate_left(0xaa00000000006e1i64, 12);
|
||||
"#,
|
||||
0x6e10aa,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
pub fn rotate_right<T: Copy>(x: T, y: T) -> T;
|
||||
}
|
||||
|
||||
const GOAL: i64 = rotate_right(0x6e10aa, 12);
|
||||
"#,
|
||||
0xaa00000000006e1,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
pub fn rotate_left<T: Copy>(x: T, y: T) -> T;
|
||||
}
|
||||
|
||||
const GOAL: i8 = rotate_left(129, 2);
|
||||
"#,
|
||||
6,
|
||||
);
|
||||
check_number(
|
||||
r#"
|
||||
extern "rust-intrinsic" {
|
||||
pub fn rotate_right<T: Copy>(x: T, y: T) -> T;
|
||||
}
|
||||
|
||||
const GOAL: i32 = rotate_right(10006016, 1020315);
|
||||
"#,
|
||||
320192512,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue