Skip to content

Commit 9a102ef

Browse files
committed
Rust: More type inference tests
1 parent bfa3562 commit 9a102ef

File tree

3 files changed

+2630
-2352
lines changed

3 files changed

+2630
-2352
lines changed

rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ multipleCallTargets
99
| main.rs:590:9:590:18 | ...::m(...) |
1010
| main.rs:591:9:591:20 | ... .m() |
1111
| main.rs:592:9:592:24 | ...::m(...) |
12-
| main.rs:2524:13:2524:31 | ...::from(...) |
13-
| main.rs:2525:13:2525:31 | ...::from(...) |
14-
| main.rs:2526:13:2526:31 | ...::from(...) |
15-
| main.rs:2532:13:2532:31 | ...::from(...) |
16-
| main.rs:2533:13:2533:31 | ...::from(...) |
17-
| main.rs:2534:13:2534:31 | ...::from(...) |
12+
| main.rs:2605:13:2605:31 | ...::from(...) |
13+
| main.rs:2606:13:2606:31 | ...::from(...) |
14+
| main.rs:2607:13:2607:31 | ...::from(...) |
15+
| main.rs:2613:13:2613:31 | ...::from(...) |
16+
| main.rs:2614:13:2614:31 | ...::from(...) |
17+
| main.rs:2615:13:2615:31 | ...::from(...) |

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

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,6 +1707,87 @@ mod builtins {
17071707
let f = 123.0f64; // $ certainType=f:f64
17081708
let t = true; // $ certainType=t:bool
17091709
let f = false; // $ certainType=f:bool
1710+
1711+
trait MyTrait<T> {
1712+
fn my_method(&self) -> &T;
1713+
1714+
fn my_func() -> T;
1715+
}
1716+
1717+
impl<T: Default, const N: usize> MyTrait<T> for [T; N] {
1718+
fn my_method(&self) -> &T {
1719+
self.get(0).unwrap() // $ MISSING: target=get target=unwrap
1720+
}
1721+
1722+
fn my_func() -> T {
1723+
T::default() // $ target=default
1724+
}
1725+
}
1726+
1727+
let x = [1, 2, 3].my_method(); // $ target=my_method type=x:&T.i32
1728+
let x = <[_; 3]>::my_method(&[1, 2, 3]); // $ target=my_method type=x:&T.i32
1729+
let x = <[i32; 3]>::my_func(); // $ MISSING: target=my_func type=x:i32
1730+
1731+
impl<T: Default> MyTrait<T> for [T] {
1732+
fn my_method(&self) -> &T {
1733+
self.get(0).unwrap() // $ target=get target=unwrap
1734+
}
1735+
1736+
fn my_func() -> T {
1737+
T::default() // $ target=default
1738+
}
1739+
}
1740+
1741+
let s: &[i32] = &[1, 2, 3];
1742+
let x = s.my_method(); // $ target=my_method type=x:&T.i32
1743+
let x = <[_]>::my_method(s); // $ target=my_method type=x:&T.i32
1744+
let x = <[i32]>::my_func(); // $ MISSING: target=my_func type=x:i32
1745+
1746+
impl<T: Default> MyTrait<T> for (T, i32) {
1747+
fn my_method(&self) -> &T {
1748+
&self.0
1749+
}
1750+
1751+
fn my_func() -> T {
1752+
T::default() // $ target=default
1753+
}
1754+
}
1755+
1756+
let p = (42, 7);
1757+
let x = p.my_method(); // $ target=my_method type=x:&T.i32
1758+
let x = <(_, _)>::my_method(&p); // $ target=my_method type=x:&T.i32
1759+
let x = <(i32, i32)>::my_func(); // $ MISSING: target=my_func type=x:i32
1760+
1761+
impl<T: Default> MyTrait<T> for &T {
1762+
fn my_method(&self) -> &T {
1763+
*self // $ target=deref
1764+
}
1765+
1766+
fn my_func() -> T {
1767+
T::default() // $ target=default
1768+
}
1769+
}
1770+
1771+
let r = &42;
1772+
let x = r.my_method(); // $ target=my_method type=x:&T.i32
1773+
let x = <&_>::my_method(&r); // $ target=my_method type=x:&T.i32
1774+
let x = <&i32>::my_func(); // $ MISSING: target=my_func type=x:i32
1775+
1776+
impl<T: Default> MyTrait<T> for *mut T {
1777+
fn my_method(&self) -> &T {
1778+
unsafe { &**self } // $ target=deref target=deref
1779+
}
1780+
1781+
fn my_func() -> T {
1782+
T::default() // $ target=default
1783+
}
1784+
}
1785+
1786+
let mut v = 42;
1787+
let p: *mut i32 = &mut v;
1788+
let x = unsafe { p.my_method() }; // $ target=my_method type=x:&T.i32
1789+
let x = unsafe { <*mut _>::my_method(&p) }; // $ target=my_method type=x:&T.i32
1790+
let x = <*mut i32>::my_func(); // $ MISSING: target=my_func type=x:i32
17101791
}
17111792
}
17121793

0 commit comments

Comments
 (0)