Ошибки компилятора PascalABC.Net

#2206

В его фиксе этот иногда_падающий файл теста и добавили. GCHandle только запрещает удалять объект. А память фиксирует именно GCHandleType.Pinned.


Да и кстати, раз уж подняли эту тему - пожалуйста, добавьте хоть предупреждение, для записи @a[...], где a - или массив, или строка. С текстом в этом духе:

Запись @a[...] приводит к утечкам памяти [и редким вылетам], её использование не рекомендуется. Используйте типы вроде GCHandle.

А то я хоть и написал об этом в общей справке OpenCL/OpenGL, но всё равно как то боязно, что народ будет насматриваться старых туториалов (а новых для OpenGL в PABC.Net в принципе нет), использовать @[] в своём коде, видеть что память утекает и думать что паскаль/модуль какой то не такой.

Мы устранили эту ошибку. Issue закрыта. Тесты проходят.

У вас странные предложения.

А что вы написали в справке OpenCL / OpenGL ?

Тесты проходят, но теперь это:

Стало неправдой. Вы не фиксируете память массивов записей с полем типа string, вам это GCHandle не позволит.


Какая разница, на сколько редко они могут падать - если всё равно когда то да упадут? И таки уже упало, хоть у меня и были более благоприятные для падения условия…
Вот я говорю - добавлять код с неопределённым поведение в тесты принципиально неправильно.


Там - только про утечку памяти. Случай с записями, содержащими string - вряд ли встретится в OpenCL и OpenGL. Подробнее - почитайте сами, страница справки Маршлинг >> Массивы.

1 лайк

Нет там никаких условий для падения. В примере память вообще нигде в цикле не выделяется. А проверяется многопоточная фиксация указателей

А при чём тут циклы? Я говорю что перемещается тело массива, потому что выражение @x[...] не делает никаких фиксаций.

Вообще странно вам это объяснять, кроме того что я это уже пару раз объяснил выше - вы же сами коммитили изменение, позволяющее @x[...] без фиксации.

Ну впрочем, если вы всю теорию мимо ушей пропускаете - вот вам практика:

Конечно, Debug.WriteLine - это хак, совершенно непонятно как работающий. Но он всё равно показывает, что массив может перемещаться в памяти, когда системе захочется.

И теперь вы опять игнорите, после того как я объяснил большинство о чём говорил по несколько раз, с разных сторон… Класс.

Тест удалять не будем. Он как раз и создавался, чтобы проверить работу программы, если фиксация указателя не возможна. Раньше этот код вообще падал ВСЕГДА.

Если хотите, можете его просто комментарить

Не обязательно полностью удалять тест. Достаточно проверять 2 вещи:

  1. @a[1] где a: array of record s: string end;.
  2. Работа с указателем на элемент массива, который фиксирует в @a[1].

И не обязательно проверять оба на общем массиве. Если только создавать указатель (и может проверять что он валидный, то есть >2**16, или сколько там) но не разъименовывать его - падать будет нечему.


А вообще - я нашёл Debug.WriteLine когда искал альтернативный способ фиксации массивов (потому что @a[] вызывает утечки памяти, а GCHandle - слишком гурман). И я таки достиг успеха.

В кратце - я могу дать специальную неуправляемую .dll (исходным кодом, конечно), для которой можно создать специальную external подпрограмму, фиксирующую любой массив в памяти.

Хотя для array of record s: string end; надо будет ещё пару вещей допротестить, ибо искал я этот способ для модулей OpenCL/OpenGL, где такие типы массивов вообще не ожидаются. Но на сколько я понял - мой способ полностью обходит все проверки GCHandle-а, поэтому тип массива не должен ни на что влиять.

И что, всё же, насчёт предупреждения про утечки памяти в @a[]? Это таки важно, много людей всё ещё пытаются использовать PABC.Net как FreePascal…

Может и хорошо, что так получается, быстрее отвыкнут )) Кому нужен FPC под .NET ?

“Система быстрее чинится, если её доломать” - это правда. И если бы @a[] выдавало ошибку - это правило давало бы прекрасный результат. Но, конечно, ошибка не вариант, потому что совместимость… Или по крайней мере я на неё не надеюсь.

Утечку памяти сложно заметить и ещё сложнее понять, что дело в криворукости программиста, а не компилятора.

