Libclang C++ не может проанализировать объявление поля вложенного шаблонаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Libclang C++ не может проанализировать объявление поля вложенного шаблона

Сообщение Anonymous »

Мы хотим проанализировать следующий исходный файл:

Код: Выделить всё

#pragma once

#include "Vec3.h"

template struct Array;

struct S1
{
int S1i;
Array S1Grid;
};

struct S2
{
int S2i;
Array S2Grid;
};

struct S3
{
int S3i;
Array S3Grid;
};
Используя следующий код синтаксического анализатора:

Код: Выделить всё

#include 
#include 

static CXChildVisitResult CursorVisitorTest(CXCursor cursor, CXCursor parent, CXClientData client_data)
{
CXCursorKind Kind = clang_getCursorKind(cursor);
printf("%d %s\n", Kind, clang_getCString(clang_getCursorSpelling(cursor)));
return CXChildVisit_Recurse;
}

void Test()
{
CXIndex index = clang_createIndex(0, 0);
std::string header_path = "Example.h";
CXTranslationUnit TranslationUnit;
static const char* args[] = { "-std=c++17", "-xc++", "-DHEADER_TOOL" };
CXErrorCode error = clang_parseTranslationUnit2(
index,
header_path.c_str(),
args,
3,
nullptr,
0,
CXTranslationUnit_SingleFileParse,
&TranslationUnit
);
if (error == CXError_Success && TranslationUnit != nullptr)
{
CXCursor cursor = clang_getTranslationUnitCursor(TranslationUnit);
clang_visitChildren(cursor, &CursorVisitorTest, nullptr);
clang_disposeTranslationUnit(TranslationUnit);
}
}
Мы получили следующий результат:

Код: Выделить всё

31 Array
27 T
2 S1
6 S1i
2 S2
6 S2i
6 S2Grid
2 S3
6 S3i
6 S3Grid
45 Array
45 Array
Мы заметили, что Clang не может проанализировать S1Grid как поле. Судя по тому, что S2Grid анализируется правильно, мы подозреваем, что >> в типе S1Gird анализируется как сдвиг вправо. Интересно, что S3Grid также правильно анализируется. Вероятно, потому, что char — это встроенный тип, а Vec3 — нет?
Что мы можем сделать, чтобы правильно разобрать вложенный шаблон lib clang без ручного добавления пробела в исходном коде?
Версия Clang, возвращаемая clang_getClangVersion, — это версия clang 9.0.0 (tags/RELEASE_900/final)

Подробнее здесь: https://stackoverflow.com/questions/788 ... eclaration
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»