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:
Mike Fairhurst 2019-08-16 20:51:41 +00:00 committed by commit-bot@chromium.org
parent 29dc9313e6
commit 7c3ea0af6a
2 changed files with 11 additions and 12 deletions

View file

@ -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

View file

@ -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'),