On 5 October 2015 at 15:51, Aaron Ballman <aa...@aaronballman.com> wrote:
> On Mon, Oct 5, 2015 at 10:49 AM, mats petersson <m...@planetcatfish.com> > wrote: > > > > > > 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? > > EXPECT_TRUE is correct -- the test is using notMatches() instead of > matches(). > I thought I was missing something... :) -- Mats > > ~Aaron > > > > > -- > > 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