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

Справочник отказов

Когда компилятор отвергает программу, каждая строка ошибки начинается с кода:

$ flang check docs/examples/diagnostics/type.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_TYPE в файле docs/examples/diagnostics/type.flang, строка 6, столбец 3: функция «Удвоить» объявлена как число, а тело даёт строка
docs/examples/diagnostics/type.flang: не проверено — замечаний 1
$ echo $?
1

В строке — код, файл, строка и столбец и что не так. Эта страница переводит каждый код в то, что он значит и что с ним делать. Коды сгруппированы по стадии, которая их сообщает: сначала разбор, потом имена, типы, завершаемость и доказательства.

Коды возврата flang check: 0 — ошибок нет; 1 — найдены ошибки; 2 — кривой вызов (неизвестный ключ, нет файла); 3 — с --proof гарантия не доказана (с --proof --strict — всё, что не «доказано всё»); 4 — часть проверок не запускалась (--fast). Полная таблица для всех команд — в Справочнике команд.

Слова на этой странице: гарантия — строка обеспечивает (postcondition); prover — часть компилятора, которая доказывает гарантии для всех входов, в выводе он называется «ядро»; unit-тест — пример.

Три ловушки, которые стоят дня

Прочтите их, прежде чем искать свой код. В каждой ошибка видна не там, где сделана.

Гарантия, которая зовёт функцию своего модуля, ломает каждый модуль, который ввозит его списком

Сам по себе модуль проверяется чисто. Падает модуль, который его ввозит.

модуль «Core»

тотальная функция «Двойка»
  принимает н: число
  возвращает число
  н умножить на 2

тотальная функция «Учтено»
  принимает н: число
  возвращает число
  обеспечивает «не меньше двойки» результат не меньше («Двойка» от н)
  («Двойка» от н) плюс 1
модуль «Import»
использует «Core» только «Учтено»

тотальная функция «Проба»
  принимает н: число
  возвращает число
  «Учтено» от н
$ flang check docs/examples/diagnostics/core.flang
модуль «Core»: функций 2, из них с доказанным завершением 2; типов 0
docs/examples/diagnostics/core.flang: проверено — разбор, типы, завершаемость, ядро и примеры; замечаний нет
$ flang check docs/examples/diagnostics/import.flang
модуль «Import»: функций 2, из них с доказанным завершением 0; типов 0; файлов вместе с импортами 2
без доказанного завершения: «Учтено» «Проба»
место указано строкой и столбцом, но без файла: вместе с импортами проверено файлов 2, а диагностика компилятора имени файла не несёт
FLANG_UNKNOWN_NAME, строка 12, столбец 4: неизвестная функция «Двойка»
FLANG_UNKNOWN_NAME, строка 11, столбец 56: неизвестная функция «Двойка»
FLANG_NOT_TOTAL, строка 12, столбец 4: тотальная функция «Учтено» вызывает неизвестную функцию «Двойка»: завершение доказать нельзя
docs/examples/diagnostics/import.flang: не проверено — замечаний 3
$ echo $?
1

Ввоз только «Учтено» приносит одно имя. И тело, и гарантия «Учтено» зовут «Двойка», которой у ввозящего модуля нет. Столбец 56 указывает внутрь гарантии. Номера строк — из ввезённого файла, а файл не назван, потому что проверялись два файла вместе.

Чинится одним из трёх способов:

СпособКак
ввезти и помощникаиспользует «Core» только «Учтено», «Двойка»
ввезти модуль целикомиспользует «Core»
убрать вызов из гарантиисказать то же арифметикой: результат не меньше (н умножить на 2)

flang check прошёл — не значит, что гарантии доказаны

flang check без ключей проверяет разбор, типы, завершаемость и unit-тесты. Гарантия, которую он не может ни доказать, ни опровергнуть, не делает проверку красной. Гарантия «не меньше двойки» выше не доказана: без --proof файл проходит с кодом 0, с --proof тот же файл выходит с кодом 3.

Чтобы увидеть, что доказано, попросите отчёт о доказательствах:

flang check docs/examples/diagnostics/core.flang --proof
  постусловие «не меньше двойки» функции «Учтено» — объявлено, не доказано: ни теоремы, ни примеров. Его считает рантайм после каждого возврата — на тех входах, которые придут
…
docs/examples/diagnostics/core.flang: НЕ ПРОВЕРЕНО — утверждений 1: доказано 0, условно 0, сетка 0, объявлено, не доказано 1, отвергнуто 0, нарушено 0; законов на сетке 0, на веру 0 — код возврата 3

Как читать итог каждой гарантии: «доказано» — доказано для всех входов; «сетка N» — проверено только на ваших N примерах, это не доказательство; «объявлено, не доказано» — объявлена, и нет ни доказательства, ни примеров. В CI берите flang check --proof --strict: он выходит с 0, только когда доказано всё.

Вторая ловушка в том же выводе: пока стоит ошибка FLANG_UNKNOWN_NAME, функция теряет и доказанное завершение, и её гарантии не доказывает никто. Сначала чините неизвестные имена.

FLANG_BOUND_ON_NAN: в типе число живёт NaN, а NaN не упорядочен

Самая частая неожиданность. Гарантия выглядит очевидно верной, а prover отвечает контрпримером.

модуль «Probe»

