Skip to content

"one type is more general than the other" error that appears to expect and find the same type #90656

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
Arc-blroth opened this issue Nov 6, 2021 · 1 comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions D-confusing Diagnostics: Confusing error or lint that should be reworked. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example

Comments

@Arc-blroth
Copy link

Compiling this program:

use futures::stream::StreamExt;
use futures::{FutureExt, SinkExt};

fn main() {
    tokio::runtime::Runtime::new().unwrap().spawn(do_stuff());
}

async fn do_stuff() {
    let (mut tx, rx) = futures::channel::mpsc::channel::<u32>(10);
    tokio::spawn(async move {
        tx.send(1).await.unwrap();
    });
    rx.filter_map(|x| {
        println!("received a {}", x);
        std::future::ready(Some(Ok(x))).boxed()
    })
    .forward(futures::sink::drain())
    .await;
}

results in the confusing compiler error:

error[E0308]: mismatched types
 --> src/main.rs:5:45
  |
5 |     tokio::runtime::Runtime::new().unwrap().spawn(do_stuff());
  |                                             ^^^^^ one type is more general than the other
  |
  = note: expected struct `Pin<Box<dyn futures::Future<Output = Option<Result<u32, Infallible>>> + std::marker::Send>>`
             found struct `Pin<Box<dyn futures::Future<Output = Option<Result<u32, Infallible>>> + std::marker::Send>>`

I expected this program to compile and print received a 1 to stdout.

Doing any of the following will make the program pass compilation (maybe due to how type inference changes?):

  • changing .spawn() to .block_on() in the main function
  • removing the .boxed() call

Meta

rustc --version --verbose:

rustc 1.57.0-nightly (e1e9319d9 2021-10-14)
binary: rustc
commit-hash: e1e9319d93aea755c444c8f8ff863b0936d7a4b6
commit-date: 2021-10-14
host: x86_64-pc-windows-msvc
release: 1.57.0-nightly
LLVM version: 13.0.0

This error is also reproducible on the latest stable and latest nightly on the playground.

Playground link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cd86e8ecc0289ad192a465214eae3f76

@Arc-blroth Arc-blroth added the C-bug Category: This is a bug. label Nov 6, 2021
@Munksgaard
Copy link
Contributor

I've encountered the same problem with this example:

fn symbol<'a>(s: &'a str) -> impl FnMut(&'a str) -> Result<&'a str, &'a str> {
    |_| unimplemented!()
}

static FOO: &(dyn FnMut(&str) -> Result<&str, &str> + Sync) = &symbol("*");

fn main() {}

Playground link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=384859be0ad2e507a0fb22f596e3b132

@fmease fmease added A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions D-confusing Diagnostics: Confusing error or lint that should be reworked. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example and removed needs-triage-legacy C-bug Category: This is a bug. labels Jan 31, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions D-confusing Diagnostics: Confusing error or lint that should be reworked. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example
Projects
None yet
Development

No branches or pull requests

4 participants