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

Проверка, живущая внутри одной команды, — это класс дефектов, и он всплыл трижды

Список проверок языка обязан лежать в ОДНОМ месте, которое зовут все команды. Каждый раз, когда очередная проверка заводилась внутри flang check, а не в общей checkProgram, получалось одно и то же: check отвечал «негодно», а emit в тот же миг печатал ту же программу в целевой язык и уходил с нулём.

Случаи, все три измерены прогоном на дереве:

  1. Надзор. flang/conc/examples/supervision.flang без блока надзор «Цех» давал check с кодом 1 и FLANG_UNCOVERED_FAILURE, а emit --target go — код 0 и 80 155 байт Go, которые собираются и запускаются.
  2. Словарь функтора. Четыре словаря — целый и три испорченных по одной строке — давали check с кодом 0 на всех четырёх: проверка была написана и не звалась из рабочего пути ни разу.
  3. Примеры. Файл на девять строк с ожидается 5 при результате 4 давал checkvalid: true и код 0, test → код 1, а emit --target c — код 0 и 46 937 байт C. Программа с заведомо ложным примером печаталась в цель.

Признак, по которому четвёртый случай виден заранее. Проверка написана, но её единственный вызов стоит внутри тела команды (commandCheck, commandTest), а не в общем месте. Найти такие можно грепом: имя функции проверки встречается в flang/bin/flang.mjs ровно один раз и не в списке externalChecks/ checkProgram. Проверка в общем месте достаётся всем командам даром; проверка в команде достаётся ровно ей.

Почему это важнее, чем кажется. Обещания языка — «тотальная», надзор, типы, пример — держатся ровно на одном: программа, которая их не держит, НЕ СОБИРАЕТСЯ. Проверка, до которой не доходит генератор кода, обещания не несёт вовсе: автор увидит красное только если сам позовёт check, а сборка соберёт.

Чем подтверждено. Ветка work/primery, 19 августа 2026. Улика по примерам снята прогоном до правки на flang/bin/flang.mjs из ствола 440ca5ac. Проверка, которая краснеет при возврате дефекта, — flang/test/cli-check-primery.test.mjs: снятие правки с flang/bin/flang.mjs роняет 4 пробы из 6.

Чем ограничено. Про команды, работающие с программой целиком. run и facts считают одну функцию и проверяют вход отдельной границей — их этот довод не касается.

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