тотальная функция «Прибавить один»
  принимает н: число
  возвращает число
  обеспечивает «результат больше довода» результат больше н
  н плюс 1
$ flang check docs/examples/diagnostics/nan.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_BOUND_ON_NAN в файле docs/examples/diagnostics/nan.flang, строка 6, столбец 3: постусловие «результат больше довода» функции «Прибавить один» ЛОЖНО, и контрпример назван: «н» объявлен типом «число», а «не число» живёт в этом типе и стоит ВНЕ ПОРЯДКА — оно не больше и не меньше ничего, включая самоё себя. Тело собрано только из арифметики над «н», а всякая арифметическая операция «не число» переносит, значит результат есть «не число», и сравнение с ним ложно. Позовите «Прибавить один» от (0 делить на 0) — рантайм ответит FLANG_PROPERTY. Чинится тремя способами: объявить вход отрезком («неотрицательное», «целое») — тогда «не число» не втащить вовсе; поставить предусловие — за него платит вызывающий; либо оговорить границу, и ядро оговорку читает: обеспечьте «не ((н минус н) равен 0) или (…)»
docs/examples/diagnostics/nan.flang: не проверено — замечаний 1
$ echo $?
1

Причина: тип число — число с плавающей точкой, и в нём есть NaN («не число»). Любая арифметика над NaN даёт NaN, а любое сравнение с NaN ложно. Значит, «результат больше довода» для NaN неверно.

СпособЧто писатьКто платит
сузить тип аргументапринимает н: неотрицательное или целоеникто: NaN не попадёт
поставить предусловиетребует «вход есть число» (н минус н) равен 0вызывающий
исключить NaN в самой гарантииобеспечивает «…» не ((н минус н) равен 0) или (результат больше н)никто

(н минус н) равен 0 ложно ровно тогда, когда н — NaN.

Разбор

КодЧто значитЧто делать
FLANG_LEXлексер не смог прочесть токен: незакрытая кавычка, чужой знакзакрыть кавычку, убрать знак
FLANG_PARSEтокены в порядке, конструкция — нетсмотреть строку и столбец: обычно нет ветки иначе или ключевое слово стоит вместо имени
модуль «Probe»

тотальная функция «Удвоить»
  принимает н: число
  возвращает число
  если н больше 0 то н умножить на 2
$ flang check docs/examples/diagnostics/parse.flang
FLANG_PARSE в файле docs/examples/diagnostics/parse.flang, строка 7, столбец 1: у 'если' нет ветки 'иначе'
docs/examples/diagnostics/parse.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/lex.flang
FLANG_LEX в файле docs/examples/diagnostics/lex.flang, строка 5, столбец 3: не закрыта кавычка
docs/examples/diagnostics/lex.flang: не проверено — замечаний 1
$ echo $?
1

если … то … — выражение, поэтому иначе у него обязательно.

Имена и ввоз

КодЧто значитЧто делать
FLANG_UNKNOWN_NAMEимя не определено: нет такой функции или переменнойобъявить, ввезти модуль или исправить написание
FLANG_AMBIGUOUS_NAMEдва ввоза приносят одно имяубрать один ввоз или сузить его через только
FLANG_BAD_NAMEимя записано не так, как пишутся именапереименовать: имена функций — в ёлочках, параметры — простыми словами
FLANG_NAME_TAKENимя занято другим объявлениемвыбрать другое
FLANG_DUPLICATE_NAMEодно имя объявлено дважды: в одном месте либо в двух модулях одной программы — в том числе когда тёзку-помощника ввезённой функции прячет список толькоубрать второе объявление, вписать помощника в только или переименовать
FLANG_IMPORT_NOT_FOUNDввозимый модуль не найденпроверить имя модуля и путь в из "…"
FLANG_IMPORT_CYCLEмодули ввозят друг друга по кругувынести общее в третий модуль
FLANG_IMPORT_AMBIGUOUSодно имя приходит из двух модулейсузить ввоз через только
FLANG_IMPORT_NAMEв списке только есть то, чего модуль не объявляетсверить список с объявлениями модуля
модуль «Probe»

тотальная функция «Удвоить»
  принимает н: число
  возвращает число
  «Утроить» от н
$ flang check docs/examples/diagnostics/unknown.flang
модуль «Probe»: функций 1, из них с доказанным завершением 0; типов 0
без доказанного завершения: «Удвоить»
FLANG_UNKNOWN_NAME в файле docs/examples/diagnostics/unknown.flang, строка 6, столбец 3: неизвестная функция «Утроить»
FLANG_NOT_TOTAL в файле docs/examples/diagnostics/unknown.flang, строка 6, столбец 3: тотальная функция «Удвоить» вызывает неизвестную функцию «Утроить»: завершение доказать нельзя
docs/examples/diagnostics/unknown.flang: не проверено — замечаний 2
$ echo $?
1

Неизвестное имя всегда тянет вторую ошибку, про завершаемость: компилятор не может доказать, что вызов неизвестной функции завершится. Исправьте первую — и вторая уйдёт.

Если операция записана не в том порядке, компилятор подскажет, как писать:

