[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