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

Eli Friedman eli.friedman at gmail.com
Wed Jun 15 14:22:26 PDT 2011


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




More information about the cfe-dev mailing list