On 5 October 2015 at 15:41, Aaron Ballman via cfe-commits < cfe-commits@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<<a href="http://cla > </pre></td></tr> > > > +<tr><td>Matcher<<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<<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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits