Problems reported:

parser/error_recovery/issue_38415.crash:1:15: Expected '[' before this.
f() { m(T<R(<Z
              ^...

WARNING: Reporting at eof --- see below for details.

parser/error_recovery/issue_38415.crash:1:14: Expected ';' after this.
f() { m(T<R(<Z
             ^

parser/error_recovery/issue_38415.crash:1:12: Can't find ')' to match '('.
f() { m(T<R(<Z
           ^

parser/error_recovery/issue_38415.crash:1:10: Can't find '>' to match '<'.
f() { m(T<R(<Z
         ^

parser/error_recovery/issue_38415.crash:1:8: Can't find ')' to match '('.
f() { m(T<R(<Z
       ^

parser/error_recovery/issue_38415.crash:1:5: Can't find '}' to match '{'.
f() { m(T<R(<Z
    ^

beginCompilationUnit(f)
  beginMetadataStar(f)
  endMetadataStar(0)
  beginTopLevelMember(f)
    beginTopLevelMethod(UnmatchedToken({), null, null)
      handleNoType(UnmatchedToken({))
      handleIdentifier(f, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleIdentifier(m, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleIdentifier(T, expression)
          handleNoTypeArguments(<)
          handleNoArguments(<)
          handleSend(T, <)
          beginBinaryExpression(<)
            handleIdentifier(R, expression)
            handleNoTypeArguments(()
            beginArguments(()
              beginTypeArguments(<)
                handleIdentifier(Z, typeReference)
                handleNoTypeArguments())
                handleType(Z, null)
              endTypeArguments(1, <, >)
              handleRecoverableError(Message[ExpectedButGot, Expected '[' before this., null, {string: [}], , )
              // WARNING: Reporting at eof for .
              handleLiteralList(0, [, null, ])
            endArguments(1, (, ))
            handleSend(R, })
          endBinaryExpression(<)
        endArguments(1, (, ))
        handleSend(m, })
        handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], Z, Z)
        handleExpressionStatement(;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(f, null, })
  endTopLevelDeclaration()
  handleErrorToken(UnmatchedToken(())
  handleRecoverableError(Message[UnmatchedToken, Can't find ')' to match '('., null, {string: ), lexeme: (}], UnmatchedToken((), UnmatchedToken(())
  handleErrorToken(UnmatchedToken(<))
  handleRecoverableError(Message[UnmatchedToken, Can't find '>' to match '<'., null, {string: >, lexeme: <}], UnmatchedToken(<), UnmatchedToken(<))
  handleErrorToken(UnmatchedToken(())
  handleRecoverableError(Message[UnmatchedToken, Can't find ')' to match '('., null, {string: ), lexeme: (}], UnmatchedToken((), UnmatchedToken(())
  handleErrorToken(UnmatchedToken({))
  handleRecoverableError(Message[UnmatchedToken, Can't find '}' to match '{'., null, {string: }, lexeme: {}], UnmatchedToken({), UnmatchedToken({))
endCompilationUnit(1, )
