-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Possibly-uninitialized error message doesn't indicate where value isn't initialized #97956
Comments
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 |
Would a successful fix for this step you through the locations more than blast out all of them? i.e. |
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. |
Output with #98360:
|
On partial uninit error point at where we need init When a binding is declared without a value, borrowck verifies that all codepaths have *one* assignment to them to initialize them fully. If there are any cases where a condition can be met that leaves the binding uninitialized or we attempt to initialize a field of an uninitialized binding, we emit E0381. We now look at all the statements that initialize the binding, and use them to explore branching code paths that *don't* and point at them. If we find *no* potential places where an assignment to the binding might be missing, we display the spans of all the existing initializers to provide some context. Fix rust-lang#97956.
On partial uninit error point at where we need init When a binding is declared without a value, borrowck verifies that all codepaths have *one* assignment to them to initialize them fully. If there are any cases where a condition can be met that leaves the binding uninitialized or we attempt to initialize a field of an uninitialized binding, we emit E0381. We now look at all the statements that initialize the binding, and use them to explore branching code paths that *don't* and point at them. If we find *no* potential places where an assignment to the binding might be missing, we display the spans of all the existing initializers to provide some context. Fix rust-lang#97956.
Given the following code: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=d0d96c280bcde85e4d524178fefca741
The current output is:
Ideally the output should look like:
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 thelet
and the use, where only one sub-branch fails to initialize the variable, but spotting that amidst all the code isn't easy.The text was updated successfully, but these errors were encountered: