Merge pull request #19584 from hvitved/rust/type-inference-await

Rust: Type inference for `.await` expressions
This commit is contained in:
Tom Hvitved
2025-06-10 14:56:28 +02:00
committed by GitHub
11 changed files with 588 additions and 24 deletions

View File

@@ -1630,6 +1630,110 @@ mod overloadable_operators {
}
}
mod async_ {
use std::future::Future;
struct S1;
impl S1 {
pub fn f(self) {} // S1f
}
async fn f1() -> S1 {
S1
}
fn f2() -> impl Future<Output = S1> {
async {
S1
}
}
struct S2;
impl Future for S2 {
type Output = S1;
fn poll(self: std::pin::Pin<&mut Self>, _cx: &mut std::task::Context<'_>) -> std::task::Poll<Self::Output> {
std::task::Poll::Ready(S1)
}
}
fn f3() -> impl Future<Output = S1> {
S2
}
pub async fn f() {
f1().await.f(); // $ method=S1f
f2().await.f(); // $ method=S1f
f3().await.f(); // $ method=S1f
S2.await.f(); // $ method=S1f
let b = async {
S1
};
b.await.f(); // $ method=S1f
}
}
mod impl_trait {
struct S1;
struct S2;
trait Trait1 {
fn f1(&self) {} // Trait1f1
}
trait Trait2 {
fn f2(&self) {} // Trait2f2
}
impl Trait1 for S1 {
fn f1(&self) {} // S1f1
}
impl Trait2 for S1 {
fn f2(&self) {} // S1f2
}
fn f1() -> impl Trait1 + Trait2 {
S1
}
trait MyTrait<A> {
fn get_a(&self) -> A; // MyTrait::get_a
}
impl MyTrait<S2> for S1 {
fn get_a(&self) -> S2 {
S2
}
}
fn get_a_my_trait() -> impl MyTrait<S2> {
S1
}
fn uses_my_trait1<A, B: MyTrait<A>>(t: B) -> A {
t.get_a() // $ method=MyTrait::get_a
}
fn uses_my_trait2<A>(t: impl MyTrait<A>) -> A {
t.get_a() // $ method=MyTrait::get_a
}
pub fn f() {
let x = f1();
x.f1(); // $ method=Trait1f1
x.f2(); // $ method=Trait2f2
let a = get_a_my_trait();
let b = uses_my_trait1(a); // $ type=b:S2
let a = get_a_my_trait();
let c = uses_my_trait2(a); // $ type=c:S2
let d = uses_my_trait2(S1); // $ type=d:S2
}
}
fn main() {
field_access::f();
method_impl::f();
@@ -1649,4 +1753,6 @@ fn main() {
try_expressions::f();
builtins::f();
operators::f();
async_::f();
impl_trait::f();
}

View File

@@ -2374,8 +2374,97 @@ inferType
| main.rs:1629:13:1629:20 | vec2_not | | main.rs:1278:5:1283:5 | Vec2 |
| main.rs:1629:24:1629:26 | ! ... | | main.rs:1278:5:1283:5 | Vec2 |
| main.rs:1629:25:1629:26 | v1 | | main.rs:1278:5:1283:5 | Vec2 |
| main.rs:1635:5:1635:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
| main.rs:1636:5:1636:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
| main.rs:1636:20:1636:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
| main.rs:1636:41:1636:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
| main.rs:1639:18:1639:21 | SelfParam | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1642:25:1644:5 | { ... } | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1643:9:1643:10 | S1 | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1646:41:1650:5 | { ... } | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1646:41:1650:5 | { ... } | | main.rs:1646:16:1646:39 | ImplTraitTypeRepr |
| main.rs:1646:41:1650:5 | { ... } | Output | main.rs:1636:5:1636:14 | S1 |
| main.rs:1647:9:1649:9 | { ... } | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1647:9:1649:9 | { ... } | | main.rs:1646:16:1646:39 | ImplTraitTypeRepr |
| main.rs:1647:9:1649:9 | { ... } | Output | main.rs:1636:5:1636:14 | S1 |
| main.rs:1648:13:1648:14 | S1 | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1657:17:1657:46 | SelfParam | | {EXTERNAL LOCATION} | Pin |
| main.rs:1657:17:1657:46 | SelfParam | Ptr | file://:0:0:0:0 | & |
| main.rs:1657:17:1657:46 | SelfParam | Ptr.&T | main.rs:1652:5:1652:14 | S2 |
| main.rs:1657:49:1657:51 | _cx | | file://:0:0:0:0 | & |
| main.rs:1657:49:1657:51 | _cx | &T | {EXTERNAL LOCATION} | Context |
| main.rs:1657:116:1659:9 | { ... } | | {EXTERNAL LOCATION} | Poll |
| main.rs:1657:116:1659:9 | { ... } | T | main.rs:1636:5:1636:14 | S1 |
| main.rs:1658:13:1658:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll |
| main.rs:1658:13:1658:38 | ...::Ready(...) | T | main.rs:1636:5:1636:14 | S1 |
| main.rs:1658:36:1658:37 | S1 | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1662:41:1664:5 | { ... } | | main.rs:1652:5:1652:14 | S2 |
| main.rs:1662:41:1664:5 | { ... } | | main.rs:1662:16:1662:39 | ImplTraitTypeRepr |
| main.rs:1663:9:1663:10 | S2 | | main.rs:1652:5:1652:14 | S2 |
| main.rs:1663:9:1663:10 | S2 | | main.rs:1662:16:1662:39 | ImplTraitTypeRepr |
| main.rs:1667:9:1667:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1667:9:1667:12 | f1(...) | Output | main.rs:1636:5:1636:14 | S1 |
| main.rs:1667:9:1667:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1668:9:1668:12 | f2(...) | | main.rs:1646:16:1646:39 | ImplTraitTypeRepr |
| main.rs:1668:9:1668:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1669:9:1669:12 | f3(...) | | main.rs:1662:16:1662:39 | ImplTraitTypeRepr |
| main.rs:1669:9:1669:18 | await ... | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1670:9:1670:10 | S2 | | main.rs:1652:5:1652:14 | S2 |
| main.rs:1670:9:1670:16 | await S2 | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1671:13:1671:13 | b | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1671:13:1671:13 | b | Output | main.rs:1636:5:1636:14 | S1 |
| main.rs:1671:17:1673:9 | { ... } | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1671:17:1673:9 | { ... } | Output | main.rs:1636:5:1636:14 | S1 |
| main.rs:1672:13:1672:14 | S1 | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1674:9:1674:9 | b | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1674:9:1674:9 | b | Output | main.rs:1636:5:1636:14 | S1 |
| main.rs:1674:9:1674:15 | await b | | main.rs:1636:5:1636:14 | S1 |
| main.rs:1684:15:1684:19 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1684:15:1684:19 | SelfParam | &T | main.rs:1683:5:1685:5 | Self [trait Trait1] |
| main.rs:1688:15:1688:19 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1688:15:1688:19 | SelfParam | &T | main.rs:1687:5:1689:5 | Self [trait Trait2] |
| main.rs:1692:15:1692:19 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1692:15:1692:19 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
| main.rs:1696:15:1696:19 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1696:15:1696:19 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
| main.rs:1699:37:1701:5 | { ... } | | main.rs:1680:5:1680:14 | S1 |
| main.rs:1699:37:1701:5 | { ... } | | main.rs:1699:16:1699:35 | ImplTraitTypeRepr |
| main.rs:1700:9:1700:10 | S1 | | main.rs:1680:5:1680:14 | S1 |
| main.rs:1700:9:1700:10 | S1 | | main.rs:1699:16:1699:35 | ImplTraitTypeRepr |
| main.rs:1704:18:1704:22 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1704:18:1704:22 | SelfParam | &T | main.rs:1703:5:1705:5 | Self [trait MyTrait] |
| main.rs:1708:18:1708:22 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1708:18:1708:22 | SelfParam | &T | main.rs:1680:5:1680:14 | S1 |
| main.rs:1708:31:1710:9 | { ... } | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1709:13:1709:14 | S2 | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1713:45:1715:5 | { ... } | | main.rs:1680:5:1680:14 | S1 |
| main.rs:1713:45:1715:5 | { ... } | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1714:9:1714:10 | S1 | | main.rs:1680:5:1680:14 | S1 |
| main.rs:1714:9:1714:10 | S1 | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1717:41:1717:41 | t | | main.rs:1717:26:1717:38 | B |
| main.rs:1717:52:1719:5 | { ... } | | main.rs:1717:23:1717:23 | A |
| main.rs:1718:9:1718:9 | t | | main.rs:1717:26:1717:38 | B |
| main.rs:1718:9:1718:17 | t.get_a() | | main.rs:1717:23:1717:23 | A |
| main.rs:1721:26:1721:26 | t | | main.rs:1721:29:1721:43 | ImplTraitTypeRepr |
| main.rs:1721:51:1723:5 | { ... } | | main.rs:1721:23:1721:23 | A |
| main.rs:1722:9:1722:9 | t | | main.rs:1721:29:1721:43 | ImplTraitTypeRepr |
| main.rs:1722:9:1722:17 | t.get_a() | | main.rs:1721:23:1721:23 | A |
| main.rs:1726:13:1726:13 | x | | main.rs:1699:16:1699:35 | ImplTraitTypeRepr |
| main.rs:1726:17:1726:20 | f1(...) | | main.rs:1699:16:1699:35 | ImplTraitTypeRepr |
| main.rs:1727:9:1727:9 | x | | main.rs:1699:16:1699:35 | ImplTraitTypeRepr |
| main.rs:1728:9:1728:9 | x | | main.rs:1699:16:1699:35 | ImplTraitTypeRepr |
| main.rs:1729:13:1729:13 | a | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1729:17:1729:32 | get_a_my_trait(...) | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1730:13:1730:13 | b | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1730:17:1730:33 | uses_my_trait1(...) | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1730:32:1730:32 | a | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1731:13:1731:13 | a | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1731:17:1731:32 | get_a_my_trait(...) | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1732:13:1732:13 | c | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1732:17:1732:33 | uses_my_trait2(...) | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1732:32:1732:32 | a | | main.rs:1713:28:1713:43 | ImplTraitTypeRepr |
| main.rs:1733:13:1733:13 | d | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1733:17:1733:34 | uses_my_trait2(...) | | main.rs:1681:5:1681:14 | S2 |
| main.rs:1733:32:1733:33 | S1 | | main.rs:1680:5:1680:14 | S1 |
| main.rs:1739:5:1739:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
| main.rs:1740:5:1740:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
| main.rs:1740:20:1740:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
| main.rs:1740:41:1740:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
| main.rs:1756:5:1756:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
testFailures

View File

@@ -4,6 +4,8 @@ multiplePathResolutions
| src/main.rs:8:21:8:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:8:21:8:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:8:21:8:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:8:21:8:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:19:21:19:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:19:21:19:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:19:21:19:33 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:19:21:19:33 | ...::from | file://:0:0:0:0 | fn from |
@@ -14,6 +16,8 @@ multiplePathResolutions
| src/main.rs:25:23:25:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:25:23:25:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:25:23:25:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:25:23:25:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:26:38:26:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:26:38:26:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:26:38:26:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:26:38:26:50 | ...::from | file://:0:0:0:0 | fn from |
@@ -24,6 +28,8 @@ multiplePathResolutions
| src/main.rs:39:23:39:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:39:23:39:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:39:23:39:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:39:23:39:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:40:38:40:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:40:38:40:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:40:38:40:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:40:38:40:50 | ...::from | file://:0:0:0:0 | fn from |
@@ -34,6 +40,8 @@ multiplePathResolutions
| src/main.rs:52:23:52:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:52:23:52:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:52:23:52:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:52:23:52:35 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:53:38:53:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:53:38:53:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:53:38:53:50 | ...::from | file://:0:0:0:0 | fn from |
| src/main.rs:53:38:53:50 | ...::from | file://:0:0:0:0 | fn from |