Блог
[измерено в смерженном PR #778] Поддерево Zig codegen стало импортируемым, и стали достижимы 90 ранее скрытых тестов; в отчёте проверки число шагов выросло со 155 до 157, а число тестов — с 2 832 до 2 939.

Подписи на изображении — на английском.
[измерено в смерженном PR #778] Поддерево Zig codegen стало импортируемым, и стали достижимы 90 тестов, которые уже существовали, но не входили в исполняемое дерево. В отчёте проверки число шагов выросло со 155 до 157, а число тестов — с 2 832 до 2 939.
Интересен не размер диффа, а различие между гейтом, который может разобрать файл, и test root, который действительно может его запустить. Несколько ошибок Sema не давали импортировать дерево, хотя ast-check и общий format-gate продолжали считать файлы чистыми.
[отчёт проверки] В десяти местах .test_cases = .{} не хватало поля capacity после изменения ArrayListUnmanaged в Zig 0.16. Ещё в двенадцати литералах Behavior.owner не было значения по умолчанию. Это ошибки формы на этапе компиляции, не падения во время исполнения; именно они оставляли дерево codegen вне тестового графа.
После исправления объявлений src/vibeec/zig_codegen.zig стал test root. Смерженный PR сообщает о 157/157 шагах сборки и 2 939 тестах против 155/155 и 2 832 до того, как дерево стало достижимым.
Option< равна 7. Теперь на четырёх местах используется "Option<".len.[]const u8 превратил бы список строк в одну строку; соседний тест List<List<Int>> фиксирует корректный результат []const []const i64.Второй отказ важен тем, что разделяет дефект реализации и дефект ожидания. Реализация уже сохраняла вложенную структуру списков; ожидание просто не успевало дойти до проверки, которая могла бы показать ошибку.
[измерено в смерженном PR] Развёртка покрыла 558 комбинаций: 62 префикса имён behaviours и 9 фраз then. Emitter во всех случаях записал pub fn <name>() !void. Код inference вызывается из body_emitter и tests_gen, но не участвует в записи заголовка сгенерированной функции.
Это объясняет прежний отказ без заявления о незавершённом ремонте. Теперь два теста фиксируют границу: сигнатура, обещающая значение, должна в будущем иметь возвращающее тело, а текущий emitter всё ещё выдаёт !void. Подключение выведенных return types к заголовкам остаётся отдельной правкой.
[отчёт проверки] Перепись undeclared-identifier снизилась со 151 ошибки в 36 файлах до 66 ошибок; общее число ошибок упало с 354 до 272, а число отвергнутых файлов — со 100 до 94. Основной класс возник после миграции ArrayList на Zig 0.16: вызовы получили allocator-аргументы, но allocator не был связан во внешней функции.
Безопасная правка была структурной: подняться к внешней функции и использовать self.allocator, только если у функции есть self binding. Текстовая эвристика по той же строке пропускала вызовы внутри методов и могла изменить настоящий локальный allocator. Оставшиеся 66 ошибок относятся к другому классу; их оставили для чтения, а не включили в это исправление.
Смерженный PR устанавливает достижимый test root для Zig codegen, две ранее скрытые ошибки тестов, которые были исправлены или зафиксированы, и более узкую классификацию оставшихся ошибок компилятора. Это результат программного репозитория.
Поработаем вместе
Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.