Skip to content

Commit 7704cc9

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Fix flow analysis of a late initializer that is an assignment expression
Fixes dart-lang#43621. Bug: dart-lang#43621 Change-Id: I5847e34fba9d892085dd8e388f6d96912c46eb5a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165682 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Paul Berry <paulberry@google.com>
1 parent d73c2b0 commit 7704cc9

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// doesn't execute immediately, so it may refer to other late variables that
77
// aren't assigned yet.
88

9+
void use(Object? x) {}
10+
911
eagerInitializerRefersToLateVar() {
1012
late int x;
1113
int y = /*unassigned*/ x;
@@ -17,3 +19,9 @@ lateInitializerRefersToLateVar() {
1719
late int y = x;
1820
x = 0;
1921
}
22+
23+
lateInitializerIsAssignment() {
24+
late int y;
25+
late int z1 = y = 3;
26+
use(y);
27+
}

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2408,11 +2408,12 @@ class BodyBuilder extends ScopeListener<JumpTarget>
24082408
assert(assignmentOperator.stringValue == "=");
24092409
AssignedVariablesNodeInfo<VariableDeclaration> assignedVariablesInfo;
24102410
bool isLate = (currentLocalVariableModifiers & lateMask) != 0;
2411+
Expression initializer = popForValue();
24112412
if (isLate) {
24122413
assignedVariablesInfo = typeInferrer?.assignedVariables
24132414
?.deferNode(isClosureOrLateVariableInitializer: true);
24142415
}
2415-
pushNewLocalVariable(popForValue(), equalsToken: assignmentOperator);
2416+
pushNewLocalVariable(initializer, equalsToken: assignmentOperator);
24162417
if (isLate) {
24172418
VariableDeclaration node = peek();
24182419
// This is matched by the call to [beginNode] in

0 commit comments

Comments
 (0)