mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 21:50:11 +00:00
Handle non-null iterable types in for ins
Change-Id: Ibc8332c70663d90fbb47a27f68d3ac28adce5a69 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113420 Reviewed-by: Paul Berry <paulberry@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
This commit is contained in:
parent
29dc9313e6
commit
7c3ea0af6a
|
@ -1540,8 +1540,7 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
|
|||
if (parts is ForEachPartsWithDeclaration) {
|
||||
_flowAnalysis.add(parts.loopVariable.declaredElement, assigned: true);
|
||||
}
|
||||
// TODO(mfairhurst): assert this is non-nullable
|
||||
parts.iterable?.accept(this);
|
||||
_handleAssignment(parts.iterable, destinationType: _notNullType);
|
||||
}
|
||||
|
||||
// The condition may fail/iterable may be empty, so the body gets a new
|
||||
|
|
|
@ -2691,15 +2691,14 @@ class C {
|
|||
}
|
||||
void test(List<C> l, C c1) {
|
||||
<int>[for (C _c in l/*check*/) c1.m()];
|
||||
<int>[for (C c2 in l) c2.m()];
|
||||
<int>[for (C c2 in <C>[]) c2.m()];
|
||||
}
|
||||
''');
|
||||
|
||||
// TODO(mfairhurst): enable this check
|
||||
//assertNullCheck(
|
||||
// checkExpression('l/*check*/'),
|
||||
// assertEdge(decoratedTypeAnnotation('List<C> l').node, never,
|
||||
// hard: true));
|
||||
assertNullCheck(
|
||||
checkExpression('l/*check*/'),
|
||||
assertEdge(decoratedTypeAnnotation('List<C> l').node, never,
|
||||
hard: true));
|
||||
assertNullCheck(checkExpression('c1.m'),
|
||||
assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
|
||||
assertNullCheck(checkExpression('c2.m'),
|
||||
|
@ -2712,7 +2711,7 @@ class C {
|
|||
void m() {}
|
||||
}
|
||||
void test(List<C> l, C c1, C c2) {
|
||||
for (C c3 in l) {
|
||||
for (C c3 in l/*check*/) {
|
||||
c1.m();
|
||||
c3.m();
|
||||
}
|
||||
|
@ -2721,9 +2720,10 @@ void test(List<C> l, C c1, C c2) {
|
|||
}
|
||||
''');
|
||||
|
||||
//TODO(mfairhurst): enable this check
|
||||
//assertNullCheck(checkExpression('l/*check*/'),
|
||||
// assertEdge(decoratedTypeAnnotation('List<C> l').node, never, hard: true));
|
||||
assertNullCheck(
|
||||
checkExpression('l/*check*/'),
|
||||
assertEdge(decoratedTypeAnnotation('List<C> l').node, never,
|
||||
hard: true));
|
||||
assertNullCheck(checkExpression('c1.m'),
|
||||
assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
|
||||
assertNullCheck(checkExpression('c2.m'),
|
||||
|
|
Loading…
Reference in a new issue