diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart index f1714649e07..ad55e732e32 100644 --- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart +++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart @@ -2817,6 +2817,7 @@ class SummaryCollector extends RecursiveResultVisitor { final variable = node.variable; variable.annotations.forEach(_visitAnnotation); final initializer = variable.initializer; + final savedCondition = _currentCondition; final TypeExpr initialValue = initializer == null ? ((variable.type.nullability == Nullability.nonNullable || variable.isLate) @@ -2824,6 +2825,11 @@ class SummaryCollector extends RecursiveResultVisitor { : _nullType) : _visit(initializer); _declareVariable(variable, initialValue); + if (variable.isLate) { + // Restore condition as initializer of a late variable + // is not evaluated immediately. + _currentCondition = savedCondition; + } return null; } diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_63478.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_63478.dart new file mode 100644 index 00000000000..96ff6dd079c --- /dev/null +++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_63478.dart @@ -0,0 +1,24 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Regression test for https://github.com/dart-lang/sdk/issues/63478. +// Verifies that initializer of a late variable doesn't affect +// subsequent statements. + +void test1() { + late var x = throw "error"; + print("reachable"); +} + +Never sayNever() => throw 'Never'; + +void test2() { + late Never y = sayNever(); + print("reachable"); +} + +void main() { + test1(); + test2(); +} diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_63478.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_63478.dart.expect new file mode 100644 index 00000000000..980722e091e --- /dev/null +++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_63478.dart.expect @@ -0,0 +1,30 @@ +library #lib; +import self as self; +import "dart:core" as core; + + +[@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] +static method test1() → void { + function #x#initializer() → Never + return throw "error"; + late Never x = [@vm.inferred-type.metadata=? (receiver not int)] #x#initializer(){() → Never}; + core::print("reachable"); +} + +[@vm.inferred-return-type.metadata=!] +static method sayNever() → Never + return throw "Never"; + +[@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] +static method test2() → void { + function #y#initializer() → Never + return self::sayNever(); + late Never y = [@vm.inferred-type.metadata=? (receiver not int)] #y#initializer(){() → Never}; + core::print("reachable"); +} + +[@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] +static method main() → void { + self::test1(); + self::test2(); +}