[cfe-commits] r160281 - /cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
Douglas Gregor
dgregor at apple.com
Tue Jul 17 14:28:30 PDT 2012
On Jul 17, 2012, at 5:20 AM, Aaron Ballman <aaron at aaronballman.com> wrote:
> On Tue, Jul 17, 2012 at 12:26 AM, Douglas Gregor <dgregor at apple.com> wrote:
>>
>> On Jul 16, 2012, at 8:45 AM, Aaron Ballman <aaron at aaronballman.com> wrote:
>>
>>> Author: aaronballman
>>> Date: Mon Jul 16 10:45:33 2012
>>> New Revision: 160281
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=160281&view=rev
>>> Log:
>>> Fixing an MSVC warning -- the compiler did not like the cast added to work around a g++ bug (it would claim to possibly emit incorrect code).
>>>
>>> Modified:
>>> cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>>
>>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=160281&r1=160280&r2=160281&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
>>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Jul 16 10:45:33 2012
>>> @@ -464,12 +464,19 @@
>>> bool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S,
>>> bool &EnqueueChildren) {
>>>
>>> +// The cast for DISPATCH_WALK is needed for older versions of g++, but causes
>>> +// problems for MSVC. So we'll skip the cast entirely for MSVC.
>>> +#if defined(_MSC_VER)
>>> + #define GCC_CAST(CLASS)
>>> +#else
>>> + #define GCC_CAST(CLASS) (bool (RecursiveASTVisitor::*)(CLASS*))
>>> +#endif
>>> +
>>> // Dispatch to the corresponding WalkUpFrom* function only if the derived
>>> // class didn't override Traverse* (and thus the traversal is trivial).
>>> - // The cast here is necessary to work around a bug in old versions of g++.
>>> #define DISPATCH_WALK(NAME, CLASS, VAR) \
>>> if (&RecursiveASTVisitor::Traverse##NAME == \
>>> - (bool (RecursiveASTVisitor::*)(CLASS*))&Derived::Traverse##NAME) \
>>> + GCC_CAST(CLASS)&Derived::Traverse##NAME) \
>>> return getDerived().WalkUpFrom##NAME(static_cast<CLASS*>(VAR)); \
>>> EnqueueChildren = false; \
>>> return getDerived().Traverse##NAME(static_cast<CLASS*>(VAR));
>>> @@ -509,6 +516,7 @@
>>> }
>>
>> This GCC_CAST thing is pretty hideous. Is there no non-macro, well-formed way to appease both compilers? Like, for example, creating a local variable of type bool (recursiveASTVisitor::*)(CLASS*)?
>
> I agree that it's not the prettiest solution, but I've not found a way
> that I'm comfortable with to appease both compilers. I can test MSVC
> easily enough, but I have no idea what older version of g++ was
> exhibiting the behavior requiring the cast in the first place, or how
> the bug manifested itself there. So I'm worried about regressing the
> issue unintentionally. At least this way, the change has minimal
> impact while solving the problem (even if it's pretty ugly).
>
> I'm open to suggestions on how to verify other changes though!
I took a stab at fixing this with r160397.
- Doug
More information about the cfe-commits
mailing list