$ flang check docs/examples/diagnostics/operator-order.flang
FLANG_UNKNOWN_NAME в файле docs/examples/diagnostics/operator-order.flang, строка 10, столбец 3: имя «умножить» не связано: имя вводят 'принимает', 'пусть' или образец 'случай'; а действия языка ('плюс', 'минус', 'умножить на', 'делить на', 'остаток от') пишутся МЕЖДУ значениями — «3.14 умножить на р», а не «умножить 3.14 на р»
docs/examples/diagnostics/operator-order.flang: не проверено — замечаний 1
$ echo $?
1

Типы

КодЧто значитЧто делать
FLANG_TYPEобъявленный тип расходится с тем, что даёт тело или аргумент; ещё — функция объявлена дваждысогласовать
FLANG_TYPE_ARGSвстроенному типу даны аргументы типа; встроенные типы вроде число их не принимаютубрать аргументы
FLANG_TYPE_PARAMпараметр типа объявлен дважды, без имени или назван как встроенный либо объявленный типпереименовать параметр
FLANG_APPLYвызов не подходит: не то число аргументов или вызывают не функциюсверить вызов с сигнатурой
FLANG_BUILTIN_ARGSвстроенной операции дали не то число аргументовсвериться с описанием операции
FLANG_MATCH_NOT_EXHAUSTIVEpattern matching покрывает не все случаидобавить недостающий случай
FLANG_MATCH_UNREACHABLEслучай покрыт более ранним и не сработает никогдаубрать его или поднять выше
FLANG_EXAMPLEunit-тест не прошёл: значение не совпало с ожидаемымпоправить тело или ожидание
$ flang check docs/examples/diagnostics/type.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_TYPE в файле docs/examples/diagnostics/type.flang, строка 6, столбец 3: функция «Удвоить» объявлена как число, а тело даёт строка
docs/examples/diagnostics/type.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/duplicate.flang
модуль «Probe»: функций 2, из них с доказанным завершением 2; типов 0
FLANG_TYPE в файле docs/examples/diagnostics/duplicate.flang, строка 8, столбец 1: функция «Удвоить» объявлена дважды
docs/examples/diagnostics/duplicate.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/match.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_MATCH_NOT_EXHAUSTIVE в файле docs/examples/diagnostics/match.flang, строка 6, столбец 3: разбор списка не покрывает «пусто»
docs/examples/diagnostics/match.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/example.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_EXAMPLE: пример «Двойка» функции «Удвоить»: значение не совпало с ожидаемым: ожидалось 5, получено 4
docs/examples/diagnostics/example.flang: не проверено — замечаний 1
$ echo $?
1

Завершаемость и пределы

КодЧто значитЧто делать
FLANG_NOT_TOTALфункция объявлена тотальная, а завершение не доказанопередавать в рекурсивный вызов ЧАСТЬ аргумента (хвост списка, поле варианта), а не пересчитанное число
FLANG_MEASUREобъявленная мера не убываетпоправить убывает или вызов
FLANG_RECURSION_LIMITвычисление исчерпало шаги или глубину вызововподнять --max-steps / --max-depth или исправить рекурсию
FLANG_STEP_LIMITпредел шагов кончился внутри unit-тестатот же ключ --max-steps
FLANG_BUDGET_EXHAUSTEDкончился бюджет шагов прогонаподнять бюджет или сузить задачу
FLANG_MEMORYкончилась памятьуменьшить данные
FLANG_STOPPEDпрогон остановлен снаружизапустить заново
модуль «Probe»

тотальная функция «Считать»
  принимает н: число
  возвращает число
  если н равно 0 то 0 иначе («Считать» от (н плюс 1))
$ flang check docs/examples/diagnostics/total.flang
модуль «Probe»: функций 1, из них с доказанным завершением 0; типов 0
без доказанного завершения: «Считать»
FLANG_NOT_TOTAL в файле docs/examples/diagnostics/total.flang, строка 6, столбец 30: тотальная функция «Считать»: рекурсивный вызов «Считать» не убывает — аргумент 1 («н» add 1) увеличивает параметр «н». Передавайте часть аргумента: хвост списка из образца «голова и хвост», поле варианта из образца, поле записи или элемент коллекции
docs/examples/diagnostics/total.flang: не проверено — замечаний 1
$ echo $?
1

н плюс 1 растёт, поэтому компилятор не может показать, что рекурсия кончится.

Чтобы увидеть предел шагов, запустите с маленьким --max-steps. flang run вычисляет только доказанные программы; в этом rec.flang есть недоказанное, поэтому добавлен --trust:

$ flang run docs/examples/diagnostics/recursion.flang --function "Вниз" --args '{"н":100}' --max-steps 5 --trust
на веру: доказанность не считалась — запуск по ключу --trust
FLANG_RECURSION_LIMIT: функция «Вниз» исчерпала лимит шагов (5) на глубине вызовов 1
$ echo $?
1

Гарантии и доказательства

Предусловия (требует), гарантии (обеспечивает) и теоремы.

