[vm/aot/tfa] Avoid using null as an initial value of non-nullable and late variables without initializer

TEST=pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-nnbd-linux-release-x64-try
Change-Id: Ie6b3bdf7069e7d6389e3a729f23b9e1912a4eed2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/285061
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Alexander Markov 2023-03-07 20:31:14 +00:00 committed by Commit Queue
parent a92274cae8
commit 55ddbe534a
3 changed files with 30 additions and 2 deletions

View file

@ -2253,8 +2253,11 @@ class SummaryCollector extends RecursiveResultVisitor<TypeExpr?> {
TypeExpr? visitVariableDeclaration(VariableDeclaration node) {
node.annotations.forEach(_visit);
final initializer = node.initializer;
final TypeExpr initialValue =
initializer == null ? _nullType : _visit(initializer);
final TypeExpr initialValue = initializer == null
? ((node.type.nullability == Nullability.nonNullable || node.isLate)
? const EmptyType()
: _nullType)
: _visit(initializer);
_declareVariable(node, initialValue);
return null;
}

View file

@ -40,4 +40,22 @@ int loop2(int x) {
return x;
}
int nonNullableWithoutInitializer(bool cond) {
int x;
if (cond) {
x = 5;
} else if (true) {
x = 7;
}
return x;
}
int? lateWithoutInitializer(bool cond) {
late int? x;
if (cond) {
x = 5;
}
return x;
}
main() {}

View file

@ -40,6 +40,13 @@ t3* = _Call [dart.core::num.<] (i_0, _T (dart.core::_Smi, 5))
t4* = _Call [dart.core::num.+] (_T (dart.core::int)+?, _T (dart.core::_Smi, 10))
x_0 = _Join [dart.core::int] (%x, t4)
RESULT: x_0
------------ nonNullableWithoutInitializer ------------
%cond = _Parameter #0 [_T (dart.core::bool)+?]
x_0 = _Join [dart.core::int] (_T (dart.core::_Smi, 5), _T (dart.core::_Smi, 7))
RESULT: x_0
------------ lateWithoutInitializer ------------
%cond = _Parameter #0 [_T (dart.core::bool)+?]
RESULT: _T (dart.core::_Smi, 5)
------------ main ------------
RESULT: _T {}?