[cfe-dev] Missing FieldDecl from macro calls and template arguments
Adrien Chauve
adrien.chauve at gmail.com
Thu Jun 16 05:14:35 PDT 2011
On Wed, Jun 15, 2011 at 23:22, Eli Friedman <eli.friedman at gmail.com> wrote:
> On Wed, Jun 15, 2011 at 2:12 PM, Adrien Chauve <adrien.chauve at gmail.com> wrote:
>> On Wed, Jun 15, 2011 at 22:13, Eli Friedman <eli.friedman at gmail.com> wrote:
>>> On Wed, Jun 15, 2011 at 12:58 PM, Adrien Chauve <adrien.chauve at gmail.com> wrote:
>>>> On Wed, Jun 15, 2011 at 21:53, Eli Friedman <eli.friedman at gmail.com> wrote:
>>>>> On Wed, Jun 15, 2011 at 12:27 PM, Adrien Chauve <adrien.chauve at gmail.com> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I've implemented an ASTConsumer deriving from RecursiveASTVisitor to
>>>>>> rename field names. The consumer implements VisitFieldDecl and
>>>>>> VisitMemberExpr,
>>>>>> but it seems that (at least) two kinds of expressions are not visited.
>>>>>>
>>>>>> 1- First, function arguments that are instance of templates, e.g.:
>>>>>>
>>>>>> template<typename T>
>>>>>> struct Foo
>>>>>> {
>>>>>> int bar;
>>>>>>
>>>>>> void copy(const Foo<T>& other) {
>>>>>> bar = other.bar; /// bar is visited but not other.bar
>>>>>> }
>>>>>> };
>>>>>
>>>>> other.bar in this situation is a CXXDependentScopeMemberExpr, I think...
>>>>
>>>> Thanks I will definitely try that!
>>>>
>>>>>>
>>>>>> If I write the same code but with a non-template Foo struct, all bar
>>>>>> member expressions are visited.
>>>>>>
>>>>>>
>>>>>> 2- Code inside macros, e.g.:
>>>>>>
>>>>>> Foo foo;
>>>>>> foo.bar = 2; // bar is visited
>>>>>> assert(foo.bar == 2); // bar is not visited
>>>>>>
>>>>>> Do I have to get the body of the macro from the Preprocessor and make
>>>>>> something with it?
>>>>>
>>>>> Are you sure you're compiling the given file with asserts enabled?
>>>>> The expression won't show up in the AST if it gets #define'ed out.
>>>>
>>>> I didn't disable asserts with -DNDEBUG, so are they not enabled by default?
>>>
>>> If you didn't define NDEBUG, they should be enabled... not sure what's
>>> going on here. If the node is getting compiled, it should show up in
>>> the AST, though. Maybe take a look at the output of -ast-dump?
>>>
>>
>> Thanks for the tip! I'm not really familiar with the output of
>> ast-dump but it looks really nice and assert is definitely there. I'm
>> going to investigate this. Maybe it's because I filtered out the
>> expressions based on their locations. If the expression inside an
>> assert is located in assert.h, that should answer my question. I
>> thought it would be located in the source file where assert is called.
>
> How exactly are you getting the source location? There are multiple
> locations associated with an expression inside a macro instantiation.
>
> -Eli
>
I use:
bool VisitMemberExpr(MemberExpr *Node)
{
SourceLocation loc = Node->getExprLoc();
...
}
By the way, I didn't get the difference between loc and:
instanciated_loc = my_src_manager.getInstatiationLoc(loc);
Thanks,
Adrien
More information about the cfe-dev
mailing list