КодЧто значитЧто делать
FLANG_PROPERTYгарантия нарушена во время работыневерна либо гарантия, либо тело — смотрите вход, на котором сломалось
FLANG_PRECONDITIONпредусловие записано невернопроверить форму требует «имя» <условие>
FLANG_PRECONDITION_CALLвызывающий не обеспечил предусловие вызываемойдоказать условие в точке вызова или сузить тип аргумента
FLANG_BOUND_ON_NANгарантия о порядке ложна из-за NaNсм. третью ловушку выше
FLANG_PROOF_NO_GOALтеорема не доказывает ничего: гарантии с таким именем нетназвать теорему ровно как гарантию
FLANG_PROOF_AMBIGUOUSтеорема доказывала бы сразу две гарантиидать гарантиям разные имена
FLANG_PROOF_CLAIM_MISMATCHутверждаем расходится с гарантиейскопировать текст гарантии слово в слово
FLANG_PROOF_DUPLICATEдве теоремы доказывают одну гарантиюоставить одну
FLANG_PROOF_STEPу шага нет обоснования, или шагов нет вовседобавить по свойству «…», по примеру «…» или по предположению
FLANG_PROOF_UNFINISHEDдоказательство не законченодобавить следовательно доказано
FLANG_PROOF_UNKNOWN_VARв утверждении необъявленное имяобъявить его через дано
FLANG_PROOF_VAR_TYPEтип переменной теоремы не совпадает с типом параметрасогласовать дано с сигнатурой функции
FLANG_PROOF_INDUCTION_TYPEиндукция по этому типу невозможнаиндукция идёт по типу с вариантами или по неотрицательное
FLANG_PROOF_INDUCTION_CASESпокрыты не все случаи индукциидобавить недостающий случай
FLANG_PROOF_INDUCTION_BRANCHслучай не доходит до целиобосновать этот случай
FLANG_PROOF_INDUCTION_STEPшаг индукции не доходит до предположениядобавить по предположению и сделать стороны совпадающими в точности
FLANG_PROOF_INDUCTION_DESCENTшаг индукции не ровно на один внизсделать шаг ровно на один вниз
FLANG_INITIAL_FAILUREдля типа не удалось построить правило индукциипроверить, что тип объявлен вариантами
FLANG_UNCOVERED_FAILUREслучай ошибки не обработан в pattern matchingдобавить случай для ошибки
модуль «Probe»

тотальная функция «Удвоить»
  принимает н: число
  возвращает число
  обеспечивает «удвоенное неотрицательно» если н не меньше 0 то (результат не меньше 0) иначе да
  н умножить на 2

теорема «удвоенное неотрицательно»
  дано н: число
  утверждаем если н не меньше 0 то (результат не меньше 0) иначе да
  следовательно доказано
$ flang check docs/examples/diagnostics/no-steps.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_PROOF_STEP: теорема «удвоенное неотрицательно»: ни одного шага
docs/examples/diagnostics/no-steps.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/no-goal.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_PROOF_NO_GOAL в файле docs/examples/diagnostics/no-goal.flang, строка 8, столбец 1: теорема «удвоенное неотрицательно» ничего не закрывает: постусловия «удвоенное неотрицательно» нет ни у одной функции модуля. Теорема доказывает названное утверждение, а не утверждение вообще — назовите её так же, как постусловие, которое она закрывает
docs/examples/diagnostics/no-goal.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/ambiguous.flang
модуль «Probe»: функций 2, из них с доказанным завершением 2; типов 0
FLANG_PROOF_AMBIGUOUS в файле docs/examples/diagnostics/ambiguous.flang, строка 15, столбец 1: теорема «неотрицательно» закрывала бы сразу 2 постусловия («Удвоить», «Утроить»), и выбрать нельзя. Дайте постусловиям разные имена
docs/examples/diagnostics/ambiguous.flang: не проверено — замечаний 1
$ echo $?
1
$ flang check docs/examples/diagnostics/mismatch.flang
модуль «Probe»: функций 1, из них с доказанным завершением 1; типов 0
FLANG_PROOF_CLAIM_MISMATCH в файле docs/examples/diagnostics/mismatch.flang, строка 11, столбец 3: теорема «неотрицательно» утверждает не то, что обещает функция «Удвоить»: утверждение теоремы и постусловие обязаны совпадать слово в слово. Ядро не решает, что два разных утверждения означают одно и то же
docs/examples/diagnostics/mismatch.flang: не проверено — замечаний 1
$ echo $?
1

Гарантия, которую prover не доказал, проверяется во время работы. flang run недоказанные программы не запускает, поэтому нужен --trust:

$ flang run docs/examples/diagnostics/property.flang --function "Половина" --args '{"н":0}' --trust
на веру: доказанность не считалась — запуск по ключу --trust
FLANG_PROPERTY: нарушено свойство «результат меньше довода» функции «Половина»
$ echo $?
1

Законы объявленных структур

Эти законы ПРОВЕРЯЮТСЯ на конечном наборе значений, который даёте вы, а не доказываются. Ошибка значит, что нарушение найдено, — контрпример есть всегда.

