Skip to content

mismatched types, one type is more general than the other error shows types with the same name #77365

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

Closed
micouy opened this issue Sep 30, 2020 · 10 comments
Labels
A-closures Area: Closures (`|…| { … }`) A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions A-type-system Area: Type system C-bug Category: This is a bug. D-incorrect Diagnostics: A diagnostic that is giving misleading or incorrect information. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@micouy
Copy link

micouy commented Sep 30, 2020

Example code:

fn main() {
    let mut v: Vec<i32> = vec![];
    let f = |_| true;
    v.retain(f);
}

Error message:

error[E0308]: mismatched types
 --> src/main.rs:4:7
  |
4 |     v.retain(f);
  |       ^^^^^^ one type is more general than the other
  |
  = note: expected type `FnOnce<(&i32,)>`
             found type `FnOnce<(&i32,)>`

rustc version:

rustc 1.48.0-nightly (dbb73f8f7 2020-09-12)
binary: rustc
commit-hash: dbb73f8f79ab176a897d5a95e696adb71b957cbe
commit-date: 2020-09-12
host: x86_64-apple-darwin
release: 1.48.0-nightly
LLVM version: 11.0
@micouy micouy added the C-bug Category: This is a bug. label Sep 30, 2020
@jyn514
Copy link
Member

jyn514 commented Sep 30, 2020

Possible duplicate of #76353

@jyn514 jyn514 added A-diagnostics Area: Messages for errors, warnings, and lints A-type-system Area: Type system T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Sep 30, 2020
@camelid camelid added the D-incorrect Diagnostics: A diagnostic that is giving misleading or incorrect information. label Sep 30, 2020
@camelid
Copy link
Member

camelid commented Sep 30, 2020

:)

// I can't think how to do better than this right now. -nikomatsakis

@camelid camelid added the A-closures Area: Closures (`|…| { … }`) label Sep 30, 2020
@micouy
Copy link
Author

micouy commented Oct 9, 2020

For those having the same problem - adding type annotations in the closure definition makes the error go away.

fn main() {
    let mut v: Vec<i32> = vec![];
    let f = |_: &i32| true; // now it compiles
    v.retain(f);
}

@jyn514
Copy link
Member

jyn514 commented Oct 9, 2020

let f = |_: &_| true; will also work.

@camelid
Copy link
Member

camelid commented Oct 28, 2020

searched nightlies: from nightly-2019-01-01 to nightly-2020-10-28
regressed nightly: nightly-2020-06-24
searched commits: from 6bb3dbf to ff5b446
regressed commit: 1557fb0

bisected with cargo-bisect-rustc v0.6.0

Host triple: x86_64-apple-darwin
Reproduce with:

cargo bisect-rustc --preserve --prompt --start=2019-01-01 

@camelid
Copy link
Member

camelid commented Oct 28, 2020

This is an error -> very confusing error issue.

I actually don't understand the errors that used to be emitted. Can anyone else make sense of it?

error[E0631]: type mismatch in closure arguments
 --> src/main.rs:4:14
  |
3 |     let f = |_| true;
  |             -------- found signature of `fn(_) -> _`
4 |     v.retain(f);
  |              ^ expected signature of `for<'r> fn(&'r i32) -> _`

error[E0271]: type mismatch resolving `for<'r> <[closure@src/main.rs:3:13: 3:21] as std::ops::FnOnce<(&'r i32,)>>::Output == bool`
 --> src/main.rs:4:7
  |
4 |     v.retain(f);
  |       ^^^^^^ expected bound lifetime parameter, found concrete lifetime

error: aborting due to 2 previous errors

Unfortunately, the regression was in a rollup :/

@camelid
Copy link
Member

camelid commented Oct 28, 2020

The regression was in a rollup, but I think it's pretty likely that #73496 is the cause, so cc @estebank

@camelid camelid added the A-lifetimes Area: Lifetimes / regions label Oct 28, 2020
@camelid
Copy link
Member

camelid commented Oct 28, 2020

Some debug logs that may be helpful:

