Skip to content

1.70.0: Type inference no longer works in conjunction with Glib's clone macro #112225

Closed
@marhkb

Description

@marhkb

My code does not compile any more after updating to 1.70.0. The project can be found here

Code

I tried to create a minimal reproducer. It has something to do with glib's clone macro, which I use. Here is the reproducer that compiles fine on 1.69 but not on 1.70.0. I left some comments in the code describing what I observed so far. It needs glib and futures dependency):

use futures::Future;
use glib::clone;

fn main() {
    let obj = String::new();
    do_async(
        // just using `compound()` without `async` block works
        async { compound().await },
        clone!(@strong obj => move |info| if let Ok(info) = info {
            // removing this line makes the code compile
            println!("{:?}", info.t);
        }),
    );
}

struct Compound {
    t: i32
}

// Just returning a simple type like i32 makes the code compile
async fn compound() -> Result<Compound, ()> {
    Err(())
}

async fn do_async<R, Fut, F>(tokio_fut: Fut, glib_closure: F)
where
    R: Send + 'static,
    Fut: Future<Output = R> + Send + 'static,
    F: FnOnce(R) + 'static,
{
    glib_closure(tokio_fut.await);
}

Output

error[E0282]: type annotations needed for `Result<_, E>`
  --> src/main.rs:9:37
   |
9  |         clone!(@strong obj => move |info| if let Ok(info) = info {
   |                                     ^^^^
10 |             // removing this line makes the code compile
11 |             println!("{:?}", info.t);
   |                              ---- type must be known at this point
   |
help: consider giving this closure parameter an explicit type, where the placeholders `_` are specified
   |
9  |         clone!(@strong obj => move |info: Result<_, E>| if let Ok(info) = info {
   |                                         ++++++++++++++

For more information about this error, try `rustc --explain E0282`.

I expected to see this happen: The type info is correctly inferred

Instead, this happened: The compiler tells me that it doesn't know the type, although the type can be inferred

Version it worked on

It most recently worked on: 1.69.0

Version with regression

rustc --version --verbose:

rustc 1.70.0 (90c541806 2023-05-31)
binary: rustc
commit-hash: 90c541806f23a127002de5b4038be731ba1458ca
commit-date: 2023-05-31
host: x86_64-unknown-linux-gnu
release: 1.70.0
LLVM version: 16.0.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-async-awaitArea: Async & AwaitA-inferenceArea: Type inferenceC-bugCategory: This is a bug.P-highHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions