Author: revane
Date: Mon Feb 25 08:49:29 2013
New Revision: 176025

URL: http://llvm.org/viewvc/llvm-project?rev=176025&view=rev
Log:
Adding hasDeclaration overload for TemplateSpecializationType

TemplateSpecializationType doesn't quite have getDecl(). Need to go
through TemplateName to get a TemplateDecl.

Added test cases for the hasDeclaration() overload for
TemplateSpecializationType. Also introduced the type matcher
templateSpecializationType() used by the new hasDeclaration() test case.

Updated LibASTMatchersReference.

Reviewers: klimek

Modified:
    cfe/trunk/docs/LibASTMatchersReference.html
    cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
    cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
    cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp

Modified: cfe/trunk/docs/LibASTMatchersReference.html
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=176025&r1=176024&r2=176025&view=diff
==============================================================================
--- cfe/trunk/docs/LibASTMatchersReference.html (original)
+++ cfe/trunk/docs/LibASTMatchersReference.html Mon Feb 25 08:49:29 2013
@@ -987,6 +987,21 @@ pointerType()
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>&gt;</td><td
 class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a 
name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt<a
 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html";>TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
+<tr><td colspan="4" class="doc" 
id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
+
+Given
+  template &lt;typename T&gt;
+  class C { };
+
+  template class C&lt;int&gt;;  A
+  C&lt;char&gt; var;            B
+
+templateSpecializationType() matches the type of the explicit
+instantiation in A and the type of the variable declaration in B.
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>&gt;</td><td
 class="name" onclick="toggle('typeLoc0')"><a 
name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>&gt;...</td></tr>
 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the 
clang AST.
 </pre></td></tr>
@@ -1166,6 +1181,21 @@ pointerType()
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Type.html";>Type</a>&gt;</td><td
 class="name" onclick="toggle('templateSpecializationType0')"><a 
name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt<a
 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;...</td></tr>
+<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches 
template specialization types.
+
+Given
+  template &lt;typename T&gt;
+  class C { };
+
+  template class C&lt;int&gt;;  A
+  C&lt;char&gt; var;            B
+
+templateSpecializationType() matches the type of the explicit
+instantiation in A and the type of the variable declaration in B.
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Type.html";>Type</a>&gt;</td><td
 class="name" onclick="toggle('type0')"><a 
name="type0Anchor">type</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Type.html";>Type</a>&gt;...</td></tr>
 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
 </pre></td></tr>
@@ -2034,8 +2064,8 @@ Usable as: Matcher&lt<a href="http://cla
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration2')"><a 
name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
-<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if 
the declaration of the type matches the given
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration3')"><a 
name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a type if 
the declaration of the type matches the given
 matcher.
 
 In addition to being usable as Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
 also usable as
@@ -2043,7 +2073,8 @@ Matcher&lt;T&gt; for any T supporting th
 subtypes of clang::Type.
 
 Usable as: Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;,
-  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;
 </pre></td></tr>
 
 
@@ -2189,8 +2220,8 @@ Example matches y in x(y)
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration3')"><a 
name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
-<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a type if 
the declaration of the type matches the given
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration4')"><a 
name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a type if 
the declaration of the type matches the given
 matcher.
 
 In addition to being usable as Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
 also usable as
@@ -2198,7 +2229,8 @@ Matcher&lt;T&gt; for any T supporting th
 subtypes of clang::Type.
 
 Usable as: Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;,
-  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;
 </pre></td></tr>
 
 
@@ -2586,8 +2618,8 @@ FIXME: Unit test this matcher
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration1')"><a 
name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
-<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if 
the declaration of the type matches the given
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration2')"><a 
name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if 
the declaration of the type matches the given
 matcher.
 
 In addition to being usable as Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
 also usable as
@@ -2595,7 +2627,8 @@ Matcher&lt;T&gt; for any T supporting th
 subtypes of clang::Type.
 
 Usable as: Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;,
-  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;
 </pre></td></tr>
 
 
@@ -2756,8 +2789,8 @@ Usable as: Matcher&lt<a href="http://cla
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration4')"><a 
name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
-<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a type if 
the declaration of the type matches the given
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration5')"><a 
name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a type if 
the declaration of the type matches the given
 matcher.
 
 In addition to being usable as Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
 also usable as
@@ -2765,7 +2798,8 @@ Matcher&lt;T&gt; for any T supporting th
 subtypes of clang::Type.
 
 Usable as: Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;,
-  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;
 </pre></td></tr>
 
 
@@ -2850,14 +2884,28 @@ classTemplateSpecializationDecl(hasAnyTe
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration0')"><a 
name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if 
the declaration of the type matches the given
+matcher.
+
+In addition to being usable as Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
 also usable as
+Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. 
various
+subtypes of clang::Type.
+
+Usable as: Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>&gt;</td><td
 class="name" onclick="toggle('loc0')"><a 
name="loc0Anchor">loc</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;
  InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the 
given inner
 QualType-matcher matches.
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration0')"><a 
name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
-<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if 
the declaration of the type matches the given
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration1')"><a 
name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if 
the declaration of the type matches the given
 matcher.
 
 In addition to being usable as Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
 also usable as
@@ -2865,7 +2913,8 @@ Matcher&lt;T&gt; for any T supporting th
 subtypes of clang::Type.
 
 Usable as: Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html";>CXXConstructExpr</a>&gt;,
-  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html";>MemberExpr</a>&gt;,
 Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html";>TypedefType</a>&gt;,
+  Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html";>TemplateSpecializationType</a>&gt;
 </pre></td></tr>
 
 

Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=176025&r1=176024&r2=176025&view=diff
==============================================================================
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Mon Feb 25 08:49:29 2013
@@ -1629,7 +1629,8 @@ unless(const M &InnerMatcher) {
 /// subtypes of clang::Type.
 ///
 /// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>,
-///   Matcher<MemberExpr>, Matcher<TypedefType>
+///   Matcher<MemberExpr>, Matcher<TypedefType>,
+///   Matcher<TemplateSpecializationType>
 inline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher,
                                      internal::Matcher<Decl> >
     hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) {
@@ -2913,6 +2914,21 @@ AST_TYPELOC_TRAVERSE_MATCHER(pointee, ge
 ///   matches "typedef int X"
 AST_TYPE_MATCHER(TypedefType, typedefType);
 
+/// \brief Matches template specialization types.
+///
+/// Given
+/// \code
+///   template <typename T>
+///   class C { };
+///
+///   template class C<int>;  // A
+///   C<char> var;            // B
+/// \code
+///
+/// \c templateSpecializationType() matches the type of the explicit
+/// instantiation in \c A and the type of the variable declaration in \c B.
+AST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType);
+
 /// \brief Matches nested name specifiers.
 ///
 /// Given

Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=176025&r1=176024&r2=176025&view=diff
==============================================================================
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h (original)
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Mon Feb 25 
08:49:29 2013
@@ -411,6 +411,15 @@ private:
     return matchesDecl(Node->getAsCXXRecordDecl(), Finder, Builder);
   }
 
+  /// \brief Gets the TemplateDecl from a TemplateSpecializationType
+  /// and returns whether the inner matches on it.
+  bool matchesSpecialized(const TemplateSpecializationType &Node,
+                          ASTMatchFinder *Finder,
+                          BoundNodesTreeBuilder *Builder) const {
+    return matchesDecl(Node.getTemplateName().getAsTemplateDecl(),
+                       Finder, Builder);
+  }
+
   /// \brief Extracts the Decl of the callee of a CallExpr and returns whether
   /// the inner matcher matches on it.
   bool matchesSpecialized(const CallExpr &Node, ASTMatchFinder *Finder,

Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=176025&r1=176024&r2=176025&view=diff
==============================================================================
--- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original)
+++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Mon Feb 25 08:49:29 2013
@@ -832,6 +832,12 @@ TEST(HasDeclaration, HasDeclarationOfTyp
   // FIXME: Add tests for other types with getDecl() (e.g. RecordType)
 }
 
+TEST(HasDeclaration, HasDeclarationOfTemplateSpecializationType) {
+  EXPECT_TRUE(matches("template <typename T> class A {}; A<int> a;",
+                      varDecl(hasType(templateSpecializationType(
+                          hasDeclaration(namedDecl(hasName("A"))))))));
+}
+
 TEST(HasType, TakesQualTypeMatcherAndMatchesExpr) {
   TypeMatcher ClassX = hasDeclaration(recordDecl(hasName("X")));
   EXPECT_TRUE(
@@ -3406,6 +3412,11 @@ TEST(TypeMatching, MatchesTypedefTypes)
                                                      hasType(typedefType()))));
 }
 
+TEST(TypeMatching, MatchesTemplateSpecializationType) {
+  EXPECT_TRUE(matches("template <typename T> class A{}; A<int>a;",
+                      templateSpecializationType()));
+}
+
 TEST(NNS, MatchesNestedNameSpecifiers) {
   EXPECT_TRUE(matches("namespace ns { struct A {}; } ns::A a;",
                       nestedNameSpecifier()));


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to