anchor.diff:  
     void test_genericMethods_basicDownwardInference() {
       checkFile(r'''
  +T f<S, T>(S s) => null;
  +main() {
  +  String x = f(42);
  +  String y = (f)(42);
  +}
  +''');
  +  }
  +
  +  void test_genericMethods_basicDownwardInference_comment() {
  +    checkFile(r'''
   /*=T*/ f/*<S, T>*/(/*=S*/ s) => null;
   main() {
     String x = f(42);
  
positive.code:     // Note: (f/*<dynamic>*/) is nort properly resulting in an instantiated
      // function type due to dartbug.com/25824.
      var mainUnit = checkFile('''
  dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
  var v = (f/*<dynamic>*/)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
  ''');
      var v = mainUnit.topLevelVariables[0];
      expect(v.name, 'v');
      expect(v.type.toString(), 'List<dynamic>');
    }
  
    void
        test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2() {
      var mainUnit = checkFile('''
  dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
  var v = (f)/*<dynamic>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
  ''');
      var v = mainUnit.topLevelVariables[0];
      expect(v.name, 'v');
      expect(v.type.toString(), 'List<dynamic>');
    }
  
    void test_unsafeBlockClosureInference_functionCall_explicitTypeParam() {
      var mainUnit = checkFile('''
  dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
  var v = f/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
  
negative.code:   void test_genericMethods_doNotInferInvalidOverrideOfGenericMethod() {
      checkFile('''
  class C {
  T m<T>(T x) => x;
  }
  class D extends C {
  /*error:INVALID_METHOD_OVERRIDE*/m(x) => x;
  }
  main() {
    int y = /*info:DYNAMIC_CAST*/new D()./*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/m<int>(42);
    print(y);
  }
  ''');
    }
  
    void test_genericMethods_doNotInferInvalidOverrideOfGenericMethod_comment() {
      checkFile('''
  class C {
  /*=T*/ m/*<T>*/(/*=T*/ x) => x;
  }
  class D extends C {
  