Index: cfe/trunk/docs/LibASTMatchersReference.html =================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html +++ cfe/trunk/docs/LibASTMatchersReference.html @@ -1318,6 +1318,17 @@ +Matcher<TemplateName>templateNameMatcher<TemplateName>... +
Matches template name.
+
+Given
+  template <typename T> class X { };
+  X<int> xi;
+templateName()
+  matches 'X' in X<int>.
+
+ + Matcher<TypeLoc>typeLocMatcher<TypeLoc>...
Matches TypeLocs in the clang AST.
 
@@ -5353,6 +5364,19 @@ +Matcher<TemplateArgument>refersToTemplateMatcher<TemplateName> InnerMatcher +
Matches a TemplateArgument that refers to a certain template.
+
+Given
+  template<template <typename> class S> class X {};
+  template<typename T> class Y {};"
+  X<Y> xi;
+classTemplateSpecializationDecl(hasAnyTemplateArgument(
+    refersToTemplate(templateName())))
+  matches the specialization X<Y>
+
+ + Matcher<TemplateArgument>refersToTypeMatcher<QualType> InnerMatcher
Matches a TemplateArgument that refers to a certain type.
 
Index: cfe/trunk/include/clang/AST/ASTTypeTraits.h
===================================================================
--- cfe/trunk/include/clang/AST/ASTTypeTraits.h
+++ cfe/trunk/include/clang/AST/ASTTypeTraits.h
@@ -121,6 +121,7 @@
   enum NodeKindId {
     NKI_None,
     NKI_TemplateArgument,
+    NKI_TemplateName,
     NKI_NestedNameSpecifierLoc,
     NKI_QualType,
     NKI_TypeLoc,
@@ -175,6 +176,7 @@
   };
 KIND_TO_KIND_ID(CXXCtorInitializer)
 KIND_TO_KIND_ID(TemplateArgument)
+KIND_TO_KIND_ID(TemplateName)
 KIND_TO_KIND_ID(NestedNameSpecifier)
 KIND_TO_KIND_ID(NestedNameSpecifierLoc)
 KIND_TO_KIND_ID(QualType)
@@ -472,6 +474,10 @@
 
 template <>
 struct DynTypedNode::BaseConverter<
+    TemplateName, void> : public ValueConverter {};
+
+template <>
+struct DynTypedNode::BaseConverter<
     NestedNameSpecifierLoc,
     void> : public ValueConverter {};
 
Index: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
===================================================================
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
@@ -446,6 +446,17 @@
 ///   matches 'int' in C.
 const internal::VariadicAllOfMatcher templateArgument;
 
+/// \brief Matches template name.
+///
+/// Given
+/// \code
+///   template  class X { };
+///   X xi;
+/// \endcode
+/// templateName()
+///   matches 'X' in X.
+const internal::VariadicAllOfMatcher templateName;
+
 /// \brief Matches non-type template parameter declarations.
 ///
 /// Given
@@ -774,6 +785,24 @@
   return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
 }
 
+/// \brief Matches a TemplateArgument that refers to a certain template.
+///
+/// Given
+/// \code
+///   template