КодКакой закон нарушен
FLANG_EQUALITY_NOT_REFLEXIVEобъявленное равенство не рефлексивно
FLANG_EQUALITY_NOT_SYMMETRICне симметрично
FLANG_EQUALITY_NOT_TRANSITIVEне транзитивно
FLANG_EQUALITY_NOT_CONGRUENTкомпозиция не уважает равенство
FLANG_ORDER_NOT_REFLEXIVEпорядок не рефлексивен
FLANG_ORDER_NOT_ANTISYMMETRICне антисимметричен
FLANG_ORDER_NOT_TRANSITIVEне транзитивен
FLANG_CATEGORY_NOT_CLOSEDкатегория не замкнута относительно композиции
FLANG_CATEGORY_NO_IDENTITYу объекта нет тождественного морфизма
FLANG_CATEGORY_NOT_ASSOCкомпозиция не ассоциативна
FLANG_COMPOSE_MISMATCHконцы композиции не сходятся
FLANG_MORPHISM_SHAPEморфизм объявлен неверно
FLANG_FUNCTOR_SQUAREквадрат функтора не коммутирует
FLANG_TRANSFORM_NOT_NATURALквадрат естественности не коммутирует
FLANG_BIFUNCTOR_OBJECT_TWICEбифунктор отображает одну пару объектов дважды
FLANG_BIFUNCTOR_OBJECT_MISSINGпара стрелок отображена, а у пары их концов образа нет
FLANG_BIFUNCTOR_ARROW_MISMATCHобраз пары стрелок не объявлен или ведёт не между образами концов
FLANG_BIFUNCTOR_IDENTITYпара единиц отображена в стрелку, которая не единица
FLANG_BIFUNCTOR_COMPOSITIONпара композиций отображена не в композицию образов частей
FLANG_ISO_NOT_INVERSEдве стрелки не обратны друг другу
FLANG_EMBED_SHAPEвложение объявлено неверно
FLANG_EMBED_NOT_INJECTIVEвложение переводит разные значения в одно
FLANG_MONOIDобъявление моноида неполно
FLANG_MONOID_ASSOCоперация моноида не ассоциативна
FLANG_MONOID_IDENTITYнейтральный элемент не нейтрален
FLANG_GROUP_INVERSEобратный элемент не обратен
FLANG_MONADобъявление монады неполно
FLANG_MONAD_ASSOCbind не ассоциативен
FLANG_MONAD_LEFT_UNITнарушен закон левой единицы
FLANG_MONAD_RIGHT_UNITнарушен закон правой единицы
FLANG_NOT_COMMUTATIVEобъявленная коммутативность не выполняется
FLANG_NOT_DISTRIBUTIVEдистрибутивность не выполняется
FLANG_NOT_IDEMPOTENTидемпотентность не выполняется
FLANG_NOT_MONOTONEмонотонность не выполняется
FLANG_MEET_NAME_TAKENимя множества уже занято
FLANG_MEET_NO_UNIVERSEу объявленных множеств нет общего носителя
FLANG_MEET_SAME_SIDEмножество пересекается само с собой
FLANG_MEET_TWICEодна пара объявлена дважды

Планы и ввод-вывод

Ошибки flang io. План возвращает команду как данные, а выполняет её рантайм; коды FLANG_IO_* — отказы рантайма, которые план получает в ответ.

КодЧто значитЧто делать
FLANG_PLANплан объявлен невернопроверить объявление план
FLANG_UNKNOWN_PLANв файле нет плана с таким именемназвать существующий: --plan 'Имя', без ёлочек
FLANG_PLAN_UNSUPPORTEDцелевой язык не умеет генерировать планыгенерировать на другую цель или запускать через flang io
FLANG_IO_DENIEDправо отнято ключом (--no-read, --no-write, --no-net и другие)убрать ключ
FLANG_IO_NO_HOSTнет рантайма, который выполнил бы командузапускать через flang io, а не вычислением функции
FLANG_IO_NOT_TEXTчтение текста нашло байты, которые не текстчитать байтами
FLANG_IO_TIMEOUTзапущенный процесс молчал дольше --timeoutподнять --timeout
FLANG_LOCKlock-файл испорчен или не сошлась его контрольная суммапересобрать его flang lock
FLANG_PACKAGEпакет испорчен или рядом нет flang.packageпересобрать его flang package

Права отнимаются по одному; по умолчанию можно всё:

flang io план.flang --plan 'Разбор' --no-net --in-dir

Процессы

КодЧто значитЧто делать
FLANG_PROCESSпроцесс объявлен невернопроверить объявление
FLANG_PROCESS_ACCEPTSпроцессу пришло сообщение, которого он не принимаетдобавить вид сообщения в принимает
FLANG_PROCESS_LIMITдостигнут предел числа процессовподнять предел или запускать меньше
FLANG_MAILBOX_FULLпочтовый ящик полон: читатель отстаётчитать чаще или притормозить отправителя
FLANG_LINK_DOWNсвязь с узлом или процессом порваласьобработать обрыв в супервизоре
FLANG_HOTSWAP_REFUSEDгорячая замена кода отвергнутасделать новый код совместимым с прежними объявлениями

Командная строка и внутренние ошибки

КодЧто значитЧто делать
FLANG_CLIкривой вызов: неизвестный ключ или нет доводаflang <команда> --help
FLANG_INTERNALсломался сам компиляторсообщить: это ошибка инструмента, а не вашей программы
FLANG_SELF_REPL_UNSUPPORTEDоболочка не принимает эту конструкцию, например используетположить код в файл и запустить flang check
FLANG_FACTCHECK_НЕТ_ОТВЕТАflang facts не получил значения для вызовадобавить значение в факты
$ flang check --неткого
flang check: непонятный ключ «--неткого»
$ echo $?
2

Код возврата — 2.

Все коды компилятора