Я предложил предупреждение по аналогии с for-var. То есть я предложил назвать неправильный код неправильным и не_современным, при этом не пытаясь всемирно запретить стрелять себе в ногу.

Попробовал срезы на C#/Python/PascalABCnet. Есть различие. В PABCnet менее гибко выходит.

Можно сделать так чтобы в последнем случае возвращалась пустая строка? В C#/Python возвращается пустая строка

1 лайк

PascalABC.NET - не C# и не Python тем более.

Используйте безопасные срезы: s?[:i] - и будет то что Вы хотите

Я тоже так хотел ответить, но по моему в паскале таки не логично работает. К примеру так возвращает пустую строку:

begin
  'abc'[:1].Length.Println;
end.

А с другой стороны уже оказывается нельзя.

И не контролируемые безопасные срезы это вообще плохо. В реальной программе обычно надо всё же выдавать ошибку при i>s.Length.

А если уже добавлять ещё 1 строчку для проверки - пропадает весь смысл использовать срезы. Лучше вообще что то типа .SubString, код и то проще будет (чем с проверкой).

2 лайка

Еще мысль для обсуждения: расширить ## и ### в конце 0: ##0 или ###0 …для нумерации срок с 0, чтобы инструкцию компилятору не писать

Для предложений отдельная тема.

Жуть какая. Пользуйтесь обычными срезами - и у вас будет маленький аналог SubString

Если честно, то более гибко. Хотите контроль - используете обычные срезы, хотите бесконтрольно, “как в Питон” - используйте безопасные срезы.

Экспериментируя с удаленной сборкой Паскаля на Гитхабе (на их VM WinServer 2016), обнаружил несколько проблем, которые мешают полноценной автоматизированной сборке:

  1. Из-за ошибки в настройке проектов CodeTemplatesPlugin.csproj и CodeTemplatesPlugin_40.csproj откомпилированная CodeTemplatesPlugin.dll не попадает в папку \bin. Разработчики этого не замечают скорее всего потому, что у них локально в \bin сохранилась еще “старая” копия. По этой же причине, я думаю, в последнее время в XP-версии регулярно ломается функционал шаблонов кода, т.к. в XP-дистрибутив все время попадает эта “старая” сборка, сконфигурированная для платформы .NET 4.7.1, а не 4.0.

  2. С библиотекой PABCRtl.dll вообще очень странная ситуация: в офиц. дистрибутиве её размер ~1.1 МБ, но у меня при компиляции получаются какие-то битые сборки размером 391…399 КБ. Из-за этого все тесты с PABCRtl в TestRunner падают (см. логи ниже). Причем я пробовал компилировать её и консольными компиляторами, и через IDE, и в debug, и в release режимах, и своим самосборным дистрибутивом (пока консольным), и в офиц. дистрибутиве последней версии (3.7.1-2677 от 05.09.2020) – результат такой же (отрицательный), небольшая разница проявляется только в размере из-за отладочной информации. Никаких ошибок компиляции или предупреждений при этом не возникает. Собирал все локально или удаленно только на Win10 x64 (c .NET 4.8). @admin У вас она всегда собирается нормально и на каком Windows?

Вот одна из таких “кривых” сборок: PABCRtl.dll (391 КБ)

