Try to eliminate GCC_CAST hack in a manner that should work for both

GCC and MSVC.

llvm-svn: 160397
This commit is contained in:
Douglas Gregor 2012-07-17 21:27:49 +00:00
parent c4eb9752d4
commit 0ea5a97dbb
1 changed files with 2 additions and 11 deletions

View File

@ -464,19 +464,11 @@ template<typename Derived>
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).
#define DISPATCH_WALK(NAME, CLASS, VAR) \
if (&RecursiveASTVisitor::Traverse##NAME == \
GCC_CAST(CLASS)&Derived::Traverse##NAME) \
if ((bool (Derived::*)(CLASS*))&RecursiveASTVisitor::Traverse##NAME == \
&Derived::Traverse##NAME) \
return getDerived().WalkUpFrom##NAME(static_cast<CLASS*>(VAR)); \
EnqueueChildren = false; \
return getDerived().Traverse##NAME(static_cast<CLASS*>(VAR));
@ -516,7 +508,6 @@ bool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S,
}
#undef DISPATCH_WALK
#undef GCC_CAST
return true;
}