Skip to content

Ошибки компилятора

This content is not available in your language yet.

Здесь собраны сообщения, которые чаще всего видит начинающий. Текст каждой ошибки приведён дословно — ищите его поиском по сайту или через Ctrl+F. Имена в сообщениях ('x', 'Point', 'bump') у вас будут свои.

Mojo печатает не одну строку, а несколько: сначала error: с местом в файле, потом строки note: с подробностями. Как в них разобраться, подробно показано в главе «Как читать ошибки компилятора». Коротко:

  • Первая строка error: почти всегда и есть ответ. Номер строки и столбца после имени файла показывают, где искать.
  • error: function instantiation failed — не диагноз, а заголовок. Настоящая причина ниже, в строке note: constraint failed: …. Такие сообщения в справочнике приведены по строке note:.
  • Ошибок несколько? Исправляйте первую и собирайте заново: следующие часто оказываются её последствиями.

error: implicit declaration of 'x' is not allowed; add 'var' to declare a new name

Новое имя без var. Пишите var x = 5. Дальше менять значение можно уже без var: x = 6. → Переменные

error: use of uninitialized value 'x'

Переменную объявили, но до чтения так и не присвоили ей значение. Или значение из неё уже забрали через ^ — см. раздел «Владение и копирование». → Переменные

error: use of unknown declaration 'message'

Такого имени нет: опечатка, забытый импорт или переменная, объявленная внутри блока if или цикла, — в отличие от Python, после блока её уже нет. → Переменные

error: use of unknown declaration 'Python'; did you mean to import it from 'std.python'? Add 'from std.python import Python'

То же самое, но компилятор знает, где имя лежит, и подсказывает импорт целиком. Скопируйте его в начало файла. → Вызов Python из Mojo

error: 'fn' has been removed; use 'def' instead

Код из старой статьи. Функции теперь объявляются только через def. → Устаревшие конструкции

error: expressions must not appear at file scope; move this into a function body

Код на верхнем уровне файла, как в скрипте на Python. Исполняемый код живёт в функциях, точка входа — def main(). → Что изменилось

error: argument type must be specified

У аргумента функции нет типа. Пишите def add(a: Int, b: Int) -> Int. → Что изменилось

error: classes are not supported yet

class в Mojo нет. Используйте struct: поля объявляются заранее через var. → Структуры

error: unparenthesized lambda arguments are not supported; write them in parentheses, with types, e.g. `lambda (x: Int, y: Int) -> Int: x + y`

Аргументы лямбды берутся в скобки и получают типы: lambda (x: Int) -> Int: x + 1. → Замыкания и лямбды

error: redefinition of function 'show' with identical signature

Две функции с одним именем и одинаковыми типами аргументов. Перегрузка возможна, только если сигнатуры различаются: типами или числом аргументов. Разных имён аргументов для этого мало. → Функции

error: unable to locate module 'shapes'

Компилятор не нашёл модуль. Модуль ищется рядом с запускаемым файлом (не в текущей папке терминала!) и в путях из -I. Модуль из вложенной папки импортируется через точку: from shapes.circle import Circle. → Модули и пакеты

error: unable to locate module 'math'

Модуль стандартной библиотеки без префикса std. — так писали до Mojo 1.0. Теперь нужно from std.math import sqrt; то же для random, collections, time и остальных. → Стандартная библиотека на каждый день

error: module does not define a `main` function

Вы запускаете файл-модуль, в котором нет точки входа. Запускайте программу, которая его импортирует. mojo build пишет то же самое другими словами: module does not contain a 'main' function. → Модули и пакеты

error: expected ')' in call argument list

Самая частая причина у питониста — f-строка: print(f"x = {x}"). Префикса f Mojo не знает. Замените его на t: print(t"x = {x}"). → Строки и Unicode

error: cannot implicitly convert 'Int' value to 'Int64'

Числовые типы сами друг в друга не переходят: даже Int и Int64 — разные типы. Преобразуйте явно: Int64(x). → Система типов

