Skip to content

Commit 7e60cfc

Browse files
committed
Rust: Add more type inference tests
1 parent 61bf20c commit 7e60cfc

File tree

2 files changed

+117
-32
lines changed

2 files changed

+117
-32
lines changed

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1667,12 +1667,18 @@ mod async_ {
16671667
f1().await.f(); // $ method=S1f
16681668
f2().await.f(); // $ method=S1f
16691669
f3().await.f(); // $ method=S1f
1670+
S2.await.f(); // $ MISSING: method=S1f
1671+
let b = async {
1672+
S1
1673+
};
1674+
b.await.f(); // $ MISSING: method=S1f
16701675
}
16711676
}
16721677

16731678

16741679
mod impl_trait {
16751680
struct S1;
1681+
struct S2;
16761682

16771683
trait Trait1 {
16781684
fn f1(&self) {} // Trait1f1
@@ -1694,10 +1700,37 @@ mod impl_trait {
16941700
S1
16951701
}
16961702

1703+
trait MyTrait<A> {
1704+
fn get_a(&self) -> A; // MyTrait::get_a
1705+
}
1706+
1707+
impl MyTrait<S2> for S1 {
1708+
fn get_a(&self) -> S2 {
1709+
S2
1710+
}
1711+
}
1712+
1713+
fn get_a_my_trait() -> impl MyTrait<S2> {
1714+
S1
1715+
}
1716+
1717+
fn uses_my_trait1<A, B: MyTrait<A>>(t: B) -> A {
1718+
t.get_a() // $ method=MyTrait::get_a
1719+
}
1720+
1721+
fn uses_my_trait2<A>(t: impl MyTrait<A>) -> A {
1722+
t.get_a() // $ method=MyTrait::get_a
1723+
}
1724+
16971725
pub fn f() {
16981726
let x = f1();
16991727
x.f1(); // $ method=Trait1f1
17001728
x.f2(); // $ method=Trait2f2
1729+
let a = get_a_my_trait();
1730+
let b = uses_my_trait1(a); // $ MISSING: type=b:S2
1731+
let a = get_a_my_trait();
1732+
let c = uses_my_trait2(a); // $ type=c:S2
1733+
let d = uses_my_trait2(S1); // $ MISSING: type=d:S2
17011734
}
17021735
}
17031736

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

Lines changed: 84 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2415,35 +2415,87 @@ inferType
24152415
| main.rs:1669:9:1669:12 | f3(...) | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
24162416
| main.rs:1669:9:1669:18 | await ... | | file://:0:0:0:0 | impl Trait ... |
24172417
| main.rs:1669:9:1669:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
2418-
| main.rs:1678:15:1678:19 | SelfParam | | file://:0:0:0:0 | & |
2419-
| main.rs:1678:15:1678:19 | SelfParam | &T | main.rs:1677:5:1679:5 | Self [trait Trait1] |
2420-
| main.rs:1682:15:1682:19 | SelfParam | | file://:0:0:0:0 | & |
2421-
| main.rs:1682:15:1682:19 | SelfParam | &T | main.rs:1681:5:1683:5 | Self [trait Trait2] |
2422-
| main.rs:1686:15:1686:19 | SelfParam | | file://:0:0:0:0 | & |
2423-
| main.rs:1686:15:1686:19 | SelfParam | &T | main.rs:1675:5:1675:14 | S1 |
2424-
| main.rs:1690:15:1690:19 | SelfParam | | file://:0:0:0:0 | & |
2425-
| main.rs:1690:15:1690:19 | SelfParam | &T | main.rs:1675:5:1675:14 | S1 |
2426-
| main.rs:1693:37:1695:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2427-
| main.rs:1693:37:1695:5 | { ... } | | main.rs:1675:5:1675:14 | S1 |
2428-
| main.rs:1693:37:1695:5 | { ... } | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2429-
| main.rs:1693:37:1695:5 | { ... } | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2430-
| main.rs:1694:9:1694:10 | S1 | | file://:0:0:0:0 | impl Trait ... |
2431-
| main.rs:1694:9:1694:10 | S1 | | main.rs:1675:5:1675:14 | S1 |
2432-
| main.rs:1694:9:1694:10 | S1 | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2433-
| main.rs:1694:9:1694:10 | S1 | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2434-
| main.rs:1698:13:1698:13 | x | | file://:0:0:0:0 | impl Trait ... |
2435-
| main.rs:1698:13:1698:13 | x | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2436-
| main.rs:1698:13:1698:13 | x | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2437-
| main.rs:1698:17:1698:20 | f1(...) | | file://:0:0:0:0 | impl Trait ... |
2438-
| main.rs:1698:17:1698:20 | f1(...) | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2439-
| main.rs:1698:17:1698:20 | f1(...) | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2440-
| main.rs:1699:9:1699:9 | x | | file://:0:0:0:0 | impl Trait ... |
2441-
| main.rs:1699:9:1699:9 | x | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2442-
| main.rs:1699:9:1699:9 | x | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2443-
| main.rs:1700:9:1700:9 | x | | file://:0:0:0:0 | impl Trait ... |
2444-
| main.rs:1700:9:1700:9 | x | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2445-
| main.rs:1700:9:1700:9 | x | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2446-
| main.rs:1706:5:1706:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
2447-
| main.rs:1707:5:1707:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
2448-
| main.rs:1707:20:1707:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2449-
| main.rs:1707:41:1707:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2418+
| main.rs:1670:9:1670:10 | S2 | | main.rs:1652:5:1652:14 | S2 |
2419+
| main.rs:1670:9:1670:16 | await S2 | | main.rs:1652:5:1652:14 | S2 |
2420+
| main.rs:1672:13:1672:14 | S1 | | main.rs:1636:5:1636:14 | S1 |
2421+
| main.rs:1684:15:1684:19 | SelfParam | | file://:0:0:0:0 | & |
2422+
| main.rs:1684:15:1684:19 | SelfParam | &T | main.rs:1683:5:1685:5 | Self [trait Trait1] |
2423+
| main.rs:1688:15:1688:19 | SelfParam | | file://:0:0:0:0 | & |
2424+
| main.rs:1688:15:1688:19 | SelfParam | &T | main.rs:1687:5:1689:5 | Self [trait Trait2] |
2425+
| main.rs:1692:15:1692:19 | SelfParam | | file://:0:0:0:0 | & |
2426+
| main.rs:1692:15:1692:19 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
2427+
| main.rs:1696:15:1696:19 | SelfParam | | file://:0:0:0:0 | & |
2428+
| main.rs:1696:15:1696:19 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
2429+
| main.rs:1699:37:1701:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2430+
| main.rs:1699:37:1701:5 | { ... } | | main.rs:1680:5:1680:14 | S1 |
2431+
| main.rs:1699:37:1701:5 | { ... } | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2432+
| main.rs:1699:37:1701:5 | { ... } | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2433+
| main.rs:1700:9:1700:10 | S1 | | file://:0:0:0:0 | impl Trait ... |
2434+
| main.rs:1700:9:1700:10 | S1 | | main.rs:1680:5:1680:14 | S1 |
2435+
| main.rs:1700:9:1700:10 | S1 | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2436+
| main.rs:1700:9:1700:10 | S1 | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2437+
| main.rs:1704:18:1704:22 | SelfParam | | file://:0:0:0:0 | & |
2438+
| main.rs:1704:18:1704:22 | SelfParam | &T | main.rs:1703:5:1705:5 | Self [trait MyTrait] |
2439+
| main.rs:1708:18:1708:22 | SelfParam | | file://:0:0:0:0 | & |
2440+
| main.rs:1708:18:1708:22 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
2441+
| main.rs:1708:31:1710:9 | { ... } | | main.rs:1681:5:1681:14 | S2 |
2442+
| main.rs:1709:13:1709:14 | S2 | | main.rs:1681:5:1681:14 | S2 |
2443+
| main.rs:1713:45:1715:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2444+
| main.rs:1713:45:1715:5 | { ... } | | main.rs:1680:5:1680:14 | S1 |
2445+
| main.rs:1713:45:1715:5 | { ... } | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2446+
| main.rs:1713:45:1715:5 | { ... } | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2447+
| main.rs:1714:9:1714:10 | S1 | | file://:0:0:0:0 | impl Trait ... |
2448+
| main.rs:1714:9:1714:10 | S1 | | main.rs:1680:5:1680:14 | S1 |
2449+
| main.rs:1714:9:1714:10 | S1 | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2450+
| main.rs:1714:9:1714:10 | S1 | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2451+
| main.rs:1717:41:1717:41 | t | | main.rs:1717:26:1717:38 | B |
2452+
| main.rs:1717:52:1719:5 | { ... } | | main.rs:1717:23:1717:23 | A |
2453+
| main.rs:1718:9:1718:9 | t | | main.rs:1717:26:1717:38 | B |
2454+
| main.rs:1718:9:1718:17 | t.get_a() | | main.rs:1717:23:1717:23 | A |
2455+
| main.rs:1721:26:1721:26 | t | | file://:0:0:0:0 | impl Trait ... |
2456+
| main.rs:1721:26:1721:26 | t | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2457+
| main.rs:1721:26:1721:26 | t | impl Trait<0>.A | main.rs:1721:23:1721:23 | A |
2458+
| main.rs:1721:51:1723:5 | { ... } | | main.rs:1721:23:1721:23 | A |
2459+
| main.rs:1722:9:1722:9 | t | | file://:0:0:0:0 | impl Trait ... |
2460+
| main.rs:1722:9:1722:9 | t | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2461+
| main.rs:1722:9:1722:9 | t | impl Trait<0>.A | main.rs:1721:23:1721:23 | A |
2462+
| main.rs:1722:9:1722:17 | t.get_a() | | main.rs:1721:23:1721:23 | A |
2463+
| main.rs:1726:13:1726:13 | x | | file://:0:0:0:0 | impl Trait ... |
2464+
| main.rs:1726:13:1726:13 | x | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2465+
| main.rs:1726:13:1726:13 | x | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2466+
| main.rs:1726:17:1726:20 | f1(...) | | file://:0:0:0:0 | impl Trait ... |
2467+
| main.rs:1726:17:1726:20 | f1(...) | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2468+
| main.rs:1726:17:1726:20 | f1(...) | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2469+
| main.rs:1727:9:1727:9 | x | | file://:0:0:0:0 | impl Trait ... |
2470+
| main.rs:1727:9:1727:9 | x | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2471+
| main.rs:1727:9:1727:9 | x | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2472+
| main.rs:1728:9:1728:9 | x | | file://:0:0:0:0 | impl Trait ... |
2473+
| main.rs:1728:9:1728:9 | x | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2474+
| main.rs:1728:9:1728:9 | x | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2475+
| main.rs:1729:13:1729:13 | a | | file://:0:0:0:0 | impl Trait ... |
2476+
| main.rs:1729:13:1729:13 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2477+
| main.rs:1729:13:1729:13 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2478+
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | | file://:0:0:0:0 | impl Trait ... |
2479+
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2480+
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2481+
| main.rs:1730:32:1730:32 | a | | file://:0:0:0:0 | impl Trait ... |
2482+
| main.rs:1730:32:1730:32 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2483+
| main.rs:1730:32:1730:32 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2484+
| main.rs:1731:13:1731:13 | a | | file://:0:0:0:0 | impl Trait ... |
2485+
| main.rs:1731:13:1731:13 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2486+
| main.rs:1731:13:1731:13 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2487+
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | | file://:0:0:0:0 | impl Trait ... |
2488+
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2489+
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2490+
| main.rs:1732:13:1732:13 | c | | main.rs:1681:5:1681:14 | S2 |
2491+
| main.rs:1732:17:1732:33 | uses_my_trait2(...) | | main.rs:1681:5:1681:14 | S2 |
2492+
| main.rs:1732:32:1732:32 | a | | file://:0:0:0:0 | impl Trait ... |
2493+
| main.rs:1732:32:1732:32 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2494+
| main.rs:1732:32:1732:32 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2495+
| main.rs:1733:32:1733:33 | S1 | | file://:0:0:0:0 | impl Trait ... |
2496+
| main.rs:1733:32:1733:33 | S1 | | main.rs:1680:5:1680:14 | S1 |
2497+
| main.rs:1733:32:1733:33 | S1 | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2498+
| main.rs:1739:5:1739:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
2499+
| main.rs:1740:5:1740:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
2500+
| main.rs:1740:20:1740:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2501+
| main.rs:1740:41:1740:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |

0 commit comments

Comments
 (0)