From 35421c5d1a1ba92132f7e8774bd2b563d1680960 Mon Sep 17 00:00:00 2001 From: Mayank Patke Date: Tue, 21 Sep 2021 01:59:45 +0000 Subject: [PATCH] [dart2js] Update MethodTypeInformation to narrow the return type of _lateReadCheck. Change-Id: If76a5b34cfd9da9721bfa0d8642b018a4af131dd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/213901 Reviewed-by: Stephen Adams Commit-Queue: Mayank Patke --- .../lib/src/inferrer/type_graph_nodes.dart | 3 ++ pkg/compiler/test/codegen/late_test.dart | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 pkg/compiler/test/codegen/late_test.dart diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart index 02dbfd25263..52572670739 100644 --- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart +++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart @@ -625,6 +625,9 @@ class MethodTypeInformation extends MemberTypeInformation { @override AbstractValue _potentiallyNarrowType( AbstractValue mask, InferrerEngine inferrer) { + if (inferrer.commonElements.isLateReadCheck(_method)) { + mask = inferrer.abstractValueDomain.excludeLateSentinel(mask); + } return _narrowType(inferrer.closedWorld, mask, _type.returnType); } diff --git a/pkg/compiler/test/codegen/late_test.dart b/pkg/compiler/test/codegen/late_test.dart new file mode 100644 index 00000000000..0810efdc149 --- /dev/null +++ b/pkg/compiler/test/codegen/late_test.dart @@ -0,0 +1,36 @@ +// Copyright (c) 2021, 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. + +import 'dart:async'; +import 'package:async_helper/async_helper.dart'; +import '../helpers/compiler_helper.dart'; + +const String TEST = r""" +class Foo { + late int x; +} + +int foo() { + final foo = Foo(); + foo.x = 40; + return foo.x + 2; + // present: '+ 2' + // absent: 'add' +} +"""; + +Future check(String test) { + return compile(test, + entry: 'foo', + check: checkerForAbsentPresent(test), + disableTypeInference: false, + disableInlining: false, + soundNullSafety: true); +} + +void main() { + asyncTest(() async { + await check(TEST); + }); +}