error: invalid call to '__add__': value passed to 'rhs' cannot be converted from 'Int' to 'Float64'

То же для арифметики: Float64 + Int не складывается. Пишите price + Float64(count). __add__ — это метод, который стоит за оператором +. → Что изменилось

error: cannot implicitly convert 'StringLiteral["text"]' value to 'Int'

Переменная получила тип при объявлении и сменить его не может. Нужна другая переменная. Если в литерале кириллица, компилятор покажет её байтами: StringLiteral["\D1\82\D0\B5..."]. → Переменные

error: `len(String/StringSlice)` is not supported because Mojo strings are UTF-8 encoded, so a single length is ambiguous: …

Скажите, что считать: s.byte_length() — байты, len(s.codepoints()) — символы, как len в Python, len(s.graphemes()) — видимые знаки. → Строки и Unicode

error: String does not support direct positional slicing like `s[a:b]` because Mojo strings are UTF-8 encoded, …

Срез тоже требует уточнения: s[byte=a:b] — по байтам, s[codepoint=a:b] — по символам. → Строки и Unicode

note: constraint failed: negative indexing is not supported, use e.g. `x[len(x) - 1]`

Отрицательных индексов нет. Последний элемент — xs[len(xs) - 1]. → Что изменилось

error: 'Point' value has no attribute 'z'

У типа нет такого поля или метода. Поля структуры фиксированы при компиляции, добавить новое на ходу, как в Python, нельзя. → Структуры

error: 'Array[Int, Int(3)]' value has no attribute 'append'

Список без аннотации — var nums = [3, 1, 2] — стал Array фиксированной длины, а не List. Укажите тип: var nums: List[Int] = [3, 1, 2]. → Шпаргалка

note: constraint failed: Strict inequality is only defined for `Scalar`s; did you mean to use `SIMD.gt(...)`?

Операторы < и > работают только для одного числа. Вектор сравнивают поэлементно методами gt, lt, ge, le. → SIMD с нуля

error: format specifiers are not supported in t-strings; format the value manually before interpolating

t"{price:.2f}" не компилируется: спецификаторов формата в t-строках нет. Подготовьте значение прямо в скобках: t"{round(price, 2)}". → Строки и Unicode

error: invalid call to 'show': value passed to 'text' cannot be converted from 'TString[Int]' to 'String'

t-строка — ленивый шаблон, а не String. Функции, которая ждёт String, передайте String(t"..."). → Строки и Unicode

error: 'List[Int]' value has no attribute 'sort'

Метода sort у списка нет: сортирует функция sort(xs), на месте. Функции sorted тоже нет — нужна копия, делайте xs.copy() и сортируйте её. → Коллекции и итераторы

error: no matching function in call to 'min'

min и max сравнивают отдельные значения, а не элементы списка. Минимум списка ищется циклом. → Коллекции и итераторы

error: no matching function in call to 'randint'

randint в Mojo заполняет случайными числами буфер, а не возвращает одно число. Аналог питоновского random.randint(1, 6) — Int(random_si64(1, 6)). → Стандартная библиотека на каждый день

error: 'time' does not implement the '__call__' method

from std.time import time импортирует модуль, а не функцию: функции time() в Mojo нет. Для замеров — perf_counter_ns(), для текущей даты — питоновский datetime. → Стандартная библиотека на каждый день

error: expression must be mutable for in-place operator destination

Функция меняет аргумент, а он передан только для чтения — так по умолчанию. Объявите аргумент mut: def bump(mut counter: Int). → Конвенции передачи аргументов

error: invalid call to 'bump': value passed to mutable argument 'counter' must be mutable

Обратная ситуация: аргумент mut, а передано то, что менять нельзя, — например, литерал bump(5). Передайте переменную. → Конвенции передачи аргументов

error: 'mut' arguments must not have defaults

У mut-аргумента не бывает значения по умолчанию: менять нужно переменную вызывающего кода, а её по умолчанию нет. → Функции

