Skip to content

Confusing error suggests giving a type to an unrelated variable #77982

Closed
@WaffleLapkin

Description

@WaffleLapkin

I tried this code:

use std::collections::HashMap;

fn what() {
    let descr = String::new();
    let mut opts = HashMap::new();
    let opt = String::new();
    
    // To fix the error, `as_ref` should be replaced with `as_str`
    if let None = opts.get(opt.as_ref()) {
        opts.insert(opt, ());
    }
}

(playground)

I expected to see this happen: error pointing to opt.as_ref()

Instead, this happened: error points to descr which is unrelated to the error

error[E0283]: type annotations needed for `String`
 --> src/lib.rs:8:24
  |
4 |     let descr = String::new();
  |         ----- consider giving `descr` a type
...
8 |     if let None = opts.get(opt.as_ref()) {
  |                        ^^^ cannot infer type for struct `String`
  |
  = note: cannot satisfy `String: Borrow<_>`

Meta

Tested with rustc 1.47.0 (18bf6b4f0 2020-10-07) and rustc 1.49.0-nightly (2020-10-14 e160e5cb80652bc2afe7)

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-inferenceArea: Type inferenceA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`C-bugCategory: This is a bug.D-incorrectDiagnostics: A diagnostic that is giving misleading or incorrect information.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions