anchor.diff:    if (raw1 != null && raw1 == raw2) {
       let typeArguments1 = $getGenericArgs($t1);
       let length = typeArguments1.length;
  -    if (typeArguments2.length == 0) {
  -      // t2 is the raw form of t1
  -      return typeArguments1;
  -    } else if (length == 0) {
  -      // t1 is raw, but t2 is not
  -      if (typeArguments2.every($_isTop)) return typeArguments2;
  -      return null;
  -    }
  -    if (length != typeArguments2.length) $assertFailed();
  +    if (length == 0 || length != typeArguments2.length) $assertFailed();
  +    // TODO(vsm): Remove this subtyping check if/when we eliminate the ability
  +    // to implement multiple versions of the same interface
  +    // (e.g., Foo<int>, Foo<String>).
       for (let i = 0; i < length; ++i) {
         let result =
             $_isSubtype(typeArguments1[i], typeArguments2[i], true);
  
positive.code:     return typeArguments1;
    }
  
    var result = $_extractTypes($t1.__proto__, $t2);
    if (result) return result;
  
    // Check mixin.
    let m1 = $getMixin($t1);
    if (m1 != null) {
      result = $_extractTypes(m1, $t2);
      if (result) return result;
    }
  
  
negative.code:   let getInterfaces = $getImplements($t1);
    if (getInterfaces) {
      for (let i1 of getInterfaces()) {
        result = $_extractTypes(i1, $t2, $typeArguments2);
        if (result) return result;
      }
    }
  