| Index: pkg/analyzer/lib/src/generated/type_system.dart
|
| diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
|
| index 1e1d1824caf386948df9cb9b1832c51cb8801a16..50eca45ae4bced7437c0fac9e76124fda427b720 100644
|
| --- a/pkg/analyzer/lib/src/generated/type_system.dart
|
| +++ b/pkg/analyzer/lib/src/generated/type_system.dart
|
| @@ -30,7 +30,7 @@ bool _isTop(DartType t, {bool dynamicIsBottom: false}) {
|
| if (t.isDartAsyncFutureOr) {
|
| return _isTop((t as InterfaceType).typeArguments[0]);
|
| }
|
| - return (t.isDynamic && !dynamicIsBottom) || t.isObject;
|
| + return (t.isDynamic && !dynamicIsBottom) || t.isObject || t.isVoid;
|
| }
|
|
|
| typedef bool _GuardedSubtypeChecker<T>(T t1, T t2, Set<Element> visited);
|
| @@ -136,17 +136,6 @@ class StrongTypeSystemImpl extends TypeSystem {
|
| return type1;
|
| }
|
|
|
| - // Treat void as top-like for GLB. This only comes into play with the
|
| - // return types of two functions whose GLB is being taken. We allow a
|
| - // non-void-returning function to subtype a void-returning one, so match
|
| - // that logic here by treating the non-void arm as the subtype for GLB.
|
| - if (type1.isVoid) {
|
| - return type2;
|
| - }
|
| - if (type2.isVoid) {
|
| - return type1;
|
| - }
|
| -
|
| // Function types have structural GLB.
|
| if (type1 is FunctionType && type2 is FunctionType) {
|
| return _functionGreatestLowerBound(type1, type2);
|
| @@ -889,16 +878,6 @@ class StrongTypeSystemImpl extends TypeSystem {
|
| return false;
|
| }
|
|
|
| - // Void only appears as the return type of a function, and we handle it
|
| - // directly in the function subtype rules. We should not get to a point
|
| - // where we're doing a subtype test on a "bare" void, but just in case we
|
| - // do, handle it safely.
|
| - // TODO(rnystrom): Determine how this can ever be reached. If it can't,
|
| - // remove it.
|
| - if (t1.isVoid || t2.isVoid) {
|
| - return t1.isVoid && t2.isVoid;
|
| - }
|
| -
|
| // We've eliminated void, dynamic, bottom, type parameters, and FutureOr.
|
| // The only cases are the combinations of interface type and function type.
|
|
|
| @@ -1036,14 +1015,6 @@ abstract class TypeSystem {
|
| _isBottom(type1, dynamicIsBottom: dynamicIsBottom)) {
|
| return type2;
|
| }
|
| - // The least upper bound of void and any type T != dynamic is void.
|
| - if (type1.isVoid) {
|
| - return type1;
|
| - }
|
| - if (type2.isVoid) {
|
| - return type2;
|
| - }
|
| -
|
| if (type1 is TypeParameterType || type2 is TypeParameterType) {
|
| return _typeParameterLeastUpperBound(type1, type2);
|
| }
|
|
|