Лог её компиляции через pabcnetc.exe (в интер. режиме с Debug=0, Rebuild=1)
Compiling assembly PABCRtl.pas...[0]CompilationStarting PABCRtl.pas...
[0]BeginCompileFile PABCRtl.pas...
[0]BeginParsingFile PABCRtl.pas...
[16]EndParsingFile PABCRtl.pas...
[0]SyntaxTreeConversion Standard...
[0]BeginCompileFile __RtlUtils.pas...
[0]BeginParsingFile __RtlUtils.pas...
[0]EndParsingFile __RtlUtils.pas...
[0]SyntaxTreeConversion Standard...
[0]ReadPCUFile PABCSystem.pcu...
[159]ReadDLL System.dll...
[2]ReadDLL mscorlib.dll...
[5]ReadDLL System.Core.dll...
[0]ReadDLL System.Numerics.dll...
[2]ReadPCUFile PABCExtensions.pcu...
[1]CompileInterface __RtlUtils.pas...
[1]CompileImplementation __RtlUtils.pas...
[0]EndCompileFile __RtlUtils.pas...
[1]ReadPCUFile __RunMode.pcu...
[1]ReadPCUFile __RedirectIOMode.pcu...
[0]ReadDLL System.Windows.Forms.dll...
[2]ReadPCUFile GraphWPFBase.pcu...
[0]ReadDLL PresentationFramework.dll...
[0]ReadDLL WindowsBase.dll...
[0]ReadDLL PresentationCore.dll...
[0]ReadPCUFile GraphWPF.pcu...
[0]ReadPCUFile Graph3D.pcu...
[0]ReadDLL System.Xml.dll...
[0]ReadDLL HelixToolkit.Wpf.dll...
[0]ReadPCUFile WPFObjects.pcu...
[0]ReadPCUFile ClientServer.pcu...
[0]ReadPCUFile Arrays.pcu...
[0]ReadPCUFile Collections.pcu...
[0]ReadPCUFile FormsABC.pcu...
[0]ReadDLL System.Drawing.dll...
[0]ReadPCUFile RBDMUtils.pcu...
[0]ReadPCUFile PT4TaskMakerNET.pcu...
[16]ReadPCUFile Timers.pcu...
[0]ReadPCUFile VCL.pcu...
[0]ReadPCUFile Utils.pcu...
[0]ReadPCUFile Sockets.pcu...
[0]ReadPCUFile GraphABCHelper.pcu...
[0]ReadPCUFile GraphABC.pcu...
[0]ReadPCUFile IniFile.pcu...
[0]ReadPCUFile RobotField.pcu...
[0]ReadPCUFile RobotTaskMaker.pcu...
[0]ReadPCUFile RobotZadan.pcu...
[0]ReadPCUFile Robot.pcu...
[16]ReadPCUFile PointRect.pcu...
[0]ReadPCUFile PointerTools.pcu...
[0]ReadPCUFile FilesOperations.pcu...
[0]ReadPCUFile Events.pcu...
[0]ReadPCUFile DMCollect.pcu...
[0]ReadPCUFile DrawManField.pcu...
[0]ReadPCUFile DMTaskMaker.pcu...
[0]ReadPCUFile DMZadan.pcu...
[0]ReadPCUFile Drawman.pcu...
[0]ReadPCUFile CRT.pcu...
[16]ReadPCUFile ABCObjects.pcu...
[0]ReadPCUFile ABCSprites.pcu...
[0]ReadPCUFile ABCHouse.pcu...
[0]ReadPCUFile ABCButtons.pcu...
[0]CompileInterface PABCRtl.pas...
[0]CompileImplementation PABCRtl.pas...
[0]EndCompileFile PABCRtl.pas...
[109]SavePCUFile __RtlUtils.pcu...
[16]SemanticTreeConversion Optimizer...
[0]CodeGeneration PABCRtl.dll...
[359]CompilationFinished PABCRtl.pas...
Ready.
Total: 1 files (0kb,48lines). Time: 736,8791ms

Падение ‘TestRunner.exe 5’ – с “кривой” сборкой PABCRtl.dll в GAC:

a) при вызове CompileAllRunTests(true):
**ERROR: Compilation of D:\a\pascalabcnet\pascalabcnet\TestSuite\06_ShortFunc.pas failed
Внутренняя ошибка компилятора в модуле Compiler.Compile[06_ShortFunc.pas] :'System.ArgumentNullException: Value cannot be null.
Parameter name: source
  at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
  at PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.CheckSpecialFunctionCall(List`1 sil, expressions_list exprs, location loc)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.find_operator(String name, expression_node left, expression_node right, location loc, Boolean no_search_in_extension_methods)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.AssignCheckAndConvert(assign _assign, addressed_expression& to, expression_node& from)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(assign _assign)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
  at PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
  at PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
  at PascalABCCompiler.Compiler.Compile() System.ArgumentNullException: Value cannot be null.
Parameter name: source
  at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
  at PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.CheckSpecialFunctionCall(List`1 sil, expressions_list exprs, location loc)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.find_operator(String name, expression_node left, expression_node right, location loc, Boolean no_search_in_extension_methods)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.AssignCheckAndConvert(assign _assign, addressed_expression& to, expression_node& from)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(assign _assign)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
  at PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
  at PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
  at PascalABCCompiler.Compiler.Compile()'
