QtCreator 4.4.1 Clang Code Model падает при попытке определить имя пространства имен, скрытое за макросами - PullRequest
0 голосов
/ 01 апреля 2019

Фон

Я хочу создать библиотеку, в которой есть некоторое взаимодействие с Qt, и хотел разработать набор инструментов для ускорения разработки моей библиотеки. Я полагаю, что использование определений макросов для моей структуры библиотеки - правильный путь, поскольку это позволило бы и мне, и потребителю библиотеки выразить наибольшее количество контроля над кодом. К сожалению, ClangCodeModel, кажется, падает при разборе, хотя я удалил все возможные флаги.

Проблема

Я определил серию макросов следующим образом:

#ifndef NAMESPACE_NAME
    #define NAMESPACE_NAME test
#endif
#ifndef BEGIN_NAMESPACE 
    #define BEGIN_NAMESPACE namespace NAMESPACE_NAME {
#endif
#ifndef END_NAMESPACE 
    #define END_NAMESPACE }
#endif
#ifndef NAMESPACE_ALIAS
    #define NAMESPACE_ALIAS te
#endif
#ifndef USE_NAMESPACE_ALIAS
    BEGIN_NAMESPACE END_NAMESPACE /* Namespace must be declared first */
    namespace NAMESPACE_ALIAS = NAMESPACE_NAME;
#endif

Я считаю этот подход предпочтительным по ряду причин, в основном из-за уровня контроля, который он позволяет мне выразить, а также из-за способности вводить уникальные идентификаторы. Этот подход позволяет мне выполнять полезные функции обслуживания, такие как вложение пространств имен, без необходимости выполнять массовый поиск и замену (пример: перемещение test пространства имен в test::math или что-то подобное может быть проблемой даже в современных IDE), которые я Я довольно часто занимаюсь этим, хотя, как известно, раньше занимался разработкой библиотек Однако использование этого общего определения даже с точки зрения только проекта вызвало сбой ClangCodeModel при каждом нажатии клавиши.

Пример

Набрав следующее:

BEGIN_NAMESPACE

struct test{};

END_NAMESPACE

Будет вызывать каждый раз сбой ClangCodeModel со следующим сообщением: Clang Code Model Error: The clangbackend process has finished unexpectedly and was restarted. Я добавил рекомендуемые переменные окружения из по этой ссылке , а libclang jsut сообщает crash detected during reparsing с трассировкой стека из libc.so.6 clone + 109 (hex : 0x6d).

Вопрос (тел; др)

Почему при добавлении макроса BEGIN_NAMESPACE и END_NAMESPACE Clang Code Model вызывает segfault? Когда код перезаписывается так, чтобы namespace NAMESPACE_NAME {} Clang Code Model больше не работал с ошибками. Что я могу сделать, чтобы это исправить? Реорганизовать мой дизайн было бы очень неудобно, но я не вижу причин, почему модель кода Clang не может анализировать определения пространства имен, скрытые за макросами.

...