Problems reported:

parser/patterns/patternVariableDeclarationStatement_disallowsConst:2:11: A record literal with exactly one positional field requires a trailing comma.
  const (_) = x;
          ^

beginCompilationUnit(f)
  beginMetadataStar(f)
  endMetadataStar(0)
  beginTopLevelMember(f)
    beginTopLevelMethod(, null, null)
      handleNoType()
      handleIdentifier(f, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(x)
        endMetadataStar(0)
        beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
          handleNoType(()
          handleIdentifier(x, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginConstLiteral(()
          beginParenthesizedExpressionOrRecordLiteral(()
            handleIdentifier(_, expression)
            handleNoTypeArguments())
            handleNoArguments())
            handleSend(_, _)
            handlePositionalRecordField(_)
            handleRecoverableError(RecordLiteralOnePositionalFieldNoTrailingComma, ), ))
          endRecordLiteral((, 1, const)
        endConstLiteral())
        handleIdentifier(x, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(x, x)
        handleAssignmentExpression(=, x)
        handleExpressionStatement(const, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(f, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
