dart-sdk/tests/language/final
Paul Berry 4775fa3857 Flow analysis: ensure that not-yet-declared variables aren't marked as captured.
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>
2022-01-11 15:42:04 +00:00
..
attempt_reinitialization_runtime_test.dart
attempt_reinitialization_test.dart [CFE] Better error messages for class initialization errors 2020-09-09 11:37:47 +00:00
field_initialization_order_test.dart
field_override_test.dart
for_in_variable_test.dart
initialize_inside_closure_test.dart Flow analysis: ensure that not-yet-declared variables aren't marked as captured. 2022-01-11 15:42:04 +00:00
initializer_instance_reference_test.dart
is_not_const_test.dart
param_test.dart
super_field_set_test.dart
syntax_test.dart Issue 43100. Verify local variable reads for null safety. 2020-08-20 15:50:50 +00:00
used_in_try_test.dart
variable_assignment_runtime_test.dart
variable_assignment_test.dart