]> granicus.if.org Git - clang/commitdiff
Adding an AST node matcher for NonTypeTemplateParmDecl objects.
authorAaron Ballman <aaron@aaronballman.com>
Mon, 5 Oct 2015 19:44:42 +0000 (19:44 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Mon, 5 Oct 2015 19:44:42 +0000 (19:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@249341 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LibASTMatchersReference.html
include/clang/ASTMatchers/ASTMatchers.h
unittests/ASTMatchers/ASTMatchersTest.cpp

index cab709e3a643f4155f5b650e14b3e34cb098510e..0d6d18d60e9ef089878c9bd6ac6de9bfd83243ae 100644 (file)
@@ -316,6 +316,16 @@ namespaceDecl()
 </pre></td></tr>\r
 \r
 \r
+<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>\r
+<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.\r
+\r
+Given\r
+  template &lt;typename T, int N&gt; struct C {};\r
+templateArgument()\r
+  matches 'N', but not 'T'.\r
+</pre></td></tr>\r
+\r
+\r
 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>\r
 <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.\r
 \r
@@ -2213,7 +2223,7 @@ Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Functi
 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>\r
 <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.\r
 \r
-Example matches f, but not g or h. The function i will not match, event when\r
+Example matches f, but not g or h. The function i will not match, even when\r
 compiled in C mode.\r
   void f(...);\r
   void g(int);\r
index cfed1fd16deb3af4dd78ecdf41ff91a5a4c78d63..8b97df6ce633c7ff04d63b0141a9ce8cb32c111f 100644 (file)
@@ -412,6 +412,18 @@ const internal::VariadicAllOfMatcher<CXXCtorInitializer> cxxCtorInitializer;
 ///   matches 'int' in C<int>.
 const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument;
 
+/// \brief Matches non-type template parameter declarations.
+///
+/// Given
+/// \code
+///   template <typename T, int N> struct C {};
+/// \endcode
+/// templateArgument()
+///   matches 'N', but not 'T'.
+const internal::VariadicDynCastAllOfMatcher<
+  Decl,
+  NonTypeTemplateParmDecl> nonTypeTemplateParmDecl;
+
 /// \brief Matches public C++ declarations.
 ///
 /// Given
index a15d6ac2be57bfb794eff58c55c6ab9171a59e98..4954402e83b39a15308d7ca46b7b036169b9f11b 100644 (file)
@@ -1172,6 +1172,13 @@ TEST(Matcher, SubstNonTypeTemplateParm) {
                       substNonTypeTemplateParmExpr()));
 }
 
+TEST(Matcher, NonTypeTemplateParmDecl) {
+  EXPECT_TRUE(matches("template <int N> void f();",
+                      nonTypeTemplateParmDecl(hasName("N"))));
+  EXPECT_TRUE(
+      notMatches("template <typename T> void f();", nonTypeTemplateParmDecl()));
+}
+
 TEST(Matcher, UserDefinedLiteral) {
   EXPECT_TRUE(matches("constexpr char operator \"\" _inc (const char i) {"
                       "  return i + 1;"