[cfe-dev] Missing FieldDecl from macro calls and template arguments

Douglas Gregor dgregor at apple.com
Thu Jun 16 07:33:52 PDT 2011


On Jun 16, 2011, at 5:14 AM, Adrien Chauve wrote:

> 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);

As noted at

  http://clang.llvm.org/docs/InternalsManual.html#SourceLocation

a source location for a macro instantiation encodes both the spelling location (where the characters came from) and the instantiation location (where the macro was expanded). 

  - Doug



More information about the cfe-dev mailing list