anchor.diff:      var rti = Rti.allocate();
       Rti._setKind(rti, Rti.kindFutureOr);
       Rti._setPrimary(rti, baseType);
  +    Rti._setCanonicalRecipe(rti, canonicalRecipe);
  +    return _finishRti(universe, rti);
  +  }
  +
  +  static Rti _lookupGenericFunctionParameterRti(universe, int index) {
  +    String canonicalRecipe = _canonicalRecipeOfGenericFunctionParameter(index);
  +    var cache = evalCache(universe);
  +    var probe = _cacheGet(cache, canonicalRecipe);
  +    if (probe != null) return _castToRti(probe);
  +    return _createGenericFunctionParameterRti(universe, index, canonicalRecipe);
  +  }
  +
  +  static Rti _createGenericFunctionParameterRti(
  +      universe, int index, String canonicalRecipe) {
  +    var rti = Rti.allocate();
  +    Rti._setKind(rti, Rti.kindGenericFunctionParameter);
  +    Rti._setPrimary(rti, index);
       Rti._setCanonicalRecipe(rti, canonicalRecipe);
       return _finishRti(universe, rti);
     }
  
positive.code:     Rti._setKind(rti, Rti.kindFunction);
      Rti._setPrimary(rti, returnType);
      Rti._setRest(rti, parameters);
      Rti._setCanonicalRecipe(rti, canonicalRecipe);
      return _finishRti(universe, rti);
    }
  
negative.code:   static String _canonicalRecipeOfFutureOr(Rti baseType) =>
        Rti._getCanonicalRecipe(baseType) + Recipe.wrapFutureOrString;
  
    static String _canonicalRecipeOfGenericFunctionParameter(int index) =>
        '$index' + Recipe.genericFunctionTypeParameterIndexString;
  
    static Rti _lookupDynamicRti(universe) {
      return _lookupTerminalRti(
          universe, Rti.kindDynamic, _canonicalRecipeOfDynamic());
  