Problems reported:

parser/record/record_type_02:2:26: Record type named fields list cannot be empty.
  (int, int, {/*missing*/}) record1 = (1, 2);
                         ^

parser/record/record_type_02:3:22: Record type fields list cannot contain only one element without a named field.
  (int /* missing */ ) record2 = (1);
                     ^

parser/record/record_type_02:5:15: Record type fields list cannot be empty.
  (/*missing*/) record4 = ();
              ^

parser/record/record_type_02:5:28: Expected an identifier, but got ')'.
  (/*missing*/) record4 = ();
                           ^

beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null, null)
      handleVoidKeyword(void)
      handleIdentifier(foo, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(()
        endMetadataStar(0)
        beginRecordType(()
          beginRecordTypeEntry()
            beginMetadataStar(int)
            endMetadataStar(0)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(,)
            handleType(int, null)
            handleNoName(,)
          endRecordTypeEntry()
          beginRecordTypeEntry()
            beginMetadataStar(int)
            endMetadataStar(0)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(,)
            handleType(int, null)
            handleNoName(,)
          endRecordTypeEntry()
          beginRecordTypeNamedFields({)
            handleRecoverableError(EmptyRecordTypeNamedFieldsList, }, })
          endRecordTypeNamedFields(0, {)
        endRecordType((, null, 3)
        beginVariablesDeclaration(record1, null, null)
          handleIdentifier(record1, localVariableDeclaration)
          beginInitializedIdentifier(record1)
            beginVariableInitializer(=)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleLiteralInt(1)
                handleLiteralInt(2)
              endRecordLiteral((, 2)
            endVariableInitializer(=)
          endInitializedIdentifier(record1)
        endVariablesDeclaration(1, ;)
        beginMetadataStar(()
        endMetadataStar(0)
        beginRecordType(()
          beginRecordTypeEntry()
            beginMetadataStar(int)
            endMetadataStar(0)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments())
            handleType(int, null)
            handleNoName())
          endRecordTypeEntry()
          handleRecoverableError(OnlyOneRecordTypeFieldsList, ), ))
        endRecordType((, null, 1)
        beginVariablesDeclaration(record2, null, null)
          handleIdentifier(record2, localVariableDeclaration)
          beginInitializedIdentifier(record2)
            beginVariableInitializer(=)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleLiteralInt(1)
              endParenthesizedExpression(()
            endVariableInitializer(=)
          endInitializedIdentifier(record2)
        endVariablesDeclaration(1, ;)
        beginMetadataStar(()
        endMetadataStar(0)
        beginRecordType(()
          beginRecordTypeNamedFields({)
            beginRecordTypeEntry()
              beginMetadataStar(int)
              endMetadataStar(0)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(ok)
              handleType(int, null)
              handleIdentifier(ok, recordFieldDeclaration)
            endRecordTypeEntry()
          endRecordTypeNamedFields(1, {)
        endRecordType((, null, 1)
        beginVariablesDeclaration(record3, null, null)
          handleIdentifier(record3, localVariableDeclaration)
          beginInitializedIdentifier(record3)
            beginVariableInitializer(=)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleIdentifier(ok, namedRecordFieldReference)
                handleLiteralInt(1)
                handleNamedRecordField(:)
              endRecordLiteral((, 1)
            endVariableInitializer(=)
          endInitializedIdentifier(record3)
        endVariablesDeclaration(1, ;)
        beginMetadataStar(()
        endMetadataStar(0)
        beginRecordType(()
          handleRecoverableError(EmptyRecordTypeFieldsList, ), ))
        endRecordType((, null, 0)
        beginVariablesDeclaration(record4, null, null)
          handleIdentifier(record4, localVariableDeclaration)
          beginInitializedIdentifier(record4)
            beginVariableInitializer(=)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
                handleIdentifier(, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(, ))
              endParenthesizedExpression(()
            endVariableInitializer(=)
          endInitializedIdentifier(record4)
        endVariablesDeclaration(1, ;)
      endBlockFunctionBody(4, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
