Skip to content

Possibly-uninitialized error message doesn't indicate where value isn't initialized #97956

Closed

Description

@jonhoo

Given the following code: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=d0d96c280bcde85e4d524178fefca741

let pkg;
if true {
    pkg = 1;
} else {
    // I forgot to initialize pkg!
}
drop(pkg);

The current output is:

error[[E0381]](https://doc.rust-lang.org/stable/error-index.html#E0381): use of possibly-uninitialized variable: `pkg`
 --> src/main.rs:8:10
  |
8 |     drop(pkg);
  |          ^^^ use of possibly-uninitialized `pkg`

Ideally the output should look like:

error[[E0381]](https://doc.rust-lang.org/stable/error-index.html#E0381): use of possibly-uninitialized variable: `pkg`
 --> src/main.rs:8:10
  |
8 |     drop(pkg);
  |          ^^^ use of possibly-uninitialized `pkg`
  |
  | hint: the value is not assigned in the branch starting on src/main.rs:5:
  |
5 |     } else {
  |

Because it can be difficult to figure out exactly which branch is failing to initialize a value, especially if it's not as simple as one if as above. For example, there may be a whole tree of conditionals between the let and the use, where only one sub-branch fails to initialize the variable, but spotting that amidst all the code isn't easy.

Activity

  1. added
    A-diagnosticsArea: Messages for errors, warnings, and lints
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Jun 10, 2022
  2. jonhoo commented on Jun 10, 2022

    @jonhoo
    ContributorAuthor

    Here's a more elaborate case simplified from where this originally hit me: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0a43b50d67a4b2f30f06b9b8f2efb7af

  3. rseymour commented on Jun 10, 2022

    @rseymour

    Would a successful fix for this step you through the locations more than blast out all of them? i.e. hint: the value is *first* not assigned in the branch starting on ...

  4. jonhoo commented on Jun 10, 2022

    @jonhoo
    ContributorAuthor

    It's a good question. I think you would actually want all of them at once, because you will have to fix each one anyway. One possible exception is if the value isn't set in any branch, in which case I think just pointing out that it needs to be set is sufficient.

  5. estebank commented on Jun 21, 2022

    @estebank
    Contributor

    Output with #98360:

    error[E0381]: used binding `pkg` isn't initialized in all conditions
     --> f43.rs:8:10
      |
    2 |     let pkg;
      |         --- binding declared here but left uninitialized
    ...
    5 |     } else {
      |      ------ `pkg` is uninitialized if this `else` arm is executed
    ...
    8 |     drop(pkg);
      |          ^^^ `pkg` used here but it isn't initialized in all conditions
    
  6. added 2 commits that reference this issue on Jun 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsT-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