Skip to content

Commit a447dbc

Browse files
MichaelRFairhurstcommit-bot@chromium.org
authored andcommitted
[nnbd_migration] fix hard edges on ??= assignments
Change-Id: Ie2731e723147189591302e411d1dcb7540e09b23 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119762 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
1 parent 836d9bf commit a447dbc

File tree

2 files changed

+5
-2
lines changed

2 files changed

+5
-2
lines changed

pkg/nnbd_migration/lib/src/edge_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1658,7 +1658,8 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
16581658
_checkAssignment(expressionChecksOrigin,
16591659
source: sourceType,
16601660
destination: destinationType,
1661-
hard: _postDominatedLocals.isReferenceInScope(expression));
1661+
hard: questionAssignNode == null &&
1662+
_postDominatedLocals.isReferenceInScope(expression));
16621663
}
16631664
if (questionAssignNode != null) {
16641665
// a ??= b is only nullable if both a and b are nullable.

pkg/nnbd_migration/test/edge_builder_test.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,9 +806,11 @@ void Function(int) f(void Function(int) x, void Function(int) y) => x ??= y;
806806
List<int> f(List<int> x, List<int> y) => x ??= y;
807807
''');
808808
var xNullable = decoratedTypeAnnotation('List<int> x').node;
809+
var yNullable = decoratedTypeAnnotation('List<int> y').node;
809810
var xElementNullable = decoratedTypeAnnotation('int> x').node;
810811
var yElementNullable = decoratedTypeAnnotation('int> y').node;
811812
var returnElementNullable = decoratedTypeAnnotation('int> f').node;
813+
assertEdge(yNullable, xNullable, hard: false, guards: [xNullable]);
812814
assertEdge(yElementNullable, xElementNullable,
813815
hard: false, guards: [xNullable]);
814816
assertEdge(xElementNullable, returnElementNullable, hard: false);
@@ -822,7 +824,7 @@ int f(int x, int y) => (x ??= y);
822824
var xNullable = decoratedTypeAnnotation('int x').node;
823825
var returnNullable = decoratedTypeAnnotation('int f').node;
824826
var glbNode = decoratedExpressionType('(x ??= y)').node;
825-
assertEdge(yNullable, xNullable, hard: true, guards: [xNullable]);
827+
assertEdge(yNullable, xNullable, hard: false, guards: [xNullable]);
826828
assertEdge(yNullable, glbNode, hard: false, guards: [xNullable]);
827829
assertEdge(glbNode, xNullable, hard: false);
828830
assertEdge(glbNode, yNullable, hard: false);

0 commit comments

Comments
 (0)