2:rustcDEBUG rustc_typeck::check::writeback writeback: typeck results for DefId(0:3 ~ issue_77365[317d]::main) are TypeckResults {
2:rustc    hir_owner: DefId(0:3 ~ issue_77365[317d]::main),
2:rustc    type_dependent_defs: {
2:rustc        28: Ok(
2:rustc            (
2:rustc                AssocFn,
2:rustc                DefId(5:4646 ~ alloc[fd51]::vec::{impl#0}::retain),
2:rustc            ),
2:rustc        ),
2:rustc        13: Ok(
2:rustc            (
2:rustc                AssocFn,
2:rustc                DefId(5:4622 ~ alloc[fd51]::vec::{impl#0}::new),
2:rustc            ),
2:rustc        ),
2:rustc    },
2:rustc    field_indices: {},
2:rustc    node_types: {
2:rustc        20: [closure@src/test/ui/issues/issue-77365.rs:3:13: 3:21],
2:rustc        17: &i32,
2:rustc        14: std::vec::Vec<i32>,
2:rustc        11: std::vec::Vec<i32>,
2:rustc        5: i32,
2:rustc        2: [closure@src/test/ui/issues/issue-77365.rs:3:13: 3:21],
2:rustc        31: (),
2:rustc        28: (),
2:rustc        25: std::vec::Vec<i32>,
2:rustc        19: bool,
2:rustc        13: fn() -> std::vec::Vec<i32> {std::vec::Vec::<i32>::new},
2:rustc        4: std::vec::Vec<i32>,
2:rustc        1: std::vec::Vec<i32>,
2:rustc        30: (),
2:rustc        27: [closure@src/test/ui/issues/issue-77365.rs:3:13: 3:21],
2:rustc        21: [closure@src/test/ui/issues/issue-77365.rs:3:13: 3:21],
2:rustc        18: &i32,
2:rustc        15: std::vec::Vec<i32>,
2:rustc        3: &i32,
2:rustc    },
2:rustc    node_substs: {
2:rustc        28: [
2:rustc            i32,
2:rustc            [closure@src/test/ui/issues/issue-77365.rs:3:13: 3:21],
2:rustc        ],
2:rustc        13: [
2:rustc            i32,
2:rustc        ],
2:rustc    },
2:rustc    user_provided_types: {
2:rustc        4: Canonical {
2:rustc            max_universe: U0,
2:rustc            variables: [],
2:rustc            value: Ty(
2:rustc                std::vec::Vec<i32>,
2:rustc            ),
2:rustc        },
2:rustc        13: Canonical {
2:rustc            max_universe: U0,
2:rustc            variables: [
2:rustc                CanonicalVarInfo {
2:rustc                    kind: Ty(
2:rustc                        General(
2:rustc                            U0,
2:rustc                        ),
2:rustc                    ),
2:rustc                },
2:rustc                CanonicalVarInfo {
2:rustc                    kind: Ty(
2:rustc                        General(
2:rustc                            U0,
2:rustc                        ),
2:rustc                    ),
2:rustc                },
2:rustc            ],
2:rustc            value: TypeOf(
2:rustc                DefId(5:4622 ~ alloc[fd51]::vec::{impl#0}::new),
2:rustc                UserSubsts {
2:rustc                    substs: [
2:rustc                        ^0,
2:rustc                    ],
2:rustc                    user_self_ty: Some(
2:rustc                        UserSelfTy {
2:rustc                            impl_def_id: DefId(5:4620 ~ alloc[fd51]::vec::{impl#0}),
2:rustc                            self_ty: std::vec::Vec<^1>,
2:rustc                        },
2:rustc                    ),
2:rustc                },
2:rustc            ),
2:rustc        },
2:rustc    },
2:rustc    user_provided_sigs: {
2:rustc        DefId(0:4 ~ issue_77365[317d]::main::{closure#0}): Canonical {
2:rustc            max_universe: U0,
2:rustc            variables: [
2:rustc                CanonicalVarInfo {
2:rustc                    kind: Ty(
2:rustc                        General(
2:rustc                            U0,
2:rustc                        ),
2:rustc                    ),
2:rustc                },
2:rustc                CanonicalVarInfo {
2:rustc                    kind: Ty(
2:rustc                        General(
2:rustc                            U0,
2:rustc                        ),
2:rustc                    ),
2:rustc                },
2:rustc            ],
2:rustc            value: Binder(
2:rustc                ([^1_0]; c_variadic: false)->^1_1,
2:rustc            ),
2:rustc        },
2:rustc    },
2:rustc    adjustments: {
2:rustc        25: [
2:rustc            Borrow(Ref(ReErased, Mut { allow_two_phase_borrow: Yes })) -> &mut Vec<i32>,
2:rustc        ],
2:rustc    },
2:rustc    pat_binding_modes: {
2:rustc        1: BindByValue(
2:rustc            Mut,
2:rustc        ),
2:rustc        2: BindByValue(
2:rustc            Not,
2:rustc        ),
2:rustc    },
2:rustc    pat_adjustments: {},
2:rustc    upvar_capture_map: {},
2:rustc    closure_kind_origins: {},
2:rustc    liberated_fn_sigs: {
2:rustc        0: ([]; c_variadic: false)->(),
2:rustc        20: ([&i32]; c_variadic: false)->bool,
2:rustc    },
2:rustc    fru_field_types: {},
2:rustc    coercion_casts: {},
2:rustc    used_trait_imports: {},
2:rustc    tainted_by_errors: Some(
2:rustc        ErrorReported,
2:rustc    ),
2:rustc    concrete_opaque_types: {},
2:rustc    closure_captures: {},
2:rustc    generator_interior_types: [],
2:rustc}

@jyn514
Copy link
Member

jyn514 commented Oct 28, 2020

@camelid the previous error was because of #41078.

@matthiaskrgr
Copy link
Member

looks like another case of #75791

@jyn514 jyn514 closed this as completed Oct 28, 2020
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-closures Area: Closures (`|…| { … }`) A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions A-type-system Area: Type system C-bug Category: This is a bug. D-incorrect Diagnostics: A diagnostic that is giving misleading or incorrect information. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants