Skip to content

Commit 7efad77

Browse files
committed
Rust: Add type inference test
1 parent 55eb9fb commit 7efad77

File tree

2 files changed

+1324
-1224
lines changed

2 files changed

+1324
-1224
lines changed

rust/ql/test/library-tests/type-inference/main.rs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,7 @@ mod method_call_type_conversion {
10991099
println!("{:?}", x5.0); // $ fieldof=S
11001100

11011101
let x6 = &S(S2); // $ SPURIOUS: type=x6:&T.&T.S
1102+
11021103
// explicit dereference
11031104
println!("{:?}", (*x6).m1()); // $ method=m1 method=deref
11041105

@@ -1663,17 +1664,18 @@ mod async_ {
16631664
}
16641665

16651666
fn f2() -> impl Future<Output = S1> {
1666-
async {
1667-
S1
1668-
}
1667+
async { S1 }
16691668
}
16701669

16711670
struct S2;
16721671

16731672
impl Future for S2 {
16741673
type Output = S1;
16751674

1676-
fn poll(self: std::pin::Pin<&mut Self>, _cx: &mut std::task::Context<'_>) -> std::task::Poll<Self::Output> {
1675+
fn poll(
1676+
self: std::pin::Pin<&mut Self>,
1677+
_cx: &mut std::task::Context<'_>,
1678+
) -> std::task::Poll<Self::Output> {
16771679
std::task::Poll::Ready(S1)
16781680
}
16791681
}
@@ -1687,14 +1689,11 @@ mod async_ {
16871689
f2().await.f(); // $ method=S1f
16881690
f3().await.f(); // $ method=S1f
16891691
S2.await.f(); // $ method=S1f
1690-
let b = async {
1691-
S1
1692-
};
1692+
let b = async { S1 };
16931693
b.await.f(); // $ method=S1f
16941694
}
16951695
}
16961696

1697-
16981697
mod impl_trait {
16991698
struct S1;
17001699
struct S2;
@@ -1805,6 +1804,44 @@ mod indexers {
18051804
}
18061805
}
18071806

1807+
mod method_determined_by_argument_type {
1808+
trait MyAdd<T> {
1809+
fn my_add(&self, value: T) -> Self;
1810+
}
1811+
1812+
impl MyAdd<i64> for i64 {
1813+
// MyAdd<i64>::my_add
1814+
fn my_add(&self, value: i64) -> Self {
1815+
value
1816+
}
1817+
}
1818+
1819+
impl MyAdd<&i64> for i64 {
1820+
// MyAdd<&i64>::my_add
1821+
fn my_add(&self, value: &i64) -> Self {
1822+
*value // $ method=deref
1823+
}
1824+
}
1825+
1826+
impl MyAdd<bool> for i64 {
1827+
// MyAdd<bool>::my_add
1828+
fn my_add(&self, value: bool) -> Self {
1829+
if value {
1830+
1
1831+
} else {
1832+
0
1833+
}
1834+
}
1835+
}
1836+
1837+
pub fn f() {
1838+
let x: i64 = 73;
1839+
x.my_add(5i64); // $ method=MyAdd<i64>::my_add SPURIOUS: method=MyAdd<bool>::my_add SPURIOUS: method=MyAdd<&i64>::my_add
1840+
x.my_add(&5i64); // $ method=MyAdd<&i64>::my_add SPURIOUS: method=MyAdd<i64>::my_add SPURIOUS: method=MyAdd<bool>::my_add
1841+
x.my_add(true); // $ method=MyAdd<bool>::my_add SPURIOUS: method=MyAdd<i64>::my_add SPURIOUS: method=MyAdd<&i64>::my_add
1842+
}
1843+
}
1844+
18081845
fn main() {
18091846
field_access::f();
18101847
method_impl::f();
@@ -1827,4 +1864,5 @@ fn main() {
18271864
async_::f();
18281865
impl_trait::f();
18291866
indexers::f();
1867+
method_determined_by_argument_type::f();
18301868
}

0 commit comments

Comments
 (0)