r249321 - Adding a narrowing AST matcher for FunctionDecl::isVariadic(), plus tests and documentation.

mats petersson via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 5 07:49:38 PDT 2015


On 5 October 2015 at 15:41, Aaron Ballman via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: aaronballman
> Date: Mon Oct  5 09:41:27 2015
> New Revision: 249321
>
> URL: http://llvm.org/viewvc/llvm-project?rev=249321&view=rev
> Log:
> Adding a narrowing AST matcher for FunctionDecl::isVariadic(), plus tests
> and documentation.
>
> Modified:
>     cfe/trunk/docs/LibASTMatchersReference.html
>     cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
>     cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp
>     cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
>     cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h
>
> Modified: cfe/trunk/docs/LibASTMatchersReference.html
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=249321&r1=249320&r2=249321&view=diff
>
> ==============================================================================
> --- cfe/trunk/docs/LibASTMatchersReference.html (original)
> +++ cfe/trunk/docs/LibASTMatchersReference.html Mon Oct  5 09:41:27 2015
> @@ -2210,6 +2210,18 @@ Usable as: Matcher&lt<a href="http://cla
>  </pre></td></tr>
>
>
> +<tr><td>Matcher&lt<a href="
> http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td
> class="name" onclick="toggle('isVariadic0')"><a
> name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
> +<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a
> function declaration is variadic.
> +
> +Example matches f, but not g or h. The function i will not match, event
> when
> +compiled in C mode.
> +  void f(...);
> +  void g(int);
> +  template <typename... Ts> void h(Ts...);
> +  void i();
> +</pre></td></tr>
> +
> +
>  <tr><td>Matcher&lt<a href="
> http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td
> class="name" onclick="toggle('parameterCountIs0')"><a
> name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned
> N</td></tr>
>  <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches
> FunctionDecls that have a specific parameter count.
>
>
> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=249321&r1=249320&r2=249321&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)
> +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Mon Oct  5 09:41:27
> 2015
> @@ -3255,6 +3255,20 @@ AST_POLYMORPHIC_MATCHER(isDefinition,
>    return Node.isThisDeclarationADefinition();
>  }
>
> +/// \brief Matches if a function declaration is variadic.
> +///
> +/// Example matches f, but not g or h. The function i will not match,
> even when
> +/// compiled in C mode.
> +/// \code
> +///   void f(...);
> +///   void g(int);
> +///   template <typename... Ts> void h(Ts...);
> +///   void i();
> +/// \endcode
> +AST_MATCHER(FunctionDecl, isVariadic) {
> +  return Node.isVariadic();
> +}
> +
>  /// \brief Matches the class declaration that the given method declaration
>  /// belongs to.
>  ///
>
> Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=249321&r1=249320&r2=249321&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original)
> +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Mon Oct  5 09:41:27 2015
> @@ -291,6 +291,7 @@ RegistryMaps::RegistryMaps() {
>    REGISTER_MATCHER(isStruct);
>    REGISTER_MATCHER(isTemplateInstantiation);
>    REGISTER_MATCHER(isUnion);
> +  REGISTER_MATCHER(isVariadic);
>    REGISTER_MATCHER(isVirtual);
>    REGISTER_MATCHER(isWritten);
>    REGISTER_MATCHER(labelStmt);
>
> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=249321&r1=249320&r2=249321&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original)
> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Mon Oct  5
> 09:41:27 2015
> @@ -1511,6 +1511,13 @@ TEST(Function, MatchesFunctionDeclaratio
>        notMatches("void f(int);"
>                   "template <typename T> struct S { void g(T t) { f(t); }
> };",
>                   CallFunctionF));
> +
> +  EXPECT_TRUE(matches("void f(...);", functionDecl(isVariadic())));
> +  EXPECT_TRUE(notMatches("void f(int);", functionDecl(isVariadic())));
>
Am I missing something - surely this should be EXPECT_FALSE?

--
Mats

> +  EXPECT_TRUE(notMatches("template <typename... Ts> void f(Ts...);",
> +                         functionDecl(isVariadic())));
> +  EXPECT_TRUE(notMatches("void f();", functionDecl(isVariadic())));
> +  EXPECT_TRUE(notMatchesC("void f();", functionDecl(isVariadic())));
>  }
>
>  TEST(FunctionTemplate, MatchesFunctionTemplateDeclarations) {
>
> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h?rev=249321&r1=249320&r2=249321&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h (original)
> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h Mon Oct  5 09:41:27
> 2015
> @@ -126,6 +126,13 @@ testing::AssertionResult matchesC(const
>  }
>
>  template <typename T>
> +testing::AssertionResult notMatchesC(const std::string &Code,
> +                                     const T &AMatcher) {
> +  return matchesConditionally(Code, AMatcher, false, "",
> FileContentMappings(),
> +                              "input.c");
> +}
> +
> +template <typename T>
>  testing::AssertionResult notMatchesObjC(const std::string &Code,
>                                       const T &AMatcher) {
>    return matchesConditionally(
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151005/0ab0903a/attachment.html>


More information about the cfe-commits mailing list