anchor.diff:        assert(node.receiver != null);
   
         ConcreteType result = inferrer.emptyConcreteType;
  -      void augmentResult(BaseType baseReceiverType, Element member) {
  +      void augmentResult(ClassElement baseReceiverType, Element member) {
           if (member.isField()) {
             result = inferrer.union(result, analyzeFieldRead(member));
           } else if (member.isAbstractField()){
  
positive.code:           return analyzeFieldRead(element);
          } else {
            assert(element.isGetter());
            ClassBaseType baseReceiverType =
                new ClassBaseType(element.enclosingElement);
            return analyzeGetterSend(baseReceiverType, element);
          }
        }
      } else {
  
negative.code: class ConcreteTypeCartesianProduct
      extends Iterable<ConcreteTypesEnvironment> {
    final ConcreteTypesInferrer inferrer;
    final ClassElement typeOfThis;
    final Map<Element, ConcreteType> concreteTypes;
    ConcreteTypeCartesianProduct(this.inferrer, this.typeOfThis,
                                 this.concreteTypes);
    Iterator get iterator => concreteTypes.isEmpty
        ? [new ConcreteTypesEnvironment(inferrer, new ClassBaseType(typeOfThis))]
              .iterator
        : new ConcreteTypeCartesianProductIterator(inferrer,
              new ClassBaseType(typeOfThis), concreteTypes);
    String toString() {
      List<ConcreteTypesEnvironment> cartesianProduct =
          new List<ConcreteTypesEnvironment>.from(this);
  