Problems reported:

parser/error_recovery/issue_41265.crash:9:53: Unexpected token '>'.
class DND1 extends Object with M<dynamic> Function()> {
                                                    ^

beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(A, classOrMixinDeclaration)
    beginTypeVariables(<)
      beginMetadataStar(T)
      endMetadataStar(0)
      handleIdentifier(T, typeVariableDeclaration)
      beginTypeVariable(T)
        handleTypeVariablesDefined(T, 1)
        handleNoType(T)
      endTypeVariable(>, 0, null, null)
    endTypeVariables(<, >)
    beginClassDeclaration(class, null, A)
      handleNoType(>)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(mixin)
  beginMetadataStar(mixin)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(mixin)
    handleIdentifier(M, classOrMixinDeclaration)
    beginTypeVariables(<)
      beginMetadataStar(T)
      endMetadataStar(0)
      handleIdentifier(T, typeVariableDeclaration)
      beginTypeVariable(T)
        handleTypeVariablesDefined(T, 1)
        handleNoType(T)
      endTypeVariable(>, 0, null, null)
    endTypeVariables(<, >)
    beginMixinDeclaration(mixin, M)
      handleMixinOn(null, 0)
      handleClassOrMixinImplements(null, 0)
      handleMixinHeader(mixin)
      beginClassOrMixinBody(DeclarationKind.Mixin, {)
      endClassOrMixinBody(DeclarationKind.Mixin, 0, {, })
    endMixinDeclaration(mixin, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(DND1, classOrMixinDeclaration)
    handleNoTypeVariables(extends)
    beginClassDeclaration(class, null, DND1)
      handleIdentifier(Object, typeReference)
      handleNoTypeArguments(with)
      handleType(Object, null)
      handleClassExtends(extends, 1)
      beginTypeList(M)
        beginFunctionType(M)
          handleNoTypeVariables(()
          handleIdentifier(M, typeReference)
          beginTypeArguments(<)
            handleIdentifier(dynamic, typeReference)
            handleNoTypeArguments(>)
            handleType(dynamic, null)
          endTypeArguments(1, <, >)
          handleType(M, null)
          beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
        endFunctionType(Function, null)
      endTypeList(1)
      handleClassWithClause(with)
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {token: >}], >, >)
      handleNoType(>)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleRecoverClassHeader()
      beginClassOrMixinBody(DeclarationKind.Class, {)
      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration()
endCompilationUnit(3, )
