Замена встроенных сопрограмм в экспериментальных / возобновляемых - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь скомпилировать класс, который использует cppwinrt, используя llvm-clang 8.0.Единственный блокировщик на данный момент заключается в том, что clang не может найти реализации для сопрограммных встроенных функций, определенных в experimental/resumable.Это встроенные функции, определенные в заголовке VC ++ experimental/resumable:

extern "C" size_t _coro_resume(void *);
extern "C" void _coro_destroy(void *);
extern "C" size_t _coro_done(void *);
#pragma intrinsic(_coro_resume)
#pragma intrinsic(_coro_destroy)
#pragma intrinsic(_coro_done)

В соответствии с документацией Clang это встроенные функции в Clang:

void  __builtin_coro_resume(void *addr);
void  __builtin_coro_destroy(void *addr);
bool  __builtin_coro_done(void *addr);

Если я вручную заменю встроенные функции взаголовок с лязгами, которые он компилирует.Однако это явно не переносимое решение.Могу ли я в любом случае добиться того же результата с помощью некоторого прагматического хака или замены заголовка времени компиляции?

1 Ответ

0 голосов
/ 25 декабря 2018

Я бы хотел дать решение, но оно не подтверждено, потому что я не звонил на своем компьютере.

#ifdef __clang__
    size_t _coro_resume(void *addr) { __builtin_coro_resume(addr); return 0; }
    void _coro_destroy(void *addr) { __builtin_coro_destroy(addr); }
    size_t _coro_done(void *addr) { return __builtin_coro_done(addr) ? 1 : 0; }
#else
    extern "C" size_t _coro_resume(void *);
    extern "C" void _coro_destroy(void *);
    extern "C" size_t _coro_done(void *);
    #pragma intrinsic(_coro_resume)
    #pragma intrinsic(_coro_destroy)
    #pragma intrinsic(_coro_done)
#endif

Кажется, что возвращаемое значение функций игнорируется.

...