Problems reported:

parser/error_recovery/issue_26073:3:16: Expected 'Function' before this.
typedef c = foo(int x); // error.
               ^

parser/error_recovery/issue_26073:4:13: Expected 'Function' before this.
typedef d = (int x); // error.
            ^

parser/error_recovery/issue_26073:5:19: Expected 'Function' before this.
typedef e = foo<F>(int x); // error.
                  ^

parser/error_recovery/issue_26073:6:13: Expected 'Function' before this.
typedef f = <F>(int x); // error.
            ^

parser/error_recovery/issue_26073:7:31: Expected 'Function' before this.
typedef g = foo<F, G, H, I, J>(int x); // error.
                              ^

parser/error_recovery/issue_26073:8:13: Expected 'Function' before this.
typedef h = <F, G, H, I, J>(int x); // error.
            ^

parser/error_recovery/issue_26073:9:27: A typedef needs an explicit list of parameters.
typedef i = <F, G, H, I, J>; // error.
                          ^

parser/error_recovery/issue_26073:9:13: Expected 'Function' before this.
typedef i = <F, G, H, I, J>; // error.
            ^

beginCompilationUnit(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(a, typedefDeclaration)
      handleNoTypeVariables(=)
      beginFunctionType(foo)
        handleNoTypeVariables(()
        handleIdentifier(foo, typeReference)
        handleNoTypeArguments(Function)
        handleType(foo, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(b, typedefDeclaration)
      handleNoTypeVariables(=)
      beginFunctionType(Function)
        handleNoTypeVariables(()
        handleNoType(=)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(c, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], (, ()
      beginFunctionType(foo)
        handleNoTypeVariables(()
        handleIdentifier(foo, typeReference)
        handleNoTypeArguments(Function)
        handleType(foo, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(d, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], (, ()
      beginFunctionType(Function)
        handleNoTypeVariables(()
        handleNoType(=)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(e, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], (, ()
      beginFunctionType(foo)
        handleNoTypeVariables(()
        handleIdentifier(foo, typeReference)
        beginTypeArguments(<)
          handleIdentifier(F, typeReference)
          handleNoTypeArguments(>)
          handleType(F, null)
        endTypeArguments(1, <, >)
        handleType(foo, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(f, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], <, <)
      beginFunctionType(Function)
        beginTypeVariables(<)
          beginMetadataStar(F)
          endMetadataStar(0)
          handleIdentifier(F, typeVariableDeclaration)
          beginTypeVariable(F)
            handleTypeVariablesDefined(F, 1)
            handleNoType(F)
          endTypeVariable(>, 0, null, null)
        endTypeVariables(<, >)
        handleNoType(=)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(g, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], (, ()
      beginFunctionType(foo)
        handleNoTypeVariables(()
        handleIdentifier(foo, typeReference)
        beginTypeArguments(<)
          handleIdentifier(F, typeReference)
          handleNoTypeArguments(,)
          handleType(F, null)
          handleIdentifier(G, typeReference)
          handleNoTypeArguments(,)
          handleType(G, null)
          handleIdentifier(H, typeReference)
          handleNoTypeArguments(,)
          handleType(H, null)
          handleIdentifier(I, typeReference)
          handleNoTypeArguments(,)
          handleType(I, null)
          handleIdentifier(J, typeReference)
          handleNoTypeArguments(>)
          handleType(J, null)
        endTypeArguments(5, <, >)
        handleType(foo, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(h, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], <, <)
      beginFunctionType(Function)
        beginTypeVariables(<)
          beginMetadataStar(F)
          endMetadataStar(0)
          handleIdentifier(F, typeVariableDeclaration)
          beginTypeVariable(F)
            beginMetadataStar(G)
            endMetadataStar(0)
            handleIdentifier(G, typeVariableDeclaration)
            beginTypeVariable(G)
              beginMetadataStar(H)
              endMetadataStar(0)
              handleIdentifier(H, typeVariableDeclaration)
              beginTypeVariable(H)
                beginMetadataStar(I)
                endMetadataStar(0)
                handleIdentifier(I, typeVariableDeclaration)
                beginTypeVariable(I)
                  beginMetadataStar(J)
                  endMetadataStar(0)
                  handleIdentifier(J, typeVariableDeclaration)
                  beginTypeVariable(J)
                    handleTypeVariablesDefined(J, 5)
                    handleNoType(J)
                  endTypeVariable(>, 4, null, null)
                  handleNoType(I)
                endTypeVariable(,, 3, null, null)
                handleNoType(H)
              endTypeVariable(,, 2, null, null)
              handleNoType(G)
            endTypeVariable(,, 1, null, null)
            handleNoType(F)
          endTypeVariable(,, 0, null, null)
        endTypeVariables(<, >)
        handleNoType(=)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(int)
          endMetadataStar(0)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleIdentifier(x, formalParameterDeclaration)
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(i, typedefDeclaration)
      handleNoTypeVariables(=)
      handleRecoverableError(MissingTypedefParameters, >, >)
      handleRecoverableError(Message[ExpectedButGot, Expected 'Function' before this., null, {string: Function}], <, <)
      beginFunctionType(Function)
        beginTypeVariables(<)
          beginMetadataStar(F)
          endMetadataStar(0)
          handleIdentifier(F, typeVariableDeclaration)
          beginTypeVariable(F)
            beginMetadataStar(G)
            endMetadataStar(0)
            handleIdentifier(G, typeVariableDeclaration)
            beginTypeVariable(G)
              beginMetadataStar(H)
              endMetadataStar(0)
              handleIdentifier(H, typeVariableDeclaration)
              beginTypeVariable(H)
                beginMetadataStar(I)
                endMetadataStar(0)
                handleIdentifier(I, typeVariableDeclaration)
                beginTypeVariable(I)
                  beginMetadataStar(J)
                  endMetadataStar(0)
                  handleIdentifier(J, typeVariableDeclaration)
                  beginTypeVariable(J)
                    handleTypeVariablesDefined(J, 5)
                    handleNoType(J)
                  endTypeVariable(>, 4, null, null)
                  handleNoType(I)
                endTypeVariable(,, 3, null, null)
                handleNoType(H)
              endTypeVariable(,, 2, null, null)
              handleNoType(G)
            endTypeVariable(,, 1, null, null)
            handleNoType(F)
          endTypeVariable(,, 0, null, null)
        endTypeVariables(<, >)
        handleNoType(=)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
        endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(j, typedefDeclaration)
      handleNoTypeVariables(=)
      handleIdentifier(foo, typeReference)
      handleNoTypeArguments(;)
      handleType(foo, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(typedef)
  beginMetadataStar(typedef)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(k, typedefDeclaration)
      handleNoTypeVariables(=)
      handleIdentifier(List, typeReference)
      beginTypeArguments(<)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(>)
        handleType(int, null)
      endTypeArguments(1, <, >)
      handleType(List, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration()
endCompilationUnit(11, )
