Skip to content

Commit f283271

Browse files
committed
Rust: Add more type inference tests
1 parent 821f2fd commit f283271

File tree

2 files changed

+123
-38
lines changed

2 files changed

+123
-38
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: 90 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2378,10 +2378,10 @@ inferType
23782378
| main.rs:1642:25:1644:5 | { ... } | | main.rs:1636:5:1636:14 | S1 |
23792379
| main.rs:1643:9:1643:10 | S1 | | main.rs:1636:5:1636:14 | S1 |
23802380
| main.rs:1646:41:1650:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2381-
| main.rs:1646:41:1650:5 | { ... } | impl Trait<0> | file:///RUSTUP_HOME/toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs:7:1:105:1 | trait Future |
2381+
| main.rs:1646:41:1650:5 | { ... } | impl Trait<0> | {EXTERNAL LOCATION} | trait Future |
23822382
| main.rs:1646:41:1650:5 | { ... } | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
23832383
| main.rs:1647:9:1649:9 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2384-
| main.rs:1647:9:1649:9 | { ... } | impl Trait<0> | file:///RUSTUP_HOME/toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs:7:1:105:1 | trait Future |
2384+
| main.rs:1647:9:1649:9 | { ... } | impl Trait<0> | {EXTERNAL LOCATION} | trait Future |
23852385
| main.rs:1647:9:1649:9 | { ... } | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
23862386
| main.rs:1648:13:1648:14 | S1 | | main.rs:1636:5:1636:14 | S1 |
23872387
| main.rs:1657:17:1657:46 | SelfParam | | {EXTERNAL LOCATION} | Pin |
@@ -2396,54 +2396,106 @@ inferType
23962396
| main.rs:1658:36:1658:37 | S1 | | main.rs:1636:5:1636:14 | S1 |
23972397
| main.rs:1662:41:1664:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
23982398
| main.rs:1662:41:1664:5 | { ... } | | main.rs:1652:5:1652:14 | S2 |
2399-
| main.rs:1662:41:1664:5 | { ... } | impl Trait<0> | file:///RUSTUP_HOME/toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs:7:1:105:1 | trait Future |
2399+
| main.rs:1662:41:1664:5 | { ... } | impl Trait<0> | {EXTERNAL LOCATION} | trait Future |
24002400
| main.rs:1662:41:1664:5 | { ... } | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
24012401
| main.rs:1663:9:1663:10 | S2 | | file://:0:0:0:0 | impl Trait ... |
24022402
| main.rs:1663:9:1663:10 | S2 | | main.rs:1652:5:1652:14 | S2 |
2403-
| main.rs:1663:9:1663:10 | S2 | impl Trait<0> | file:///RUSTUP_HOME/toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs:7:1:105:1 | trait Future |
2403+
| main.rs:1663:9:1663:10 | S2 | impl Trait<0> | {EXTERNAL LOCATION} | trait Future |
24042404
| main.rs:1663:9:1663:10 | S2 | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
24052405
| main.rs:1667:9:1667:12 | f1(...) | | main.rs:1636:5:1636:14 | S1 |
24062406
| main.rs:1667:9:1667:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
24072407
| main.rs:1668:9:1668:12 | f2(...) | | file://:0:0:0:0 | impl Trait ... |
2408-
| main.rs:1668:9:1668:12 | f2(...) | impl Trait<0> | file:///RUSTUP_HOME/toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs:7:1:105:1 | trait Future |
2408+
| main.rs:1668:9:1668:12 | f2(...) | impl Trait<0> | {EXTERNAL LOCATION} | trait Future |
24092409
| main.rs:1668:9:1668:12 | f2(...) | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
24102410
| main.rs:1668:9:1668:18 | await ... | | file://:0:0:0:0 | impl Trait ... |
24112411
| main.rs:1668:9:1668:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
24122412
| main.rs:1669:9:1669:12 | f3(...) | | file://:0:0:0:0 | impl Trait ... |
2413-
| main.rs:1669:9:1669:12 | f3(...) | impl Trait<0> | file:///RUSTUP_HOME/toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs:7:1:105:1 | trait Future |
2413+
| main.rs:1669:9:1669:12 | f3(...) | impl Trait<0> | {EXTERNAL LOCATION} | trait Future |
24142414
| main.rs:1669:9:1669:12 | f3(...) | impl Trait<0>.Output | main.rs:1636:5:1636:14 | S1 |
24152415
| main.rs:1669:9:1669:18 | await ... | | file://:0:0:0:0 | impl Trait ... |
24162416
| main.rs:1669:9:1669:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
2417-
| main.rs:1678:15:1678:19 | SelfParam | | file://:0:0:0:0 | & |
2418-
| main.rs:1678:15:1678:19 | SelfParam | &T | main.rs:1677:5:1679:5 | Self [trait Trait1] |
2419-
| main.rs:1682:15:1682:19 | SelfParam | | file://:0:0:0:0 | & |
2420-
| main.rs:1682:15:1682:19 | SelfParam | &T | main.rs:1681:5:1683:5 | Self [trait Trait2] |
2421-
| main.rs:1686:15:1686:19 | SelfParam | | file://:0:0:0:0 | & |
2422-
| main.rs:1686:15:1686:19 | SelfParam | &T | main.rs:1675:5:1675:14 | S1 |
2423-
| main.rs:1690:15:1690:19 | SelfParam | | file://:0:0:0:0 | & |
2424-
| main.rs:1690:15:1690:19 | SelfParam | &T | main.rs:1675:5:1675:14 | S1 |
2425-
| main.rs:1693:37:1695:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2426-
| main.rs:1693:37:1695:5 | { ... } | | main.rs:1675:5:1675:14 | S1 |
2427-
| main.rs:1693:37:1695:5 | { ... } | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2428-
| main.rs:1693:37:1695:5 | { ... } | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2429-
| main.rs:1694:9:1694:10 | S1 | | file://:0:0:0:0 | impl Trait ... |
2430-
| main.rs:1694:9:1694:10 | S1 | | main.rs:1675:5:1675:14 | S1 |
2431-
| main.rs:1694:9:1694:10 | S1 | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2432-
| main.rs:1694:9:1694:10 | S1 | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2433-
| main.rs:1698:13:1698:13 | x | | file://:0:0:0:0 | impl Trait ... |
2434-
| main.rs:1698:13:1698:13 | x | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2435-
| main.rs:1698:13:1698:13 | x | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2436-
| main.rs:1698:17:1698:20 | f1(...) | | file://:0:0:0:0 | impl Trait ... |
2437-
| main.rs:1698:17:1698:20 | f1(...) | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2438-
| main.rs:1698:17:1698:20 | f1(...) | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2439-
| main.rs:1699:9:1699:9 | x | | file://:0:0:0:0 | impl Trait ... |
2440-
| main.rs:1699:9:1699:9 | x | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2441-
| main.rs:1699:9:1699:9 | x | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2442-
| main.rs:1700:9:1700:9 | x | | file://:0:0:0:0 | impl Trait ... |
2443-
| main.rs:1700:9:1700:9 | x | impl Trait<0> | main.rs:1677:5:1679:5 | trait Trait1 |
2444-
| main.rs:1700:9:1700:9 | x | impl Trait<1> | main.rs:1681:5:1683:5 | trait Trait2 |
2445-
| main.rs:1706:5:1706:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
2446-
| main.rs:1707:5:1707:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
2447-
| main.rs:1707:20:1707:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2448-
| main.rs:1707:41:1707:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2417+
| main.rs:1670:9:1670:10 | S2 | | main.rs:1652:5:1652:14 | S2 |
2418+
| main.rs:1670:9:1670:16 | await S2 | | main.rs:1652:5:1652:14 | S2 |
2419+
| main.rs:1672:13:1672:14 | S1 | | main.rs:1636:5:1636:14 | S1 |
2420+
| main.rs:1684:15:1684:19 | SelfParam | | file://:0:0:0:0 | & |
2421+
| main.rs:1684:15:1684:19 | SelfParam | &T | main.rs:1683:5:1685:5 | Self [trait Trait1] |
2422+
| main.rs:1688:15:1688:19 | SelfParam | | file://:0:0:0:0 | & |
2423+
| main.rs:1688:15:1688:19 | SelfParam | &T | main.rs:1687:5:1689:5 | Self [trait Trait2] |
2424+
| main.rs:1692:15:1692:19 | SelfParam | | file://:0:0:0:0 | & |
2425+
| main.rs:1692:15:1692:19 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
2426+
| main.rs:1696:15:1696:19 | SelfParam | | file://:0:0:0:0 | & |
2427+
| main.rs:1696:15:1696:19 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
2428+
| main.rs:1699:37:1701:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2429+
| main.rs:1699:37:1701:5 | { ... } | | main.rs:1680:5:1680:14 | S1 |
2430+
| main.rs:1699:37:1701:5 | { ... } | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2431+
| main.rs:1699:37:1701:5 | { ... } | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2432+
| main.rs:1700:9:1700:10 | S1 | | file://:0:0:0:0 | impl Trait ... |
2433+
| main.rs:1700:9:1700:10 | S1 | | main.rs:1680:5:1680:14 | S1 |
2434+
| main.rs:1700:9:1700:10 | S1 | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2435+
| main.rs:1700:9:1700:10 | S1 | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2436+
| main.rs:1704:18:1704:22 | SelfParam | | file://:0:0:0:0 | & |
2437+
| main.rs:1704:18:1704:22 | SelfParam | &T | main.rs:1703:5:1705:5 | Self [trait MyTrait] |
2438+
| main.rs:1708:18:1708:22 | SelfParam | | file://:0:0:0:0 | & |
2439+
| main.rs:1708:18:1708:22 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
2440+
| main.rs:1708:31:1710:9 | { ... } | | main.rs:1681:5:1681:14 | S2 |
2441+
| main.rs:1709:13:1709:14 | S2 | | main.rs:1681:5:1681:14 | S2 |
2442+
| main.rs:1713:45:1715:5 | { ... } | | file://:0:0:0:0 | impl Trait ... |
2443+
| main.rs:1713:45:1715:5 | { ... } | | main.rs:1680:5:1680:14 | S1 |
2444+
| main.rs:1713:45:1715:5 | { ... } | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2445+
| main.rs:1713:45:1715:5 | { ... } | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2446+
| main.rs:1714:9:1714:10 | S1 | | file://:0:0:0:0 | impl Trait ... |
2447+
| main.rs:1714:9:1714:10 | S1 | | main.rs:1680:5:1680:14 | S1 |
2448+
| main.rs:1714:9:1714:10 | S1 | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2449+
| main.rs:1714:9:1714:10 | S1 | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2450+
| main.rs:1717:41:1717:41 | t | | main.rs:1717:26:1717:38 | B |
2451+
| main.rs:1717:52:1719:5 | { ... } | | main.rs:1717:23:1717:23 | A |
2452+
| main.rs:1718:9:1718:9 | t | | main.rs:1717:26:1717:38 | B |
2453+
| main.rs:1718:9:1718:17 | t.get_a() | | main.rs:1717:23:1717:23 | A |
2454+
| main.rs:1721:26:1721:26 | t | | file://:0:0:0:0 | impl Trait ... |
2455+
| main.rs:1721:26:1721:26 | t | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2456+
| main.rs:1721:26:1721:26 | t | impl Trait<0>.A | main.rs:1721:23:1721:23 | A |
2457+
| main.rs:1721:51:1723:5 | { ... } | | main.rs:1721:23:1721:23 | A |
2458+
| main.rs:1722:9:1722:9 | t | | file://:0:0:0:0 | impl Trait ... |
2459+
| main.rs:1722:9:1722:9 | t | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2460+
| main.rs:1722:9:1722:9 | t | impl Trait<0>.A | main.rs:1721:23:1721:23 | A |
2461+
| main.rs:1722:9:1722:17 | t.get_a() | | main.rs:1721:23:1721:23 | A |
2462+
| main.rs:1726:13:1726:13 | x | | file://:0:0:0:0 | impl Trait ... |
2463+
| main.rs:1726:13:1726:13 | x | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2464+
| main.rs:1726:13:1726:13 | x | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2465+
| main.rs:1726:17:1726:20 | f1(...) | | file://:0:0:0:0 | impl Trait ... |
2466+
| main.rs:1726:17:1726:20 | f1(...) | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2467+
| main.rs:1726:17:1726:20 | f1(...) | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2468+
| main.rs:1727:9:1727:9 | x | | file://:0:0:0:0 | impl Trait ... |
2469+
| main.rs:1727:9:1727:9 | x | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2470+
| main.rs:1727:9:1727:9 | x | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2471+
| main.rs:1728:9:1728:9 | x | | file://:0:0:0:0 | impl Trait ... |
2472+
| main.rs:1728:9:1728:9 | x | impl Trait<0> | main.rs:1683:5:1685:5 | trait Trait1 |
2473+
| main.rs:1728:9:1728:9 | x | impl Trait<1> | main.rs:1687:5:1689:5 | trait Trait2 |
2474+
| main.rs:1729:13:1729:13 | a | | file://:0:0:0:0 | impl Trait ... |
2475+
| main.rs:1729:13:1729:13 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2476+
| main.rs:1729:13:1729:13 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2477+
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | | file://:0:0:0:0 | impl Trait ... |
2478+
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2479+
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2480+
| main.rs:1730:32:1730:32 | a | | file://:0:0:0:0 | impl Trait ... |
2481+
| main.rs:1730:32:1730:32 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2482+
| main.rs:1730:32:1730:32 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2483+
| main.rs:1731:13:1731:13 | a | | file://:0:0:0:0 | impl Trait ... |
2484+
| main.rs:1731:13:1731:13 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2485+
| main.rs:1731:13:1731:13 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2486+
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | | file://:0:0:0:0 | impl Trait ... |
2487+
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2488+
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2489+
| main.rs:1732:13:1732:13 | c | | main.rs:1681:5:1681:14 | S2 |
2490+
| main.rs:1732:17:1732:33 | uses_my_trait2(...) | | main.rs:1681:5:1681:14 | S2 |
2491+
| main.rs:1732:32:1732:32 | a | | file://:0:0:0:0 | impl Trait ... |
2492+
| main.rs:1732:32:1732:32 | a | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2493+
| main.rs:1732:32:1732:32 | a | impl Trait<0>.A | main.rs:1681:5:1681:14 | S2 |
2494+
| main.rs:1733:32:1733:33 | S1 | | file://:0:0:0:0 | impl Trait ... |
2495+
| main.rs:1733:32:1733:33 | S1 | | main.rs:1680:5:1680:14 | S1 |
2496+
| main.rs:1733:32:1733:33 | S1 | impl Trait<0> | main.rs:1703:5:1705:5 | trait MyTrait |
2497+
| main.rs:1739:5:1739:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
2498+
| main.rs:1740:5:1740:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
2499+
| main.rs:1740:20:1740:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2500+
| main.rs:1740:41:1740:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
24492501
testFailures

0 commit comments

Comments
 (0)