Skip to content

Commit 961e620

Browse files
committed
Rust: Add more type inference tests
1 parent b813010 commit 961e620

File tree

2 files changed

+45068
-2001
lines changed

2 files changed

+45068
-2001
lines changed

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

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,6 @@ mod method_supertraits {
937937
}
938938

939939
mod function_trait_bounds_2 {
940-
use std::convert::From;
941940
use std::fmt::Debug;
942941

943942
#[derive(Debug)]
@@ -1957,36 +1956,81 @@ mod macros {
19571956
}
19581957

19591958
mod method_determined_by_argument_type {
1960-
trait MyAdd<T> {
1961-
fn my_add(&self, value: T) -> Self;
1959+
trait MyAdd<Rhs = Self> {
1960+
type Output;
1961+
1962+
// MyAdd::my_add
1963+
fn my_add(self, rhs: Rhs) -> Self::Output;
19621964
}
19631965

19641966
impl MyAdd<i64> for i64 {
1967+
type Output = i64;
1968+
19651969
// MyAdd<i64>::my_add
1966-
fn my_add(&self, value: i64) -> Self {
1970+
fn my_add(self, value: i64) -> Self {
19671971
value
19681972
}
19691973
}
19701974

19711975
impl MyAdd<&i64> for i64 {
1976+
type Output = i64;
1977+
19721978
// MyAdd<&i64>::my_add
1973-
fn my_add(&self, value: &i64) -> Self {
1979+
fn my_add(self, value: &i64) -> Self {
19741980
*value // $ method=deref
19751981
}
19761982
}
19771983

19781984
impl MyAdd<bool> for i64 {
1985+
type Output = i64;
1986+
19791987
// MyAdd<bool>::my_add
1980-
fn my_add(&self, value: bool) -> Self {
1988+
fn my_add(self, value: bool) -> Self {
19811989
if value { 1 } else { 0 }
19821990
}
19831991
}
19841992

1993+
struct S<T>(T);
1994+
1995+
impl<T: MyAdd> MyAdd for S<T> {
1996+
type Output = S<T::Output>;
1997+
1998+
// S::my_add1
1999+
fn my_add(self, other: Self) -> Self::Output {
2000+
S((self.0).my_add(other.0)) // $ method=MyAdd::my_add $ fieldof=S
2001+
}
2002+
}
2003+
2004+
impl<T: MyAdd> MyAdd<T> for S<T> {
2005+
type Output = S<T::Output>;
2006+
2007+
// S::my_add2
2008+
fn my_add(self, other: T) -> Self::Output {
2009+
S((self.0).my_add(other)) // $ method=MyAdd::my_add $ fieldof=S
2010+
}
2011+
}
2012+
2013+
impl<'a, T> MyAdd<&'a T> for S<T>
2014+
where
2015+
T: MyAdd<&'a T>,
2016+
{
2017+
type Output = S<<T as MyAdd<&'a T>>::Output>;
2018+
2019+
// S::my_add3
2020+
fn my_add(self, other: &'a T) -> Self::Output {
2021+
S((self.0).my_add(other)) // $ method=MyAdd::my_add $ fieldof=S
2022+
}
2023+
}
2024+
19852025
pub fn f() {
19862026
let x: i64 = 73;
19872027
x.my_add(5i64); // $ method=MyAdd<i64>::my_add
19882028
x.my_add(&5i64); // $ method=MyAdd<&i64>::my_add
19892029
x.my_add(true); // $ method=MyAdd<bool>::my_add
2030+
2031+
S(1i64).my_add(S(2i64)); // $ method=S::my_add1 $ SPURIOUS method=S::my_add2 $ SPURIOUS method=S::my_add3
2032+
S(1i64).my_add(3i64); // $ method=S::my_add2 $ SPURIOUS method=S::my_add1 $ SPURIOUS method=S::my_add3
2033+
S(1i64).my_add(&3i64); // $ method=S::my_add3 $ SPURIOUS method=S::my_add1 $ SPURIOUS method=S::my_add2
19902034
}
19912035
}
19922036

0 commit comments

Comments
 (0)