anchor.diff:  
     bool _isInterfaceSubtypeOf(
         InterfaceType i1, InterfaceType i2, Set<Element> visited) {
  +    if (identical(i1, i2)) {
  +      return true;
  +    }
  +    
       // Guard recursive calls
       _GuardedSubtypeChecker<InterfaceType> guardedInterfaceSubtype = _guard(
           (DartType i1, DartType i2, Set<Element> visited) =>
               _isInterfaceSubtypeOf(i1, i2, visited));
  -
  -    if (i1 == i2) {
  -      return true;
  -    }
   
       if (i1.element == i2.element) {
         List<DartType> tArgs1 = i1.typeArguments;
  
positive.code: 
    bool _isSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
        {bool dynamicIsBottom: false}) {
      // Guard recursive calls
      _GuardedSubtypeChecker<DartType> guardedSubtype = _guard(_isSubtypeOf);
      _GuardedSubtypeChecker<DartType> guardedInferTypeParameter =
          _guard(_inferTypeParameterSubtypeOf);
      if (t1 == t2) {
        return true;
      }
  
      // The types are void, dynamic, bottom, interface types, function types,
      // and type parameters. We proceed by eliminating these different classes
  
negative.code: 
      // S <: T where S is a type variable
      //  T is not dynamic or object (handled above)
      //  True if T == S
      //  Or true if bound of S is S' and S' <: T
      if (t1 is TypeParameterType) {
        if (t1 == t2) {
          return true;
        }
        if (guardedInferTypeParameter(t1, t2, visited)) {
          return true;
        }
  