flang компилятор доказывает, что программа не зациклится 0.6.2 GitHub

Бывают конфликты слияния, которых git не показывает

Текст сливается чисто, а смысл расходится. Три случая за день:

  1. Рантаймы Java, C# и Rust перестали собираться вообще. Помощники были написаны под прежний вид списка (expectList отдавала массив), а объявление списка суммой сделало список значением. 106 красных, и ни одного намёка при слиянии.
  2. Дублирующееся имя функции. «Найти замену» объявлена и в self/defunc.flang, и в self/proof-initial.flang — корпус не грузился вовсе.
  3. Пример перестал проверять то, ради чего написан — см. checks-that-stopped-comparing.

Правило, выведенное из этого. После каждого слияния цели — собирать её рантайм, а не только гонять тесты печати. Тест печати сравнивает текст и остаётся зелёным, когда собранный код уже мёртв.

Второе правило. После слияния перемерять всё, что является измерением, а не памятью: списки охвата, числа в прозе, ведомость. Они устаревают молча.

Сборка work/svodka3 прибавила ещё четыре случая, и все четыре — того же рода

  1. Модуль перестал загружаться от одной стрелки. types.mjs импортировал ADDRESSED_ACTIONS, которого в новом conc.mjs больше нет — его место занял ACTION_PROCESS_FIELD. Текст слился чисто, SyntaxError при первом импорте.
  2. Два цикла-генератора слились в один. У первого пропала закрывающая скобка, второй начался внутри него: flang/src/proof.mjs не грузился вовсе. Такое же место нашлось второй раз в том же файле через две ветки.
  3. Мёртвая строка перед проверкой. В объединить (types.mjs) осталось return ДО согласования масштабов — правило «умножение масштабы складывает» перестало краснеть, оставшись в файле целиком.
  4. Эталон отстал от свидетеля. Ветка сверялась со свидетелем, каким он был на её базе; в дереве свидетель вырос. Сверка эталона дала 10 красных из 26, и ни один не был виден до прогона. Это повторилось ЧЕТЫРЕЖДЫ — с правилом умножения, с типом вес, со вторым случаем умножения и с фактами о встроенных формах, — и ещё дважды у эталона РАЗБОРА: слово свойство пришло в побайтовый корпус с одной ветки, а продукции к нему не было ни на одной, и восьмое действие породить разошлось со свидетелем на 1109-м байте одного файла.

Третье правило, выведенное из седьмого случая. Эталон, слитый с ветки, обязан быть прогнан СРАЗУ — до следующего слияния. Его сверка называет число сравненного, и падение читается однозначно: «свидетель уехал, догоняй». Прогнав после трёх слияний, чинишь три расхождения разом, не зная, какое чьё.

Четвёртое правило, и оно про корпус. Ветка, добавляющая программу в каталог побайтовой неподвижной точки, обязана прогнать эталон разбора В ТОЙ ЖЕ работе. Слово, которого эталон не знает, ломает сверку не у автора, а у сборщика — и ломает её через сутки, когда причину искать уже негде.

Связано: checks-that-stopped-comparing, a-removal-must-turn-a-test-red