From: Aaron Ballman Date: Mon, 16 Jul 2012 15:45:33 +0000 (+0000) Subject: Fixing an MSVC warning -- the compiler did not like the cast added to work around... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=177f1be7fe5b7d71a791901fb83d95e18c413513;p=clang 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). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160281 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 1a61255f04..2e56a486f3 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -464,12 +464,19 @@ template bool RecursiveASTVisitor::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(VAR)); \ EnqueueChildren = false; \ return getDerived().Traverse##NAME(static_cast(VAR)); @@ -509,6 +516,7 @@ bool RecursiveASTVisitor::dataTraverseNode(Stmt *S, } #undef DISPATCH_WALK +#undef GCC_CAST return true; }