anchor.diff:      return true;
     }
   
  -  bool _isNull(DartType type) =>
  -      type is InterfaceType &&
  -      identical(type.classNode, environment.coreTypes.nullClass);
  +  bool _isNull(DartType type) {
  +    // TODO(paulberry): would it be better to call this "_isBottom", and to have
  +    // it return `true` for both Null and bottom types?  Revisit this once
  +    // enough functionality is implemented that we can compare the behavior with
  +    // the old analyzer-based implementation.
  +    return type is InterfaceType &&
  +        identical(type.classNode, environment.coreTypes.nullClass);
  +  }
   
     bool _isTop(DartType type) =>
         type is DynamicType ||
  
positive.code: import 'package:kernel/ast.dart';
  
  /// Attempts to find a set of constraints for the given [typeParameters] under
  /// which [subtype] is a subtype of [supertype].  If such a set can be found, it
  /// is returned (as a map from type parameter to constraint).  If it can't,
  /// `null` is returned.
  Map<TypeParameter, TypeConstraint> subtypeMatch(
      TypeSchemaEnvironment environment,
      Iterable<TypeParameter> typeParameters,
  
negative.code:     // no constraints.
      if (_isTop(supertype)) return true;
      // `Null` is a subtype match for any type `Q` under no constraints.
      // Note that nullable types will change this.
      if (_isNull(subtype)) return true;
      // `FutureOr<P>` is a subtype match for `FutureOr<Q>` with respect to `L`
      // under constraints `C`:
  