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

Jeffrey Walton noloader at gmail.com
Wed Jun 15 15:38:16 PDT 2011


On Wed, Jun 15, 2011 at 3: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?
Xcode does not define DEBUG (ie, -DDEBUG) for debug builds; and does
not define NDEBUG (ie, -DNDEBUG) for release builds. You'll have to do
it yourself under the project's settings.

Per POSIX/IEEE, assert() calls abort(). If you want to change the
[useless] behavior, use the ASSERT below (and don't use little
assert). I'm an avid asserter - all my projects use it (from Xcode to
Visual Studio [modified] to Linux). Its my intentions to have the code
debug itself whenever possible.

Jeff

#if defined(DEBUG) || defined(_DEBUG)
#  define ASSERT(exp) { if(!(exp)) { fprintf(stderr, "Assertion
failed: %s (%d): %s\n", (strrchr(__FILE__, '/')+1), __LINE__,
__func__); raise(SIGTRAP); } }
#else
#  define ASSERT(exp)
#endif




More information about the cfe-dev mailing list