Таблица собрана из исходников компилятора: код в ней есть, пока его поднимает хоть одна строка исходников компилятора flang/self/ или его рантайма bootstrap/flang_*.c вне примеров и постусловий. Текст — шаблоны из каталога сообщений flang/messages/catalog.tsv; прочерк значит, что у кода шаблона в каталоге нет и текст собирается на месте. Код, названный на этой странице, но не найденный в исходниках, роняет docs:check.

КодГде в компилятореТекст сообщения
FLANG_AMBIGUOUS_NAMEparser.flang—
FLANG_APPLYinterpret.flang, types.flang—
FLANG_BAD_NAMEconc.flang, failures.flang—
FLANG_BIFUNCTOR_ARROW_MISMATCHcompiler.flang—
FLANG_BIFUNCTOR_COMPOSITIONcompiler.flang—
FLANG_BIFUNCTOR_IDENTITYcompiler.flang—
FLANG_BIFUNCTOR_OBJECT_MISSINGcompiler.flang—
FLANG_BIFUNCTOR_OBJECT_TWICEcompiler.flang—
FLANG_BINflang_repl.c—
FLANG_BOUND_ON_NANobligations.flangпостусловие «{claim}» функции «{function}» ЛОЖНО, и контрпример назван: {reason}
FLANG_BUDGET_EXHAUSTEDconc.flang, failures.flang—
FLANG_BUILTIN_ARGSbuiltins.flang, failures.flang, interpret.flang, types.flang—
FLANG_CATEGORY_ARROW_TWICEcompiler.flang—
FLANG_CATEGORY_EQUALITY_OUTSIDEcompiler.flang—
FLANG_CATEGORY_EQUALITY_SHAPEcompiler.flang—
FLANG_CATEGORY_EQUALITY_TWICEcompiler.flang—
FLANG_CATEGORY_NOT_ASSOCsetoid.flang—
FLANG_CATEGORY_NOT_CLOSEDcompiler.flang—
FLANG_CATEGORY_NO_IDENTITYcompiler.flang—
FLANG_CATEGORY_UNKNOWN_ARROWcompiler.flang—
FLANG_CCflang_repl.c—
FLANG_CHECKERflang_repl.c—
FLANG_CLIflang_repl.c, cli.flang, repl.flang—
FLANG_COMPOSE_MISMATCHcompiler.flang—
FLANG_DUPLICATE_NAMEflang_repl.c, link.flang, sets.flangв файле {file}: функция «{name}» объявлена в двух модулях: {first} и {second} · функция «{name}» объявлена в двух модулях: {first} и {second} · в файле {file}: тип «{name}» объявлен в двух модулях: {first} и {second} · тип «{name}» объявлен в двух модулях: {first} и {second}
FLANG_EMBED_NOT_INJECTIVEsets.flang—
FLANG_EMBED_SHAPEsets.flang—
FLANG_EQUALITY_NOT_CONGRUENTsetoid.flang—
FLANG_EQUALITY_NOT_REFLEXIVEsetoid.flang—
FLANG_EQUALITY_NOT_SYMMETRICsetoid.flang—
FLANG_EQUALITY_NOT_TRANSITIVEsetoid.flang—
FLANG_EXAMPLEcompiler.flangпример «{example}» функции «{function}»: значение не совпало с ожидаемым: ожидалось {wanted}, получено {got}
FLANG_FACTCHECK_НЕТ_ОТВЕТАfactcheck.flang—
FLANG_FSPEC_TEMPLATE_DIRflang_repl.c—
FLANG_FUNCTOR_SQUAREfunctor.flang—
FLANG_GROUP_INVERSEmonoid.flang—
FLANG_HANDLER_NOT_TOTALprocesses.flang—
FLANG_HISTORYflang_repl.c—
FLANG_HOTSWAP_REFUSEDhotswap.flang—
FLANG_IMPORT_AMBIGUOUSflang_repl.c, link.flang—
FLANG_IMPORT_CYCLEflang_repl.c, link.flang—
FLANG_IMPORT_NAMEflang_repl.c, link.flang—
FLANG_IMPORT_NOT_FOUNDflang_repl.c, link.flang—
FLANG_INCLUDE_DIRflang_repl.c—
FLANG_INITIAL_FAILUREfailures.flang, processes.flang—
FLANG_INTERNALflang_repl.c, conc.flang, lsp.flang—
FLANG_IOflang_cli.c, flang_repl.c, compiler.flang—
FLANG_IO_DENIEDflang_repl.c—
FLANG_IO_ENTROPYflang_repl.c—
FLANG_IO_ENVflang_cli.c, flang_repl.c—
FLANG_IO_FAILEDflang_cli.c, flang_repl.c—
FLANG_IO_LIMITflang_cli.c, flang_repl.c—
FLANG_IO_LISTflang_cli.c, flang_repl.c—
FLANG_IO_NETflang_repl.c—
FLANG_IO_NOT_CHECKEDflang_cli.c, flang_repl.c—
FLANG_IO_NOT_TEXTflang_cli.c, flang_repl.c—
FLANG_IO_NOT_WIREDflang_cli.c—
FLANG_IO_NO_HOSTconc.flang—
FLANG_IO_NO_SCREENflang_cli.c, flang_repl.c—
FLANG_IO_NO_TLSflang_repl.c—
FLANG_IO_OCTETSflang_cli.c, flang_repl.c—
FLANG_IO_ORDERemit-from-source.flang—
FLANG_IO_PATHflang_cli.c, flang_repl.c—
FLANG_IO_PLACEflang_repl.c—
FLANG_IO_READflang_cli.c, flang_repl.c—
FLANG_IO_REMOVEflang_cli.c, flang_repl.c—
FLANG_IO_SPAWNflang_repl.c—
FLANG_IO_TEMPDIRflang_cli.c, flang_repl.c—
FLANG_IO_TIMEOUTflang_repl.c—
FLANG_IO_TLSflang_repl.c—
FLANG_IO_TLS_CERTflang_repl.c—
FLANG_IO_UNKNOWNflang_repl.c—
FLANG_IO_WRITEflang_cli.c, flang_repl.c—
FLANG_ISO_NOT_INVERSEiso.flang—
FLANG_KERNEL_STAGESflang_repl.c—
FLANG_LANGflang_repl.c—
FLANG_LEXlexer.flang—
FLANG_LIB_DIRflang_repl.c—
FLANG_LINK_DOWNfailures.flang—
FLANG_LOCKflang_repl.c—
FLANG_MAILBOX_FULLconc.flang, failures.flang—
FLANG_MATCH_NOT_EXHAUSTIVEinterpret.flang, types.flangразбор {subject} не покрывает {cases} · разбор без случаев не покрывает ничего
FLANG_MATCH_UNREACHABLEtypes.flang—
FLANG_MEASUREdefunc.flang, failures.flang—
FLANG_MEET_NAME_TAKENsets.flang—
FLANG_MEET_NO_UNIVERSEsets.flang—
FLANG_MEET_SAME_SIDEsets.flang—
FLANG_MEET_TWICEsets.flang—
FLANG_MEMOflang_runtime.c—
FLANG_MEMORYflang_cli.c, flang_repl.c—
FLANG_MEMO_AUDITflang_runtime.c—
FLANG_MEMO_BYTESflang_runtime.c—
FLANG_MEMO_STATSflang_runtime.c—
FLANG_MESSAGE_DIRflang_repl.c—
FLANG_MODULE_DIRflang_repl.c—
FLANG_MODULE_ROOTflang_repl.c—
FLANG_MONADmonad-expand.flang, monad.flang—
FLANG_MONAD_ASSOCmonad.flang—
FLANG_MONAD_LEFT_UNITmonad.flang—
FLANG_MONAD_RIGHT_UNITmonad.flang—
FLANG_MONOIDmonoid.flang—
FLANG_MONOID_ASSOCmonoid.flang—
FLANG_MONOID_IDENTITYmonoid.flang—
FLANG_MORPHISM_SHAPEcompiler.flang—
FLANG_NAME_TAKENconc.flang, failures.flang—
FLANG_NEWflang_repl.c—
FLANG_NOT_COMMUTATIVEcommutative.flang—
FLANG_NOT_DISTRIBUTIVEdistributive.flang—
FLANG_NOT_IDEMPOTENTidempotent.flang—
FLANG_NOT_MONOTONEmonotone.flang—
FLANG_NOT_TOTALtotality.flangтотальная функция «{function}» вызывает неизвестную функцию «{callee}»: завершение доказать нельзя · тотальная функция «{function}»: рекурсивный вызов «{callee}» не убывает — аргумент {position} ({argument}) увеличивает параметр «{parameter}». Передавайте часть аргумента: хвост списка из образца «голова и хвост», поле варианта из образца, поле записи или элемент коллекции
FLANG_ORDER_NOT_ANTISYMMETRICpartialorder.flang—
FLANG_ORDER_NOT_REFLEXIVEpartialorder.flang—
FLANG_ORDER_NOT_TRANSITIVEpartialorder.flang—
FLANG_PACKAGEflang_repl.c—
FLANG_PARSEinterpret.flang, parser.flangу 'если' нет ветки 'иначе' · не разобрана конструкция: неожиданное '{word}' — это слово занято языком, именем оно быть не может: напишите имя в ёлочках («{word.quoted}») или переименуйте; а если слово попало в форму лишним — уберите его
FLANG_PECHAT_BEDYemit-from-source.flang—
FLANG_PECHAT_OTKAZemit-from-source.flang—
FLANG_PLANio.flang—
FLANG_PLAN_UNSUPPORTEDcompiler.flang—
FLANG_PRECONDITIONemit-c.flang, emit-csharp.flang, emit-elixir.flang, emit-java.flang, emit-js.flang, emit-python.flang, parser.flang—
FLANG_PRECONDITION_CALLproofterm.flangвызов «{callee}» в функции «{function}» не снимает предусловие «{precondition}»: {reason}
FLANG_PROCESSconc.flang, processes.flang—
FLANG_PROCESS_ACCEPTSconc.flang, failures.flang, processes.flang—
FLANG_PROCESS_LIMITconc.flang, failures.flang—
FLANG_PROOF_AMBIGUOUSobligations.flang—
FLANG_PROOF_CACHEflang_repl.c—
FLANG_PROOF_CACHE_AUDITflang_repl.c—
FLANG_PROOF_CACHE_KEYflang_repl.c—
FLANG_PROOF_CACHE_RECHECKflang_repl.c—
FLANG_PROOF_CACHE_STATSflang_repl.c—
FLANG_PROOF_CHECKERflang_repl.c—
FLANG_PROOF_CLAIM_MISMATCHobligations.flang, proofterm.flang—
FLANG_PROOF_DUPLICATEobligations.flang—
FLANG_PROOF_INDUCTION_BRANCHproofterm.flangшаг {step}, шаг «{case}» теоремы «{theorem}»: {reason} · шаг {step}, база «{case}» теоремы «{theorem}»: {reason}
FLANG_PROOF_INDUCTION_CASESproofterm.flang—
FLANG_PROOF_INDUCTION_DESCENTproofterm.flang—
FLANG_PROOF_INDUCTION_STEPproofterm.flangшаг {step}, шаг «{case}» теоремы «{theorem}»: {reason} · шаг {step}, база «{case}» теоремы «{theorem}»: {reason}
FLANG_PROOF_INDUCTION_TYPEproofterm.flang—
FLANG_PROOF_NO_GOALobligations.flang—
FLANG_PROOF_STEPproofterm.flangшаг {step}, теорема «{theorem}»: {reason}
FLANG_PROOF_UNFINISHEDobligations.flang—
FLANG_PROOF_UNKNOWN_VARobligations.flang, parser.flang, types.flang—
FLANG_PROOF_VAR_TYPEobligations.flang—
FLANG_PROPERTYemit-c.flang, emit-csharp.flang, emit-elixir.flang, emit-java.flang, emit-js.flang, emit-python.flang, grid.flang, interpret.flang, parser.flangнарушено свойство «{claim}» функции «{function}»
FLANG_PULSEflang_runtime.c—
FLANG_PULSE_TICKflang_runtime.c—
FLANG_RECURSION_LIMITconc.flang, factcheck.flang, failures.flang, interpret.flang—
FLANG_RUNTIME_DIRflang_repl.c—
FLANG_SELF_REPL_UNSUPPORTEDrepl.flang—
FLANG_STEP_LIMITfactcheck.flang—
FLANG_STOPPEDconc.flang, failures.flang—
FLANG_THREADSflang_runtime.c—
FLANG_TICKS_OUTflang_runtime.c—
FLANG_TIME_OUTflang_runtime.c—
FLANG_TLS_CHAINflang_repl.c—
FLANG_TLS_ENGINEflang_repl.c—
FLANG_TLS_EXPIREDflang_repl.c—
FLANG_TLS_NAMEflang_repl.c—
FLANG_TLS_SIGNATUREflang_repl.c—
FLANG_TMPflang_repl.c—
FLANG_TRANSFORM_COMPONENTcompiler.flang—
FLANG_TRANSFORM_NOT_NATURALsetoid.flang—
FLANG_TRANSFORM_NOT_TOTALcompiler.flang—
FLANG_TRANSFORM_SHAPEcompiler.flang—
FLANG_TYPEflang_cli.c, interpret.flang, types.flang{where} объявлена как {type.declared}, а тело даёт {type.body} · {where} объявлена дважды · {where} не имеет тела · аргумент «{parameter}» функции «{function}»: ожидался {type.wanted}, получен {type.got} · {side} операнд «{operation}»: ожидался {type.wanted}, получен {type.got} · условие «если» должно быть признаком, а не {type} · ветви «если» разных типов: {type.then} и {type.else} · запись «{record}» не имеет поля «{field}» · запись «{record}» требует поле «{field}» ({type}) · поле «{field}» объявлено дважды · функция «{function}» принимает {count} арг. ({parameters}), а вызвана с {given} · вызов функции «{function}»: аргумент «{parameter}»: {value} вне {type} · {label} функции «{function}» не задаёт аргумент «{parameter}» · {label}: {value} вне {type} · {label} не соответствует типу {type}
FLANG_TYPE_ARGStypes.flang—
FLANG_TYPE_PARAMtypes.flang—
FLANG_UNCOVERED_FAILUREfailures.flang, processes.flang—
FLANG_UNKNOWNflang_cli.c—
FLANG_UNKNOWN_NAMEflang_repl.c, builtins.flang, conc.flang, interpret.flang, link.flang, parser.flang, sets.flang, types.flangнеизвестная функция «{name}» · неизвестный тип «{name}» · неизвестная запись «{name}» · неизвестный вариант «{name}» · неизвестный конструктор варианта «{name}» · не найдена функция «{name}» · запись не содержит поле «{field}» · имя «{name}» не связано · имя «{name}» не связано: имя вводят 'принимает', 'пусть' или образец 'случай'; а действия языка ('плюс', 'минус', 'умножить на', 'делить на', 'остаток от') пишутся МЕЖДУ значениями — «3.14 умножить на р», а не «умножить 3.14 на р»
FLANG_UNKNOWN_PLANflang_cli.c, compiler.flang—
FLANG_UNKNOWN_PROCESSprocesses.flang—
FLANG_UNPROVEDcompiler.flang—
FLANG_UNPROVENflang_repl.c—
FLANG_VITKIflang_repl.c—
FLANG_WATCHflang_runtime.c—
FLANG_WATCH_TICKflang_runtime.c—
FLANG_ZAKAZemit-from-source.flang—

Дальше: Prover отказал: чья это ошибка — как читать отвергнутое доказательство и когда ошибка не ваша.