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:15: Expected ';' after this.
f() { m(T<R(<Z
              ^...

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

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)
      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: ;}], , )
        // WARNING: Reporting at eof for .
        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, )
