[cfe-commits] r160281 - /cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
Aaron Ballman
aaron at aaronballman.com
Tue Jul 17 15:23:34 PDT 2012
It seems to do the trick nicely -- thanks!
~Aaron
On Tue, Jul 17, 2012 at 4:28 PM, Douglas Gregor <dgregor at apple.com> wrote:
>
> 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