b) при вызове CompileAllCompilationTests('pabcrtl_tests', true)
***ERROR: Compilation of D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\pabcrtl_tests\ABC1.pas failed
Внутренняя ошибка компилятора в модуле Compiler.Compile[ABC1.pas] :'System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source
   в System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   в PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_method_call(method_call _method_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(method_call _method_call)
   в PascalABCCompiler.TreeConverter.returner.visit(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_call _procedure_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
   в PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
   в PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
   в PascalABCCompiler.Compiler.Compile() System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source
   в System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   в PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_method_call(method_call _method_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(method_call _method_call)
   в PascalABCCompiler.TreeConverter.returner.visit(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_call _procedure_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
   в PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
   в PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
   в PascalABCCompiler.Compiler.Compile()'

Кстати, еще заметил, что текст исключения всегда повторяется дважды!

  1. Более того, у меня PABCRtl-тесты пока не проходят (и локально, и удаленно) даже с официальной dll-кой из дистрибутива, но уже на совсем другом файле и с более “приличной” ошибкой (не внутренней ошибкой компилятора) при вызове только CompileAllRunTests(true). Все остальные тесты при этом идут без проблем!
Ошибки 'TestRunner.exe 5' -- с офиц. сборкой PABCRtl.dll в GAC
***ERROR: Compilation of D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\extensionmethods26.pas failed
Операция '+' не применима к типам array of char и string

***ERROR: Compilation of d:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\overloads7.pas failed
Операция '*' не применима к типам integer и procedure

***ERROR: Compilation of d:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\SliceArrGeneric.pas failed
Неизвестное имя 'SystemSlice'
  1. Еще одна проблема проявляется после загрузки репозитория с ГитХаба напрямую через zip-архив (либо при неточной настройке git-клиента под Windows). Все файлы в папке TestSuite\formatter_tests в этом случае будут иметь Unix-формат (LF-окончания строк), а в TestSuite\formatter_tests\output после TestRunner’а – уже CR/LF. Алгоритм их проверки c TestSuite\formatter_tests\should в CodeCompletion\Testing.cs это не учитывает и считает такие файлы не совпадающими, генерируя не предупреждение, а сразу ошибку тестов.
Ошибки тестов форматирования при LF-формате входных файлов
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\arrays2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\arrays4.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\assigntuple1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\attributes1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\autoproperty1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\autoproperty2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\bigint.pas, line 4
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case6.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case7.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case8.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\cast1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\class3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\delegates1.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\delegates5.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Demo1.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\diapasons2.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\enum2.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\extendedindexedproperty3.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\File48.pas, line 4
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\flagsattr1.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\for1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\For2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\foreach4.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\foreachvar1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\foreachvar2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\ForFor1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\formatstring1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\formatstring2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\generics1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\generics2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\If5.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if6.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if7.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if8.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\ifexpr1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\ifexpr2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\incdec2.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\lambdas_closures_13.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\LibForHaskell.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\lock1.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\MathForKumir.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\pattern1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1049.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1114.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1115.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1124.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1125.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1200.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1339.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1352.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program920.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program972.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program997.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property4.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property5.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property6.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\PT4.pas, line 27
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\PT4DemoTest.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\RBDMUtilsDemo.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\records3u.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\repeat1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\set1.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\set2.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\set5u.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\slice.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\slice2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\String9.pas, line 4
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try4.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try5.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try6.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try7.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try8.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try9.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typedconst2.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typedconst2u.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typeof.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typeof2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\uses1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\uses2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\uses3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\vartupledef.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Where.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\while1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\while4.pas

Зато благодаря этому удалось поймать один скрытый баг форматирования: если открыть в IDE, напр., файл TestSuite\formatter_tests\input\arrays4.pas в его LF-варианте и запустить форматирование более 1 раза, то добавится лишняя (2-ая) пустая строка после uses arrays4u;. При этом, даже если удалить эту лишнюю пустую строчку в редакторе, после переформатирования она появится снова! Странным образом этот баг не проявляется, если файл изначально был в CR/LF-формате (или сохранен в редакторе и переоткрыт, что автоматически конвертирует его окончания строк).

В тестах форматирования TestRunner этот баг (или связанный с ним) проявляется немного иначе: при обработке input-файлов в LF-варианте результаты сохраняются в \output уже в CR/LF-формате, но при этом в некоторых файлах (сейчас их 20 шт. – см. в логе выше файлы с ошибками в строках №3 или №4) одна из строк после форматирования остается с LF-окончанием, т.е. получается вообще мешанина из окончаний!

1 лайк