forked from OSchip/llvm-project
ASTMatchers{,Macros}.h: Add some extra macros to use for decl/def of matchers
Fix ODR violations caused by using internal linkage variables in non-internal inline functions. (also removes duplicate definitions, etc) llvm-svn: 318720
This commit is contained in:
parent
76ff65eb29
commit
1de35438e4
|
@ -4803,9 +4803,9 @@ AST_MATCHER(Type, realFloatingPointType) {
|
|||
/// matches "int b[7]"
|
||||
///
|
||||
/// Usable as: Matcher<ArrayType>, Matcher<ComplexType>
|
||||
AST_TYPELOC_TRAVERSE_MATCHER(hasElementType, getElement,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
|
||||
ComplexType));
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DECL(hasElementType, getElement,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
|
||||
ComplexType));
|
||||
|
||||
/// \brief Matches C arrays with a specified constant size.
|
||||
///
|
||||
|
@ -4921,8 +4921,8 @@ extern const AstTypeMatcher<AtomicType> atomicType;
|
|||
/// matches "_Atomic(int) i"
|
||||
///
|
||||
/// Usable as: Matcher<AtomicType>
|
||||
AST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DECL(hasValueType, getValue,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
|
||||
|
||||
/// \brief Matches types nodes representing C++11 auto types.
|
||||
///
|
||||
|
@ -5115,11 +5115,10 @@ extern const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
|
|||
///
|
||||
/// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>,
|
||||
/// Matcher<PointerType>, Matcher<ReferenceType>
|
||||
AST_TYPELOC_TRAVERSE_MATCHER(pointee, getPointee,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType,
|
||||
MemberPointerType,
|
||||
PointerType,
|
||||
ReferenceType));
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DECL(
|
||||
pointee, getPointee,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
|
||||
PointerType, ReferenceType));
|
||||
|
||||
/// \brief Matches typedef types.
|
||||
///
|
||||
|
|
|
@ -367,6 +367,27 @@
|
|||
// FIXME: add a matcher for TypeLoc derived classes using its custom casting
|
||||
// API (no longer dyn_cast) if/when we need such matching
|
||||
|
||||
#define AST_TYPE_TRAVERSE_MATCHER_DECL(MatcherName, FunctionName, \
|
||||
ReturnTypesF) \
|
||||
namespace internal { \
|
||||
template <typename T> struct TypeMatcher##MatcherName##Getter { \
|
||||
static QualType (T::*value())() const { return &T::FunctionName; } \
|
||||
}; \
|
||||
} \
|
||||
extern const ::clang::ast_matchers::internal:: \
|
||||
TypeTraversePolymorphicMatcher< \
|
||||
QualType, \
|
||||
::clang::ast_matchers::internal::TypeMatcher##MatcherName##Getter, \
|
||||
::clang::ast_matchers::internal::TypeTraverseMatcher, \
|
||||
ReturnTypesF>::Func MatcherName
|
||||
|
||||
#define AST_TYPE_TRAVERSE_MATCHER_DEF(MatcherName, ReturnTypesF) \
|
||||
const ::clang::ast_matchers::internal::TypeTraversePolymorphicMatcher< \
|
||||
QualType, \
|
||||
::clang::ast_matchers::internal::TypeMatcher##MatcherName##Getter, \
|
||||
::clang::ast_matchers::internal::TypeTraverseMatcher, \
|
||||
ReturnTypesF>::Func MatcherName
|
||||
|
||||
/// \brief AST_TYPE_TRAVERSE_MATCHER(MatcherName, FunctionName) defines
|
||||
/// the matcher \c MatcherName that can be used to traverse from one \c Type
|
||||
/// to another.
|
||||
|
@ -386,6 +407,30 @@
|
|||
::clang::ast_matchers::internal::TypeTraverseMatcher, \
|
||||
ReturnTypesF>::Func MatcherName
|
||||
|
||||
#define AST_TYPELOC_TRAVERSE_MATCHER_DECL(MatcherName, FunctionName, \
|
||||
ReturnTypesF) \
|
||||
namespace internal { \
|
||||
template <typename T> struct TypeLocMatcher##MatcherName##Getter { \
|
||||
static TypeLoc (T::*value())() const { return &T::FunctionName##Loc; } \
|
||||
}; \
|
||||
} \
|
||||
extern const ::clang::ast_matchers::internal:: \
|
||||
TypeTraversePolymorphicMatcher< \
|
||||
TypeLoc, \
|
||||
::clang::ast_matchers::internal:: \
|
||||
TypeLocMatcher##MatcherName##Getter, \
|
||||
::clang::ast_matchers::internal::TypeLocTraverseMatcher, \
|
||||
ReturnTypesF>::Func MatcherName##Loc; \
|
||||
AST_TYPE_TRAVERSE_MATCHER_DECL(MatcherName, FunctionName##Type, ReturnTypesF)
|
||||
|
||||
#define AST_TYPELOC_TRAVERSE_MATCHER_DEF(MatcherName, ReturnTypesF) \
|
||||
const ::clang::ast_matchers::internal::TypeTraversePolymorphicMatcher< \
|
||||
TypeLoc, \
|
||||
::clang::ast_matchers::internal::TypeLocMatcher##MatcherName##Getter, \
|
||||
::clang::ast_matchers::internal::TypeLocTraverseMatcher, \
|
||||
ReturnTypesF>::Func MatcherName##Loc; \
|
||||
AST_TYPE_TRAVERSE_MATCHER_DEF(MatcherName, ReturnTypesF)
|
||||
|
||||
/// \brief AST_TYPELOC_TRAVERSE_MATCHER(MatcherName, FunctionName) works
|
||||
/// identical to \c AST_TYPE_TRAVERSE_MATCHER but operates on \c TypeLocs.
|
||||
#define AST_TYPELOC_TRAVERSE_MATCHER(MatcherName, FunctionName, ReturnTypesF) \
|
||||
|
|
|
@ -793,6 +793,15 @@ const AstTypeMatcher<SubstTemplateTypeParmType> substTemplateTypeParmType;
|
|||
const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
|
||||
const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
|
||||
const AstTypeMatcher<DecayedType> decayedType;
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
|
||||
ComplexType));
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasValueType,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DEF(
|
||||
pointee,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
|
||||
PointerType, ReferenceType));
|
||||
|
||||
} // end namespace ast_matchers
|
||||
} // end namespace clang
|
||||
|
|
Loading…
Reference in New Issue