[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 <johnniwinther@google.com>
Reviewed-by: Lasse Nielsen <lrn@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Chloe Stefantsova 2023-03-22 17:03:17 +00:00 committed by Commit Queue
parent 6872707aa6
commit 472968cda7
11 changed files with 96 additions and 1 deletions

View file

@ -304,6 +304,7 @@ frequency
frozen
fulfill
func
futornullable
futu
futures
fuzz

View file

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

View file

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

View file

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

View file

@ -0,0 +1,3 @@
import "dart:async";
void main() {}

View file

@ -0,0 +1,3 @@
import "dart:async";
void main() {}

View file

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

View file

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

View file

@ -0,0 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:async";
static method main() → void
;

View file

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

View file

@ -1130,7 +1130,7 @@ class IsFutureOrSubtypeOf extends TypeRelation<FutureOrType> {
@override
IsSubtypeOf isRecordRelated(RecordType s, FutureOrType t, Types types) {
// Rule 11.
return types.performNullabilityAwareMutualSubtypesCheck(
return types.performNullabilityAwareSubtypeCheck(
s, t.typeArgument.withDeclaredNullability(t.nullability));
}