Проверка, живущая внутри одной команды, — это класс дефектов, и он всплыл трижды
Список проверок языка обязан лежать в ОДНОМ месте, которое зовут все команды. Каждый раз, когда очередная проверка заводилась внутри flang check, а не в общей checkProgram, получалось одно и то же: check отвечал «негодно», а emit в тот же миг печатал ту же программу в целевой язык и уходил с нулём.
Случаи, все три измерены прогоном на дереве:
- Надзор.
flang/conc/examples/supervision.flangбез блоканадзор «Цех»давалcheckс кодом 1 иFLANG_UNCOVERED_FAILURE, аemit --target go— код 0 и 80 155 байт Go, которые собираются и запускаются. - Словарь функтора. Четыре словаря — целый и три испорченных по одной строке — давали
checkс кодом 0 на всех четырёх: проверка была написана и не звалась из рабочего пути ни разу. - Примеры. Файл на девять строк с
ожидается 5при результате 4 давалcheck→valid: 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