mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 05:07:52 +00:00
4775fa3857
In certain error recovery situations, it's possible for code to refer to a variable whose declaration has been lost by error recovery mechanisms. To prevent flow analysis from crashing when this happened, it assumed that any reference to a variable whose declaration had not yet been seen was valid, and implicitly added that variable to the flow analysis state. This created a subtle problem: if a function contained a closure that declared (and assigned to) a local variable, at the time the closure was entered, flow analysis would get confused and temporarily put the variable in the "write captured" state (because it hadn't yet seen the declaration of the variable, so it didn't realize it was local to the closure). Then, a boolean variable might capture that incorrect state. Later, upon seeing the declaration of the variable, it would fix the incorrect state, however it was possible that a later reference to the boolean variable would re-vivify the old incorrect state. This is precisely what happened in issue #47991. This CL fixes the problem by giving flow analysis the ability to detect, at the time the FlowAnalysis object is constructed, all variables that are referred to but not explicitly declared, and add them to the flow analysis state. This allows it to safely assume that any variables that are not yet in the flow analysis state haven't been declared yet (and hence can be ignored), so no variable is every erroneously placed into the "write captured" state. Fixes #47991. Bug: https://github.com/dart-lang/sdk/issues/47991 Change-Id: I8d84fab96fad063f1d3ade3b8b9a6e9af88c3737 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/227361 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Paul Berry <paulberry@google.com> |
||
---|---|---|
.. | ||
attempt_reinitialization_runtime_test.dart | ||
attempt_reinitialization_test.dart | ||
field_initialization_order_test.dart | ||
field_override_test.dart | ||
for_in_variable_test.dart | ||
initialize_inside_closure_test.dart | ||
initializer_instance_reference_test.dart | ||
is_not_const_test.dart | ||
param_test.dart | ||
super_field_set_test.dart | ||
syntax_test.dart | ||
used_in_try_test.dart | ||
variable_assignment_runtime_test.dart | ||
variable_assignment_test.dart |