Модуль, не подключённый ни к чему, копит имена, которые уже заняты, — и подключить его потом нельзя
flang/self/failures.flang (344 функции) не подключён ни одним файлом дерева: это самостоятельный слой, писавшийся как второе мнение к удалённой реализации на JavaScript. Когда ведомости доказательства понадобилась написанная там проверка «это место частичной формы», подключить файл целиком не вышло: шесть его имён уже заняты модулями, которые в компилятор связаны — «Отказ», «Взять из очереди», «Скаляр как строку», «Слить имена», «Слить отказы», «Это целое число». Связывание такое отвергает, и правильно делает.
Причина не в неудачном именовании, а в том, что модуль стоял в стороне: пока его никто не подключает, столкновение имён не проявляется ничем и накапливается молча. Проверить это стоит одной командой — выписать объявленные имена файла и пересечь со списком имён всех связанных модулей.
Как обошлось. Знание переехало туда, откуда его видят оба: список из восьми частичных форм, обе проверки и счёт мест лежат теперь в flang/self/emit-c.flang — модуле, из которого и ведомость, и слой отказов уже берут работу с деревом, и который эти проверки в готовый код и ставит. failures.flang их подключает, а не держит вторую копию.
Заодно выяснилось. Список только «Имя», «Имя» в объявлении подключения — не подсказка, а отбор: берутся ровно названные функции, и всё, что они зовут, надо назвать тоже. Пропущенное имя даёт FLANG_UNKNOWN_NAME при проверке, а не при связывании, и текст говорит про «неизвестную функцию», а не про импорт.
Чем подтверждено. Ветка vypusk/mesta-proverok, коммит 8f6ebadf. Пересечение имён считалось по 27 модулям, связанным в flang/self/bootstrap/compiler.flang: 6779 имён против 164 у failures.flang, пересечение 6.
Чем ограничено. Про один файл. Сколько ещё в дереве модулей, стоящих в стороне и копящих занятые имена, не мерено.
Связано: the-type-layer-mark-never-leaves-the-compiler-so-checks-are-counted-only-inside, a-dictionary-copied-into-nine-places-drifts-silently