Issue with CXXCtorInitializer and CXXConstructExpr


When I’m iterating the initializers of a constructor declaration (CXXConstructDecl), I access to the elements of type:


which is actually:

typedef CXXCtorInitializer* const* clang::CXXConstructorDecl::init_const_iterator

Then, to obtain the CXXConstructExpr* from the CXXCtorInitializer*, I perform a casting with:

CXXConstructExpr ce = (CXXConstructExpr)(initializer)->getInit();

This worked correctly up to now, but I found that sometimes, the casting is not doing what it was expected and the result is not right. I have detected two problems:

  1. If I have the next initializer, where the argument is not a variable or constant directly:
    When asking:
    CXXConstructExpr ce = (CXXConstructExpr)(initializer)->getInit();
    if (ce->getNumArgs() == 0)

the conditional statement is evaluated to true, when it should be evaluated to false as the constructor has one argument.

  1. Having this:

template <class Key, class T>
class MyMap : protected QMap<Key, T>

MyMap(): QMap<Key, T>() …

If I print the range of the CXXConstructExpr created from the initializer “QMap<Key, T>()”, the result is only the parentheses: (), nothing more.

The question is:

  • Is there another way to obtain the CXXConstructExpr* from the CXXCtorInitializer*?
  • Otherwise, how could I check if the object pointed by CXXConstructExpr* is formed correct? I cannot find nothing similar to “isValid” or something like that.