[cfe-commits] r160281 - /cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
Douglas Gregor
dgregor at apple.com
Mon Jul 16 22:26:03 PDT 2012
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*)?
- Doug
More information about the cfe-commits
mailing list