Создайте конструктор по умолчанию в Clang - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь извлечь AST из Clang, используя плагин, и я хотел бы получить «исходный код» для конструкторов по умолчанию.Например, в моем исходном коде у меня есть:

class T { public: T() = default; }

В Clang AST элемент getBody() объекта конструктора возвращает null.Есть ли способ получить реализацию по умолчанию как Stmt?В этом случае он вернет {}, но в общем случае это будет связано с вызовом родительских конструкторов и т. Д.

Простой пример: напишите следующее в файл:

class P { }
int main() {
  // P x;
  return 0;
}

Этот файлне будет генерировать никакого кода конструктора (вы можете сбросить AST с помощью (clang++ -Xclang -ast-dump -fsyntax-only test-ctor.cpp), но если вы раскомментируете строку P x, то та же команда сгенерирует конструктор по умолчанию:

| CXXConstructorDecl 0x562bdb879eb0 <line:5:5, col:17> col:5 used P 'void () noexcept' default trivial
| `-CompoundStmt 0x562bdb87a570 <col:17>

Спасибо!

1 Ответ

0 голосов
/ 10 января 2019

На основе этого поста и в C ++ 11,

Конструктор по умолчанию, который по умолчанию и не определен как удаленный, неявно определяется, когда он используется odr (3.2) для создания объекта его типа класса (1.8) или когда он явно задан по умолчанию после его первого объявления.

Таким образом, существует узел CXXConstructorDecl, когда в коде P x, а именно объектx создан из своего типа класса P.

...