Справочник отказов
Когда компилятор отвергает программу, каждая строка ошибки начинается с кода:
$ 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_EXHAUSTIVE | pattern matching покрывает не все случаи | добавить недостающий случай |
FLANG_MATCH_UNREACHABLE | случай покрыт более ранним и не сработает никогда | убрать его или поднять выше |
FLANG_EXAMPLE | unit-тест не прошёл: значение не совпало с ожидаемым | поправить тело или ожидание |
$ 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_ASSOC | bind не ассоциативен |
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_LOCK | lock-файл испорчен или не сошлась его контрольная сумма | пересобрать его 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_NAME | parser.flang | — |
FLANG_APPLY | interpret.flang, types.flang | — |
FLANG_BAD_NAME | conc.flang, failures.flang | — |
FLANG_BIFUNCTOR_ARROW_MISMATCH | compiler.flang | — |
FLANG_BIFUNCTOR_COMPOSITION | compiler.flang | — |
FLANG_BIFUNCTOR_IDENTITY | compiler.flang | — |
FLANG_BIFUNCTOR_OBJECT_MISSING | compiler.flang | — |
FLANG_BIFUNCTOR_OBJECT_TWICE | compiler.flang | — |
FLANG_BIN | flang_repl.c | — |
FLANG_BOUND_ON_NAN | obligations.flang | постусловие «{claim}» функции «{function}» ЛОЖНО, и контрпример назван: {reason} |
FLANG_BUDGET_EXHAUSTED | conc.flang, failures.flang | — |
FLANG_BUILTIN_ARGS | builtins.flang, failures.flang, interpret.flang, types.flang | — |
FLANG_CATEGORY_ARROW_TWICE | compiler.flang | — |
FLANG_CATEGORY_EQUALITY_OUTSIDE | compiler.flang | — |
FLANG_CATEGORY_EQUALITY_SHAPE | compiler.flang | — |
FLANG_CATEGORY_EQUALITY_TWICE | compiler.flang | — |
FLANG_CATEGORY_NOT_ASSOC | setoid.flang | — |
FLANG_CATEGORY_NOT_CLOSED | compiler.flang | — |
FLANG_CATEGORY_NO_IDENTITY | compiler.flang | — |
FLANG_CATEGORY_UNKNOWN_ARROW | compiler.flang | — |
FLANG_CC | flang_repl.c | — |
FLANG_CHECKER | flang_repl.c | — |
FLANG_CLI | flang_repl.c, cli.flang, repl.flang | — |
FLANG_COMPOSE_MISMATCH | compiler.flang | — |
FLANG_DUPLICATE_NAME | flang_repl.c, link.flang, sets.flang | в файле {file}: функция «{name}» объявлена в двух модулях: {first} и {second} · функция «{name}» объявлена в двух модулях: {first} и {second} · в файле {file}: тип «{name}» объявлен в двух модулях: {first} и {second} · тип «{name}» объявлен в двух модулях: {first} и {second} |
FLANG_EMBED_NOT_INJECTIVE | sets.flang | — |
FLANG_EMBED_SHAPE | sets.flang | — |
FLANG_EQUALITY_NOT_CONGRUENT | setoid.flang | — |
FLANG_EQUALITY_NOT_REFLEXIVE | setoid.flang | — |
FLANG_EQUALITY_NOT_SYMMETRIC | setoid.flang | — |
FLANG_EQUALITY_NOT_TRANSITIVE | setoid.flang | — |
FLANG_EXAMPLE | compiler.flang | пример «{example}» функции «{function}»: значение не совпало с ожидаемым: ожидалось {wanted}, получено {got} |
FLANG_FACTCHECK_НЕТ_ОТВЕТА | factcheck.flang | — |
FLANG_FSPEC_TEMPLATE_DIR | flang_repl.c | — |
FLANG_FUNCTOR_SQUARE | functor.flang | — |
FLANG_GROUP_INVERSE | monoid.flang | — |
FLANG_HANDLER_NOT_TOTAL | processes.flang | — |
FLANG_HISTORY | flang_repl.c | — |
FLANG_HOTSWAP_REFUSED | hotswap.flang | — |
FLANG_IMPORT_AMBIGUOUS | flang_repl.c, link.flang | — |
FLANG_IMPORT_CYCLE | flang_repl.c, link.flang | — |
FLANG_IMPORT_NAME | flang_repl.c, link.flang | — |
FLANG_IMPORT_NOT_FOUND | flang_repl.c, link.flang | — |
FLANG_INCLUDE_DIR | flang_repl.c | — |
FLANG_INITIAL_FAILURE | failures.flang, processes.flang | — |
FLANG_INTERNAL | flang_repl.c, conc.flang, lsp.flang | — |
FLANG_IO | flang_cli.c, flang_repl.c, compiler.flang | — |
FLANG_IO_DENIED | flang_repl.c | — |
FLANG_IO_ENTROPY | flang_repl.c | — |
FLANG_IO_ENV | flang_cli.c, flang_repl.c | — |
FLANG_IO_FAILED | flang_cli.c, flang_repl.c | — |
FLANG_IO_LIMIT | flang_cli.c, flang_repl.c | — |
FLANG_IO_LIST | flang_cli.c, flang_repl.c | — |
FLANG_IO_NET | flang_repl.c | — |
FLANG_IO_NOT_CHECKED | flang_cli.c, flang_repl.c | — |
FLANG_IO_NOT_TEXT | flang_cli.c, flang_repl.c | — |
FLANG_IO_NOT_WIRED | flang_cli.c | — |
FLANG_IO_NO_HOST | conc.flang | — |
FLANG_IO_NO_SCREEN | flang_cli.c, flang_repl.c | — |
FLANG_IO_NO_TLS | flang_repl.c | — |
FLANG_IO_OCTETS | flang_cli.c, flang_repl.c | — |
FLANG_IO_ORDER | emit-from-source.flang | — |
FLANG_IO_PATH | flang_cli.c, flang_repl.c | — |
FLANG_IO_PLACE | flang_repl.c | — |
FLANG_IO_READ | flang_cli.c, flang_repl.c | — |
FLANG_IO_REMOVE | flang_cli.c, flang_repl.c | — |
FLANG_IO_SPAWN | flang_repl.c | — |
FLANG_IO_TEMPDIR | flang_cli.c, flang_repl.c | — |
FLANG_IO_TIMEOUT | flang_repl.c | — |
FLANG_IO_TLS | flang_repl.c | — |
FLANG_IO_TLS_CERT | flang_repl.c | — |
FLANG_IO_UNKNOWN | flang_repl.c | — |
FLANG_IO_WRITE | flang_cli.c, flang_repl.c | — |
FLANG_ISO_NOT_INVERSE | iso.flang | — |
FLANG_KERNEL_STAGES | flang_repl.c | — |
FLANG_LANG | flang_repl.c | — |
FLANG_LEX | lexer.flang | — |
FLANG_LIB_DIR | flang_repl.c | — |
FLANG_LINK_DOWN | failures.flang | — |
FLANG_LOCK | flang_repl.c | — |
FLANG_MAILBOX_FULL | conc.flang, failures.flang | — |
FLANG_MATCH_NOT_EXHAUSTIVE | interpret.flang, types.flang | разбор {subject} не покрывает {cases} · разбор без случаев не покрывает ничего |
FLANG_MATCH_UNREACHABLE | types.flang | — |
FLANG_MEASURE | defunc.flang, failures.flang | — |
FLANG_MEET_NAME_TAKEN | sets.flang | — |
FLANG_MEET_NO_UNIVERSE | sets.flang | — |
FLANG_MEET_SAME_SIDE | sets.flang | — |
FLANG_MEET_TWICE | sets.flang | — |
FLANG_MEMO | flang_runtime.c | — |
FLANG_MEMORY | flang_cli.c, flang_repl.c | — |
FLANG_MEMO_AUDIT | flang_runtime.c | — |
FLANG_MEMO_BYTES | flang_runtime.c | — |
FLANG_MEMO_STATS | flang_runtime.c | — |
FLANG_MESSAGE_DIR | flang_repl.c | — |
FLANG_MODULE_DIR | flang_repl.c | — |
FLANG_MODULE_ROOT | flang_repl.c | — |
FLANG_MONAD | monad-expand.flang, monad.flang | — |
FLANG_MONAD_ASSOC | monad.flang | — |
FLANG_MONAD_LEFT_UNIT | monad.flang | — |
FLANG_MONAD_RIGHT_UNIT | monad.flang | — |
FLANG_MONOID | monoid.flang | — |
FLANG_MONOID_ASSOC | monoid.flang | — |
FLANG_MONOID_IDENTITY | monoid.flang | — |
FLANG_MORPHISM_SHAPE | compiler.flang | — |
FLANG_NAME_TAKEN | conc.flang, failures.flang | — |
FLANG_NEW | flang_repl.c | — |
FLANG_NOT_COMMUTATIVE | commutative.flang | — |
FLANG_NOT_DISTRIBUTIVE | distributive.flang | — |
FLANG_NOT_IDEMPOTENT | idempotent.flang | — |
FLANG_NOT_MONOTONE | monotone.flang | — |
FLANG_NOT_TOTAL | totality.flang | тотальная функция «{function}» вызывает неизвестную функцию «{callee}»: завершение доказать нельзя · тотальная функция «{function}»: рекурсивный вызов «{callee}» не убывает — аргумент {position} ({argument}) увеличивает параметр «{parameter}». Передавайте часть аргумента: хвост списка из образца «голова и хвост», поле варианта из образца, поле записи или элемент коллекции |
FLANG_ORDER_NOT_ANTISYMMETRIC | partialorder.flang | — |
FLANG_ORDER_NOT_REFLEXIVE | partialorder.flang | — |
FLANG_ORDER_NOT_TRANSITIVE | partialorder.flang | — |
FLANG_PACKAGE | flang_repl.c | — |
FLANG_PARSE | interpret.flang, parser.flang | у 'если' нет ветки 'иначе' · не разобрана конструкция: неожиданное '{word}' — это слово занято языком, именем оно быть не может: напишите имя в ёлочках («{word.quoted}») или переименуйте; а если слово попало в форму лишним — уберите его |
FLANG_PECHAT_BEDY | emit-from-source.flang | — |
FLANG_PECHAT_OTKAZ | emit-from-source.flang | — |
FLANG_PLAN | io.flang | — |
FLANG_PLAN_UNSUPPORTED | compiler.flang | — |
FLANG_PRECONDITION | emit-c.flang, emit-csharp.flang, emit-elixir.flang, emit-java.flang, emit-js.flang, emit-python.flang, parser.flang | — |
FLANG_PRECONDITION_CALL | proofterm.flang | вызов «{callee}» в функции «{function}» не снимает предусловие «{precondition}»: {reason} |
FLANG_PROCESS | conc.flang, processes.flang | — |
FLANG_PROCESS_ACCEPTS | conc.flang, failures.flang, processes.flang | — |
FLANG_PROCESS_LIMIT | conc.flang, failures.flang | — |
FLANG_PROOF_AMBIGUOUS | obligations.flang | — |
FLANG_PROOF_CACHE | flang_repl.c | — |
FLANG_PROOF_CACHE_AUDIT | flang_repl.c | — |
FLANG_PROOF_CACHE_KEY | flang_repl.c | — |
FLANG_PROOF_CACHE_RECHECK | flang_repl.c | — |
FLANG_PROOF_CACHE_STATS | flang_repl.c | — |
FLANG_PROOF_CHECKER | flang_repl.c | — |
FLANG_PROOF_CLAIM_MISMATCH | obligations.flang, proofterm.flang | — |
FLANG_PROOF_DUPLICATE | obligations.flang | — |
FLANG_PROOF_INDUCTION_BRANCH | proofterm.flang | шаг {step}, шаг «{case}» теоремы «{theorem}»: {reason} · шаг {step}, база «{case}» теоремы «{theorem}»: {reason} |
FLANG_PROOF_INDUCTION_CASES | proofterm.flang | — |
FLANG_PROOF_INDUCTION_DESCENT | proofterm.flang | — |
FLANG_PROOF_INDUCTION_STEP | proofterm.flang | шаг {step}, шаг «{case}» теоремы «{theorem}»: {reason} · шаг {step}, база «{case}» теоремы «{theorem}»: {reason} |
FLANG_PROOF_INDUCTION_TYPE | proofterm.flang | — |
FLANG_PROOF_NO_GOAL | obligations.flang | — |
FLANG_PROOF_STEP | proofterm.flang | шаг {step}, теорема «{theorem}»: {reason} |
FLANG_PROOF_UNFINISHED | obligations.flang | — |
FLANG_PROOF_UNKNOWN_VAR | obligations.flang, parser.flang, types.flang | — |
FLANG_PROOF_VAR_TYPE | obligations.flang | — |
FLANG_PROPERTY | emit-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_PULSE | flang_runtime.c | — |
FLANG_PULSE_TICK | flang_runtime.c | — |
FLANG_RECURSION_LIMIT | conc.flang, factcheck.flang, failures.flang, interpret.flang | — |
FLANG_RUNTIME_DIR | flang_repl.c | — |
FLANG_SELF_REPL_UNSUPPORTED | repl.flang | — |
FLANG_STEP_LIMIT | factcheck.flang | — |
FLANG_STOPPED | conc.flang, failures.flang | — |
FLANG_THREADS | flang_runtime.c | — |
FLANG_TICKS_OUT | flang_runtime.c | — |
FLANG_TIME_OUT | flang_runtime.c | — |
FLANG_TLS_CHAIN | flang_repl.c | — |
FLANG_TLS_ENGINE | flang_repl.c | — |
FLANG_TLS_EXPIRED | flang_repl.c | — |
FLANG_TLS_NAME | flang_repl.c | — |
FLANG_TLS_SIGNATURE | flang_repl.c | — |
FLANG_TMP | flang_repl.c | — |
FLANG_TRANSFORM_COMPONENT | compiler.flang | — |
FLANG_TRANSFORM_NOT_NATURAL | setoid.flang | — |
FLANG_TRANSFORM_NOT_TOTAL | compiler.flang | — |
FLANG_TRANSFORM_SHAPE | compiler.flang | — |
FLANG_TYPE | flang_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_ARGS | types.flang | — |
FLANG_TYPE_PARAM | types.flang | — |
FLANG_UNCOVERED_FAILURE | failures.flang, processes.flang | — |
FLANG_UNKNOWN | flang_cli.c | — |
FLANG_UNKNOWN_NAME | flang_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_PLAN | flang_cli.c, compiler.flang | — |
FLANG_UNKNOWN_PROCESS | processes.flang | — |
FLANG_UNPROVED | compiler.flang | — |
FLANG_UNPROVEN | flang_repl.c | — |
FLANG_VITKI | flang_repl.c | — |
FLANG_WATCH | flang_runtime.c | — |
FLANG_WATCH_TICK | flang_runtime.c | — |
FLANG_ZAKAZ | emit-from-source.flang | — |
Дальше: Prover отказал: чья это ошибка — как читать отвергнутое доказательство и когда ошибка не ваша.