error: function may not have multiple 'out' arguments

Аргумент out у функции может быть только один: это и есть её результат. Несколько значений возвращайте кортежем. → Конвенции передачи аргументов

error: functions must not declare both an 'out' argument and a return type

out-аргумент уже задаёт результат. Оставьте что-то одно: out или -> Тип. → Конвенции передачи аргументов

error: Could not infer capture convention of the captured value k

Вложенная def использует внешнюю переменную, а список захвата не указан. Добавьте его после скобок с аргументами: def times(x: Int) {imm k} -> Int:. → Замыкания и лямбды

error: 'c' abandoned without being explicitly destroyed: type 'Coroutine' does not conform to 'Deinitable' and must be explicitly destroyed

Вызвали async def без await, как иногда бывает в Python. Результат такого вызова — корутина, которая ещё ничего не сделала, и выбросить её молча нельзя. Добавьте await. Учтите, что async в Mojo 1.1 нестабилен. → Потоки, процессы и async

error: cannot call function that may raise in a context that cannot raise

Вызвана функция с raises — например, Int(строка) или словарь[ключ] — из функции без raises. Либо пометьте вызывающую функцию raises, либо оберните вызов в try … except. → Обработка ошибок

error: 'raise' requires a surrounding 'try' block or the enclosing function to declare 'raises'

То же для самого raise: функция, которая бросает ошибку, должна быть помечена raises. → Обработка ошибок

error: expected ':' after 'except'

Питоновское except Error as e:. Тип ошибки в except не пишут: компилятор выводит его из вызванной функции. Пишите except e:. → Обработка ошибок

error: cannot call function that may raise 'Error' in context that supports an error type of 'AgeError'

В одном try оказались вызовы с разными типами ошибок — здесь AgeError и обычный Error. Разнесите их по разным try или переупакуйте Error в свой тип. → Обработка ошибок

error: 'Error' value has no attribute 'reason'

Функция между вами и источником ошибки объявлена просто raises, и тип ошибки стёрся до Error: текст остался, полей нет. Объявите raises AgeError по всей цепочке. → Обработка ошибок

error: cannot implicitly convert 'ParseError' value to 'Error'

Из функции с голым raises брошена своя структура, которая не умеет печататься. Укажите тип в сигнатуре — raises ParseError — или добавьте структуре Writable. → Обработка ошибок

error: value of type 'List[Int]' cannot be implicitly copied, it does not conform to 'ImplicitlyCopyable'

var b = a для списка не компилируется: копия может быть дорогой, и Mojo не делает её молча. Пишите a.copy(), если нужна копия, или a^, чтобы передать владение. → Семантика значений

error: use of uninitialized value 'a'

После a^ значение ушло к новому владельцу, и в a его больше нет. Нужна копия — пишите a.copy() вместо a^. → Копирование и перемещение

error: 'Connection' value has no attribute 'copy'

Тип не копируется вовсе. Добавьте трейт Copyable в объявление структуры, если копия имеет смысл, или передавайте владение через ^. → Копирование и перемещение

error: cannot synthesize implicit copy constructor because field 'items' has non-implicitly-copyable type 'List[Int]'

Структура объявлена ImplicitlyCopyable, а одно из её полей нельзя скопировать неявно. Объявите структуру просто Copyable — тогда копия будет явной, через .copy(). → Семантика значений

error: aliasing values passed mutably to 'x' argument and passed mutably to 'y' argument in 'bump' call

Одна и та же переменная передана в два mut-аргумента сразу. Две изменяемые ссылки на одно значение Mojo запрещает. → Сравнение с Rust и C++

error: 'Square' does not implement all requirements for 'Shape'

Структура объявила трейт, но не реализовала все его методы. В строках note: ниже компилятор перечислит, каких не хватает. → Трейты и обобщённый код

error: invalid call to 'report': value passed to 's' cannot be converted from 'Rock' to 'T', argument type 'Rock' does not conform to trait 'Shape'

