Skip to content

Commit 7d8d3bb

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Adjust nullability of FutureOrType after substitution
Bug: #48631 Change-Id: I329a70386d59425cf3f157dc4b6316649f8aa389 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/240049 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 3436650 commit 7d8d3bb

19 files changed

+377
-1
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:async';
6+
7+
FutureOr<T?> foo<T>(T t) {}
8+
9+
bar<S>(bool t, S s) {
10+
var x = [foo(s), s];
11+
}
12+
13+
main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
static method foo<T extends core::Object? = dynamic>(self::foo::T% t) → FutureOr<self::foo::T?> {}
8+
static method bar<S extends core::Object? = dynamic>(core::bool t, self::bar::S% s) → dynamic {
9+
core::List<FutureOr<self::bar::S?>?> x = <FutureOr<self::bar::S?>?>[self::foo<self::bar::S%>(s), s];
10+
}
11+
static method main() → dynamic {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
static method foo<T extends core::Object? = dynamic>(self::foo::T% t) → FutureOr<self::foo::T?> {}
8+
static method bar<S extends core::Object? = dynamic>(core::bool t, self::bar::S% s) → dynamic {
9+
core::List<FutureOr<self::bar::S?>?> x = core::_GrowableList::_literal2<FutureOr<self::bar::S?>?>(self::foo<self::bar::S%>(s), s);
10+
}
11+
static method main() → dynamic {}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'dart:async';
2+
3+
FutureOr<T?> foo<T>(T t) {}
4+
bar<S>(bool t, S s) {}
5+
main() {}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'dart:async';
2+
3+
FutureOr<T?> foo<T>(T t) {}
4+
bar<S>(bool t, S s) {}
5+
main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
static method foo<T extends core::Object? = dynamic>(self::foo::T% t) → FutureOr<self::foo::T?> {}
8+
static method bar<S extends core::Object? = dynamic>(core::bool t, self::bar::S% s) → dynamic {
9+
core::List<FutureOr<self::bar::S?>?> x = <FutureOr<self::bar::S?>?>[self::foo<self::bar::S%>(s), s];
10+
}
11+
static method main() → dynamic {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
static method foo<T extends core::Object? = dynamic>(self::foo::T% t) → FutureOr<self::foo::T?> {}
8+
static method bar<S extends core::Object? = dynamic>(core::bool t, self::bar::S% s) → dynamic {
9+
core::List<FutureOr<self::bar::S?>?> x = <FutureOr<self::bar::S?>?>[self::foo<self::bar::S%>(s), s];
10+
}
11+
static method main() → dynamic {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
static method foo<T extends core::Object? = dynamic>(self::foo::T% t) → FutureOr<self::foo::T?>
8+
;
9+
static method bar<S extends core::Object? = dynamic>(core::bool t, self::bar::S% s) → dynamic
10+
;
11+
static method main() → dynamic
12+
;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
static method foo<T extends core::Object? = dynamic>(self::foo::T% t) → FutureOr<self::foo::T?> {}
8+
static method bar<S extends core::Object? = dynamic>(core::bool t, self::bar::S% s) → dynamic {
9+
core::List<FutureOr<self::bar::S?>?> x = core::_GrowableList::_literal2<FutureOr<self::bar::S?>?>(self::foo<self::bar::S%>(s), s);
10+
}
11+
static method main() → dynamic {}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:async';
6+
7+
abstract class A {
8+
T foo<T>(B<T> b);
9+
}
10+
11+
class B<X> {
12+
B(X x);
13+
}
14+
15+
class C<Y> {
16+
final Bar<FutureOr<Y>, D<Y>> bar;
17+
18+
C(this.bar);
19+
}
20+
21+
abstract class D<W> implements A {}
22+
23+
typedef Bar<V, U extends A> = V Function(U);
24+
25+
final baz = C<int>((a) {
26+
return a.foo(B(Future.value(0)));
27+
});
28+
29+
main() {}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:async" as asy;
5+
6+
import "dart:async";
7+
8+
typedef Bar<V extends core::Object? = dynamic, contravariant U extends self::A> = (U) → V%;
9+
abstract class A extends core::Object {
10+
synthetic constructor •() → self::A
11+
: super core::Object::•()
12+
;
13+
abstract method foo<T extends core::Object? = dynamic>(self::B<self::A::foo::T%> b) → self::A::foo::T%;
14+
}
15+
class B<X extends core::Object? = dynamic> extends core::Object {
16+
constructor •(self::B::X% x) → self::B<self::B::X%>
17+
: super core::Object::•()
18+
;
19+
}
20+
class C<Y extends core::Object? = dynamic> extends core::Object {
21+
final field (self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar;
22+
constructor •((self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar) → self::C<self::C::Y%>
23+
: self::C::bar = bar, super core::Object::•()
24+
;
25+
}
26+
abstract class D<W extends core::Object? = dynamic> extends core::Object implements self::A {
27+
synthetic constructor •() → self::D<self::D::W%>
28+
: super core::Object::•()
29+
;
30+
}
31+
static final field self::C<core::int> baz = new self::C::•<core::int>((self::D<core::int> a) → FutureOr<core::int> {
32+
return a.{self::A::foo}<FutureOr<core::int>>(new self::B::•<FutureOr<core::int>>(asy::Future::value<core::int>(0))){(self::B<FutureOr<core::int>>) → FutureOr<core::int>};
33+
});
34+
static method main() → dynamic {}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:async" as asy;
5+
6+
import "dart:async";
7+
8+
typedef Bar<V extends core::Object? = dynamic, contravariant U extends self::A> = (U) → V%;
9+
abstract class A extends core::Object {
10+
synthetic constructor •() → self::A
11+
: super core::Object::•()
12+
;
13+
abstract method foo<T extends core::Object? = dynamic>(self::B<self::A::foo::T%> b) → self::A::foo::T%;
14+
}
15+
class B<X extends core::Object? = dynamic> extends core::Object {
16+
constructor •(self::B::X% x) → self::B<self::B::X%>
17+
: super core::Object::•()
18+
;
19+
}
20+
class C<Y extends core::Object? = dynamic> extends core::Object {
21+
final field (self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar;
22+
constructor •((self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar) → self::C<self::C::Y%>
23+
: self::C::bar = bar, super core::Object::•()
24+
;
25+
}
26+
abstract class D<W extends core::Object? = dynamic> extends core::Object implements self::A {
27+
synthetic constructor •() → self::D<self::D::W%>
28+
: super core::Object::•()
29+
;
30+
}
31+
static final field self::C<core::int> baz = new self::C::•<core::int>((self::D<core::int> a) → FutureOr<core::int> {
32+
return a.{self::A::foo}<FutureOr<core::int>>(new self::B::•<FutureOr<core::int>>(asy::Future::value<core::int>(0))){(self::B<FutureOr<core::int>>) → FutureOr<core::int>};
33+
});
34+
static method main() → dynamic {}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'dart:async';
2+
3+
abstract class A {
4+
T foo<T>(B<T> b);
5+
}
6+
7+
class B<X> {
8+
B(X x);
9+
}
10+
11+
class C<Y> {
12+
final Bar<FutureOr<Y>, D<Y>> bar;
13+
C(this.bar);
14+
}
15+
16+
abstract class D<W> implements A {}
17+
18+
typedef Bar<V, U extends A> = V Function(U);
19+
final baz = C<int>((a) {
20+
return a.foo(B(Future.value(0)));
21+
});
22+
main() {}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'dart:async';
2+
3+
abstract class A {
4+
T foo<T>(B<T> b);
5+
}
6+
7+
abstract class D<W> implements A {}
8+
9+
class B<X> {
10+
B(X x);
11+
}
12+
13+
class C<Y> {
14+
C(this.bar);
15+
final Bar<FutureOr<Y>, D<Y>> bar;
16+
}
17+
18+
final baz = C<int>((a) {
19+
return a.foo(B(Future.value(0)));
20+
});
21+
main() {}
22+
typedef Bar<V, U extends A> = V Function(U);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:async" as asy;
5+
6+
import "dart:async";
7+
8+
typedef Bar<V extends core::Object? = dynamic, contravariant U extends self::A> = (U) → V%;
9+
abstract class A extends core::Object {
10+
synthetic constructor •() → self::A
11+
: super core::Object::•()
12+
;
13+
abstract method foo<T extends core::Object? = dynamic>(self::B<self::A::foo::T%> b) → self::A::foo::T%;
14+
}
15+
class B<X extends core::Object? = dynamic> extends core::Object {
16+
constructor •(self::B::X% x) → self::B<self::B::X%>
17+
: super core::Object::•()
18+
;
19+
}
20+
class C<Y extends core::Object? = dynamic> extends core::Object {
21+
final field (self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar;
22+
constructor •((self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar) → self::C<self::C::Y%>
23+
: self::C::bar = bar, super core::Object::•()
24+
;
25+
}
26+
abstract class D<W extends core::Object? = dynamic> extends core::Object implements self::A {
27+
synthetic constructor •() → self::D<self::D::W%>
28+
: super core::Object::•()
29+
;
30+
}
31+
static final field self::C<core::int> baz = new self::C::•<core::int>((self::D<core::int> a) → FutureOr<core::int> {
32+
return a.{self::A::foo}<FutureOr<core::int>>(new self::B::•<FutureOr<core::int>>(asy::Future::value<core::int>(0))){(self::B<FutureOr<core::int>>) → FutureOr<core::int>};
33+
});
34+
static method main() → dynamic {}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:async" as asy;
5+
6+
import "dart:async";
7+
8+
typedef Bar<V extends core::Object? = dynamic, contravariant U extends self::A> = (U) → V%;
9+
abstract class A extends core::Object {
10+
synthetic constructor •() → self::A
11+
: super core::Object::•()
12+
;
13+
abstract method foo<T extends core::Object? = dynamic>(self::B<self::A::foo::T%> b) → self::A::foo::T%;
14+
}
15+
class B<X extends core::Object? = dynamic> extends core::Object {
16+
constructor •(self::B::X% x) → self::B<self::B::X%>
17+
: super core::Object::•()
18+
;
19+
}
20+
class C<Y extends core::Object? = dynamic> extends core::Object {
21+
final field (self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar;
22+
constructor •((self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar) → self::C<self::C::Y%>
23+
: self::C::bar = bar, super core::Object::•()
24+
;
25+
}
26+
abstract class D<W extends core::Object? = dynamic> extends core::Object implements self::A {
27+
synthetic constructor •() → self::D<self::D::W%>
28+
: super core::Object::•()
29+
;
30+
}
31+
static final field self::C<core::int> baz = new self::C::•<core::int>((self::D<core::int> a) → FutureOr<core::int> {
32+
return a.{self::A::foo}<FutureOr<core::int>>(new self::B::•<FutureOr<core::int>>(asy::Future::value<core::int>(0))){(self::B<FutureOr<core::int>>) → FutureOr<core::int>};
33+
});
34+
static method main() → dynamic {}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
import "dart:async";
6+
7+
typedef Bar<V extends core::Object? = dynamic, contravariant U extends self::A> = (U) → V%;
8+
abstract class A extends core::Object {
9+
synthetic constructor •() → self::A
10+
;
11+
abstract method foo<T extends core::Object? = dynamic>(self::B<self::A::foo::T%> b) → self::A::foo::T%;
12+
}
13+
class B<X extends core::Object? = dynamic> extends core::Object {
14+
constructor •(self::B::X% x) → self::B<self::B::X%>
15+
;
16+
}
17+
class C<Y extends core::Object? = dynamic> extends core::Object {
18+
final field (self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar;
19+
constructor •((self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar) → self::C<self::C::Y%>
20+
;
21+
}
22+
abstract class D<W extends core::Object? = dynamic> extends core::Object implements self::A {
23+
synthetic constructor •() → self::D<self::D::W%>
24+
;
25+
}
26+
static final field self::C<core::int> baz;
27+
static method main() → dynamic
28+
;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:async" as asy;
5+
6+
import "dart:async";
7+
8+
typedef Bar<V extends core::Object? = dynamic, contravariant U extends self::A> = (U) → V%;
9+
abstract class A extends core::Object {
10+
synthetic constructor •() → self::A
11+
: super core::Object::•()
12+
;
13+
abstract method foo<T extends core::Object? = dynamic>(self::B<self::A::foo::T%> b) → self::A::foo::T%;
14+
}
15+
class B<X extends core::Object? = dynamic> extends core::Object {
16+
constructor •(self::B::X% x) → self::B<self::B::X%>
17+
: super core::Object::•()
18+
;
19+
}
20+
class C<Y extends core::Object? = dynamic> extends core::Object {
21+
final field (self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar;
22+
constructor •((self::D<self::C::Y%>) → FutureOr<self::C::Y%>% bar) → self::C<self::C::Y%>
23+
: self::C::bar = bar, super core::Object::•()
24+
;
25+
}
26+
abstract class D<W extends core::Object? = dynamic> extends core::Object implements self::A {
27+
synthetic constructor •() → self::D<self::D::W%>
28+
: super core::Object::•()
29+
;
30+
}
31+
static final field self::C<core::int> baz = new self::C::•<core::int>((self::D<core::int> a) → FutureOr<core::int> {
32+
return a.{self::A::foo}<FutureOr<core::int>>(new self::B::•<FutureOr<core::int>>(asy::Future::value<core::int>(0))){(self::B<FutureOr<core::int>>) → FutureOr<core::int>};
33+
});
34+
static method main() → dynamic {}

0 commit comments

Comments
 (0)