Невозможно использовать выровненный `operator new` в модуле с Clang - PullRequest
7 голосов
/ 03 апреля 2019

Я экспериментирую с функцией "модулей" Clang и пытаюсь скомпилировать следующий фрагмент кода:

export module a;

#include <new>

export void *foo()
{
    return ::operator new(1, std::align_val_t(1));
}

export int main() {}

Попробуйте жить

Когда я попытался clang++ -std=c++2a -pedantic-errors -fmodules-ts --precompile -x c++-module a.cpp -o a.pcm, я получил

error: ISO C++ requires a definition in this translation unit for function 'operator new'
 because its type does not have linkage [-Werror,-Wundefined-internal-type]
a.cpp:7:14: note: used here
    return ::operator new(1, std::align_val_t(1));
         ^
1 error generated.

Удаление -pedantic-errors исправляет ошибку, но когда я пытаюсь связать полученный модуль с помощью clang++ -std=c++2a -fmodules-ts a.pcm -o a.exe, я получаю

Z:\Lander\msys2\tmp\a-cfaf65.o:a.pcm:(.text+0x10): undefined reference to
 `_ZnwyW1aESt11align_val_t'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

Это особенно раздражает, поскольку <iostream> (косвенно), похоже, полагается на выровненный operator new, поэтому я не могу использовать его и в модулях. А также некоторые другие стандартные заголовки.

Что здесь происходит?

Если это ошибка Clang, как я могу ее обойти?


My Clang - последняя версия, предоставленная MSYS2:

# clang++ --version
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-w64-windows-gnu
Thread model: posix

EDIT:

Подано отчет об ошибке , посмотрим, что получится ...

1 Ответ

3 голосов
/ 04 апреля 2019

Стандартная библиотека не является частью вашего модуля a.Так что не включайте заголовок после export module a;.Включите заголовок перед этим.

...