From 472968cda7e7153569416e65a6330445c3f6d972 Mon Sep 17 00:00:00 2001 From: Chloe Stefantsova Date: Wed, 22 Mar 2023 17:03:17 +0000 Subject: [PATCH] [cfe] Fix the subtyping case of FutureOr and RecordType Closes https://github.com/dart-lang/sdk/issues/51731 Part of https://github.com/dart-lang/sdk/issues/49713 Change-Id: Ie726f2f768df47fd00bd88af1f970ee3a86bf0a9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/290526 Reviewed-by: Johnni Winther Reviewed-by: Lasse Nielsen Commit-Queue: Chloe Stefantsova --- .../test/spell_checking_list_tests.txt | 1 + pkg/front_end/testcases/records/issue51731.dart | 11 +++++++++++ .../records/issue51731.dart.strong.expect | 12 ++++++++++++ .../issue51731.dart.strong.transformed.expect | 17 +++++++++++++++++ .../issue51731.dart.textual_outline.expect | 3 +++ ...ue51731.dart.textual_outline_modelled.expect | 3 +++ .../records/issue51731.dart.weak.expect | 12 ++++++++++++ .../records/issue51731.dart.weak.modular.expect | 12 ++++++++++++ .../records/issue51731.dart.weak.outline.expect | 7 +++++++ .../issue51731.dart.weak.transformed.expect | 17 +++++++++++++++++ pkg/kernel/lib/src/types.dart | 2 +- 11 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 pkg/front_end/testcases/records/issue51731.dart create mode 100644 pkg/front_end/testcases/records/issue51731.dart.strong.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.weak.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/records/issue51731.dart.weak.transformed.expect diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt index e8ff8f81739..6172b6e4a23 100644 --- a/pkg/front_end/test/spell_checking_list_tests.txt +++ b/pkg/front_end/test/spell_checking_list_tests.txt @@ -304,6 +304,7 @@ frequency frozen fulfill func +futornullable futu futures fuzz diff --git a/pkg/front_end/testcases/records/issue51731.dart b/pkg/front_end/testcases/records/issue51731.dart new file mode 100644 index 00000000000..a9e0b2ed6a8 --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2023, 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"; +void main() { + var o = (null, null, null, 42); + (int?, String?, bool?, int?) nullable = o; + FutureOr<(int?, String?, bool?, int?)> futornullable1 = nullable; + FutureOr<(int?, String?, bool?, int?)> futornullable2 = o; +} diff --git a/pkg/front_end/testcases/records/issue51731.dart.strong.expect b/pkg/front_end/testcases/records/issue51731.dart.strong.expect new file mode 100644 index 00000000000..4bb1c54d3aa --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.strong.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +import "dart:async"; + +static method main() → void { + (Null, Null, Null, core::int) o = (null, null, null, 42); + (core::int?, core::String?, core::bool?, core::int?) nullable = o; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable1 = nullable; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable2 = o; +} diff --git a/pkg/front_end/testcases/records/issue51731.dart.strong.transformed.expect b/pkg/front_end/testcases/records/issue51731.dart.strong.transformed.expect new file mode 100644 index 00000000000..dbea4b3a295 --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.strong.transformed.expect @@ -0,0 +1,17 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +import "dart:async"; + +static method main() → void { + (Null, Null, Null, core::int) o = (null, null, null, 42); + (core::int?, core::String?, core::bool?, core::int?) nullable = o; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable1 = nullable; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable2 = o; +} + + +Extra constant evaluation status: +Evaluated: RecordLiteral @ org-dartlang-testcase:///issue51731.dart:7:11 -> RecordConstant(const (null, null, null, 42)) +Extra constant evaluation: evaluated: 4, effectively constant: 1 diff --git a/pkg/front_end/testcases/records/issue51731.dart.textual_outline.expect b/pkg/front_end/testcases/records/issue51731.dart.textual_outline.expect new file mode 100644 index 00000000000..513b8a87010 --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.textual_outline.expect @@ -0,0 +1,3 @@ +import "dart:async"; + +void main() {} diff --git a/pkg/front_end/testcases/records/issue51731.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/records/issue51731.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..513b8a87010 --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +import "dart:async"; + +void main() {} diff --git a/pkg/front_end/testcases/records/issue51731.dart.weak.expect b/pkg/front_end/testcases/records/issue51731.dart.weak.expect new file mode 100644 index 00000000000..4bb1c54d3aa --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.weak.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +import "dart:async"; + +static method main() → void { + (Null, Null, Null, core::int) o = (null, null, null, 42); + (core::int?, core::String?, core::bool?, core::int?) nullable = o; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable1 = nullable; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable2 = o; +} diff --git a/pkg/front_end/testcases/records/issue51731.dart.weak.modular.expect b/pkg/front_end/testcases/records/issue51731.dart.weak.modular.expect new file mode 100644 index 00000000000..4bb1c54d3aa --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.weak.modular.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +import "dart:async"; + +static method main() → void { + (Null, Null, Null, core::int) o = (null, null, null, 42); + (core::int?, core::String?, core::bool?, core::int?) nullable = o; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable1 = nullable; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable2 = o; +} diff --git a/pkg/front_end/testcases/records/issue51731.dart.weak.outline.expect b/pkg/front_end/testcases/records/issue51731.dart.weak.outline.expect new file mode 100644 index 00000000000..52cd852e1b2 --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.weak.outline.expect @@ -0,0 +1,7 @@ +library /*isNonNullableByDefault*/; +import self as self; + +import "dart:async"; + +static method main() → void + ; diff --git a/pkg/front_end/testcases/records/issue51731.dart.weak.transformed.expect b/pkg/front_end/testcases/records/issue51731.dart.weak.transformed.expect new file mode 100644 index 00000000000..dbea4b3a295 --- /dev/null +++ b/pkg/front_end/testcases/records/issue51731.dart.weak.transformed.expect @@ -0,0 +1,17 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +import "dart:async"; + +static method main() → void { + (Null, Null, Null, core::int) o = (null, null, null, 42); + (core::int?, core::String?, core::bool?, core::int?) nullable = o; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable1 = nullable; + FutureOr<(core::int?, core::String?, core::bool?, core::int?)>futornullable2 = o; +} + + +Extra constant evaluation status: +Evaluated: RecordLiteral @ org-dartlang-testcase:///issue51731.dart:7:11 -> RecordConstant(const (null, null, null, 42)) +Extra constant evaluation: evaluated: 4, effectively constant: 1 diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart index 39c9b33b92c..295b7c87eab 100644 --- a/pkg/kernel/lib/src/types.dart +++ b/pkg/kernel/lib/src/types.dart @@ -1130,7 +1130,7 @@ class IsFutureOrSubtypeOf extends TypeRelation { @override IsSubtypeOf isRecordRelated(RecordType s, FutureOrType t, Types types) { // Rule 11. - return types.performNullabilityAwareMutualSubtypesCheck( + return types.performNullabilityAwareSubtypeCheck( s, t.typeArgument.withDeclaredNullability(t.nullability)); }