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

Adrien Chauve adrien.chauve at gmail.com
Wed Jun 15 12:58:24 PDT 2011


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?

>
> -Eli
>

Thanks again,
Adrien




More information about the cfe-dev mailing list