My problem is as follows: I have a FunctionDecl d for which I know that d->isConstexpr(), so somewhere in d->getSourceRange() the token "constexpr" should appear. Now, I want to know whether that "constexpr" is from the expansion of a specific object-like macro
#define M constexpr
(whose use could be nested in some other macros, so it's important here to look into macro invocations in general).
I'm trying to traverse d->getSourceRange() with Lexer::MeasureTokenLength/SourceManager::getCharacterData to get at a token's content, then SourceLocation::getLocWithOffset to get at the next token. Which works more-or-less well. However:
* When d->getSourceRange() happens to start off within a macro expansion, I could fall off its end before reaching the declaration's end. This one is easy, I can use SourceManager::isAtEndOfImmediateMacroExpansion to climb back out of the macro expansion and continue traversal one level further out.
* But when the traversal reaches a macro invocation, I get the token of that invocation (multiple tokens in case of a function-like macro with its parentheses and arguments), without a clue that it is a macro and without a way to step into its expansion. Am I missing anything, or is there just no way to do that?
(I find at least two unanswered questions on stackoverflow that look like they ask the same question, <libclang - How to get tokens for a declaration using Clang C++ API? - Stack Overflow; and <http://stackoverflow.com/questions/36235445/clang-getting-preprocessed-characters-with-sourcelocation-sourcerange>\.\)