Обобщённая функция требует трейт, а тип его не объявил. Добавьте трейт в список после имени структуры: struct Rock(Shape) — и реализуйте его методы. → Трейты и обобщённый код

error: unqualified access to struct parameter 'T'; use 'Self.T' instead

Внутри структуры к её параметрам обращаются через Self: var item: Self.T. Следом компилятор может потребовать, чтобы значения T умели уничтожаться: field 'item' has non-'Deinitable' type 'T'. Добавьте трейт в ограничение: struct Box[T: Copyable & Deinitable]. → Структуры

error: cannot use a dynamic value in a parameter list

В квадратные скобки передано значение, известное только при запуске. Параметры должны быть известны при сборке: литерал или comptime. → Введение в метапрограммирование

error: cannot call raising function in comptime initializer

На этапе сборки нельзя вызывать функции с raises: обрабатывать исключение некому. → Вычисления на этапе компиляции

error: cannot materialize comptime value of type 'Array[Int, Int(4)]' to runtime because it is not 'ImplicitlyCopyable'

Значение этапа сборки переносится в программу явно: var table = materialize[TABLE](). → Вычисления на этапе компиляции

error: invalid call to 'pow2': violated constraint

Условие where проверено и оказалось ложным: негодное значение параметра. Исправляйте вызов. → Ограничения

error: invalid call to 'half': lacking evidence to prove correctness

Условие where компилятор не смог проверить: в нём операция, которую он не вычисляет символически, — %, //, ** или вызов функции. Перенесите проверку в comptime assert. → Ограничения

note: constraint failed: число должно быть чётным

Сработал comptime assert — в сообщении ваш собственный текст. → Вычисления на этапе компиляции

error: invalid call to 'dot': value passed to 'other' cannot be converted from 'Vec[Int(2)]' to 'Vec[Int(3)]'

Vec[2] и Vec[3] — разные типы: параметр входит в тип. Ошибка в размерах поймана при сборке, а не при запуске. → Параметризация

Эти программы компилируются, но падают во время работы.

Unhandled exception caught during execution: String is not convertible to integer with base 10: 'abc'

Int("abc") бросил исключение, и его никто не поймал. Оберните разбор в try … except. → Обработка ошибок

At: …: Assert Error: index 5 is out of bounds, valid range is 0 to 2

Индекс за пределами списка. Проверка границ включена по умолчанию, и программа останавливается сразу, с номером строки. После строки At: Mojo допишет execution crashed. → Обработка ошибок

Unhandled exception caught during execution: DictKeyError[String]()

В словаре нет такого ключа. Проверьте заранее — if key in d — или возьмите значение с запасным вариантом: d.get(key, 0). → Шпаргалка

ABORT: …: `Optional.value()` called on empty `Optional`. Consider using `if optional:` to check whether the `Optional` is empty before calling `.value()`, …

value() у пустого Optional. Проверяйте if maybe: перед чтением или используйте maybe.or_else(0). → Обработка ошибок

Unhandled exception caught during execution: EOF

input() не получил ни строки: ввод закончился (Ctrl+D) или его не было вовсе, например под отладчиком. Если ввод подаётся конвейером, в Mojo 1.1 данные получает только первый input(). Читайте такой ввод целиком через open("/dev/stdin", "r").read(). → Стандартная библиотека на каждый день

error: execution crashed

Программа упала без сообщения об исключении. Если выше нет строки At: с местом ошибки, частая причина — деление целого на ноль оператором /. Чтобы найти место, соберите программу с отладочной информацией — mojo build -O0 -g1 app.mojo -o app-debug — и запустите её. → Тестирование и отладка

Ошибки установки — mojo: command not found, GLIBC_2.34' not found, Illegal instruction, проблемы WSL — собраны в главе «Диагностика проблем». Ошибки программ для видеокарты — в главе «Первое знакомство с GPU».

Примеры проверены на Mojo 1.1.0

Тексты курса — CC BY-NC-SA 4.0, код примеров — Apache 2.0