Hello,
I am using CXXCtorInitializer’s method getInit() to retrieve its Init Stmt*.
The CXXCtorInitializer::Init field is described as followed:
“The argument used to initialize the base or member, which may end up constructing an object (when multiple arguments are involved).”
In my usecase I actually want to retrieve the underlying source text, that is represented by Init.
This works fine for simple Initializers using declRefExpr or integerLiterals.
Retrieving the source’s text for the Init expr returns i and 10 for the following CXXCtorInitializer:
SomeConstructor(int i):m_foo(i), m_bar(10){}
I haven’t figured out what exactly is the problem, but as far as I can tell the Init pointer appears faulty in some cases when there is a CXXConstructExpr involved.
Given:
struct T {};
struct Foo{
Foo(T t): t0(new T()), t1({}), t2(t){}
T * t0;
T t1;
T t2;
};
Retrieving the Init and it’s underlying source text returns:
for t0: “new T()” <----- as expected
for t1: “t1({})” <----- expected: “{}”
for t2: “t2(t)” <---- expected: “t”
Since the Docu states, the Init gives the *"*argument used to initialize the […] member" I think this might be a bug? Maybe I don’t retrieve the source code correctly, but in any other case it appears to work just fine.
I use the Lexer to get to the Init’s source like this, where expr is cxxCtorInitializer->getInit():
Lexer::getSourceText(CharSourceRange::getCharRange(expr->getSourceRange()), ctxt.getSourceManager(), ctxt.getLangOpts());
So is this expected behavior? If so why? And how can I get to the actual ‘Initializer’ in those cases?
Any help appreciated!