<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 5 October 2015 at 15:51, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com" target="_blank">aaron@aaronballman.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Oct 5, 2015 at 10:49 AM, mats petersson <<a href="mailto:mats@planetcatfish.com">mats@planetcatfish.com</a>> wrote:<br>
><br>
><br>
> On 5 October 2015 at 15:41, Aaron Ballman via cfe-commits<br>
> <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> Author: aaronballman<br>
>> Date: Mon Oct  5 09:41:27 2015<br>
>> New Revision: 249321<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=249321&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=249321&view=rev</a><br>
>> Log:<br>
>> Adding a narrowing AST matcher for FunctionDecl::isVariadic(), plus tests<br>
>> and documentation.<br>
>><br>
>> Modified:<br>
>>     cfe/trunk/docs/LibASTMatchersReference.html<br>
>>     cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h<br>
>>     cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp<br>
>>     cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp<br>
>>     cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h<br>
>><br>
>> Modified: cfe/trunk/docs/LibASTMatchersReference.html<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=249321&r1=249320&r2=249321&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=249321&r1=249320&r2=249321&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- cfe/trunk/docs/LibASTMatchersReference.html (original)<br>
>> +++ cfe/trunk/docs/LibASTMatchersReference.html Mon Oct  5 09:41:27 2015<br>
>> @@ -2210,6 +2210,18 @@ Usable as: Matcher&lt<a href="<a href="http://cla" rel="noreferrer" target="_blank">http://cla</a><br>
>>  </pre></td></tr><br>
>><br>
>><br>
>> +<tr><td>Matcher&lt<a<br>
>> href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html</a>">FunctionDecl</a>&gt;</td><td<br>
>> class="name" onclick="toggle('isVariadic0')"><a<br>
>> name="isVariadic0Anchor">isVariadic</a></td><td></td></tr><br>
>> +<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a<br>
>> function declaration is variadic.<br>
>> +<br>
>> +Example matches f, but not g or h. The function i will not match, event<br>
>> when<br>
>> +compiled in C mode.<br>
>> +  void f(...);<br>
>> +  void g(int);<br>
>> +  template &lt;typename... Ts&gt; void h(Ts...);<br>
>> +  void i();<br>
>> +</pre></td></tr><br>
>> +<br>
>> +<br>
>>  <tr><td>Matcher&lt<a<br>
>> href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html</a>">FunctionDecl</a>&gt;</td><td<br>
>> class="name" onclick="toggle('parameterCountIs0')"><a<br>
>> name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned<br>
>> N</td></tr><br>
>>  <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches<br>
>> FunctionDecls that have a specific parameter count.<br>
>><br>
>><br>
>> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=249321&r1=249320&r2=249321&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=249321&r1=249320&r2=249321&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)<br>
>> +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Mon Oct  5 09:41:27<br>
>> 2015<br>
>> @@ -3255,6 +3255,20 @@ AST_POLYMORPHIC_MATCHER(isDefinition,<br>
>>    return Node.isThisDeclarationADefinition();<br>
>>  }<br>
>><br>
>> +/// \brief Matches if a function declaration is variadic.<br>
>> +///<br>
>> +/// Example matches f, but not g or h. The function i will not match,<br>
>> even when<br>
>> +/// compiled in C mode.<br>
>> +/// \code<br>
>> +///   void f(...);<br>
>> +///   void g(int);<br>
>> +///   template <typename... Ts> void h(Ts...);<br>
>> +///   void i();<br>
>> +/// \endcode<br>
>> +AST_MATCHER(FunctionDecl, isVariadic) {<br>
>> +  return Node.isVariadic();<br>
>> +}<br>
>> +<br>
>>  /// \brief Matches the class declaration that the given method<br>
>> declaration<br>
>>  /// belongs to.<br>
>>  ///<br>
>><br>
>> Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=249321&r1=249320&r2=249321&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=249321&r1=249320&r2=249321&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original)<br>
>> +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Mon Oct  5 09:41:27<br>
>> 2015<br>
>> @@ -291,6 +291,7 @@ RegistryMaps::RegistryMaps() {<br>
>>    REGISTER_MATCHER(isStruct);<br>
>>    REGISTER_MATCHER(isTemplateInstantiation);<br>
>>    REGISTER_MATCHER(isUnion);<br>
>> +  REGISTER_MATCHER(isVariadic);<br>
>>    REGISTER_MATCHER(isVirtual);<br>
>>    REGISTER_MATCHER(isWritten);<br>
>>    REGISTER_MATCHER(labelStmt);<br>
>><br>
>> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=249321&r1=249320&r2=249321&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=249321&r1=249320&r2=249321&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original)<br>
>> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Mon Oct  5<br>
>> 09:41:27 2015<br>
>> @@ -1511,6 +1511,13 @@ TEST(Function, MatchesFunctionDeclaratio<br>
>>        notMatches("void f(int);"<br>
>>                   "template <typename T> struct S { void g(T t) { f(t); }<br>
>> };",<br>
>>                   CallFunctionF));<br>
>> +<br>
>> +  EXPECT_TRUE(matches("void f(...);", functionDecl(isVariadic())));<br>
>> +  EXPECT_TRUE(notMatches("void f(int);", functionDecl(isVariadic())));<br>
><br>
> Am I missing something - surely this should be EXPECT_FALSE?<br>
<br>
</div></div>EXPECT_TRUE is correct -- the test is using notMatches() instead of matches().<br></blockquote><div><br></div><div>I thought I was missing something... :)<br><br>--<br></div><div>Mats <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
~Aaron<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
><br>
> --<br>
> Mats<br>
>><br>
>> +  EXPECT_TRUE(notMatches("template <typename... Ts> void f(Ts...);",<br>
>> +                         functionDecl(isVariadic())));<br>
>> +  EXPECT_TRUE(notMatches("void f();", functionDecl(isVariadic())));<br>
>> +  EXPECT_TRUE(notMatchesC("void f();", functionDecl(isVariadic())));<br>
>>  }<br>
>><br>
>>  TEST(FunctionTemplate, MatchesFunctionTemplateDeclarations) {<br>
>><br>
>> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h?rev=249321&r1=249320&r2=249321&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h?rev=249321&r1=249320&r2=249321&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h (original)<br>
>> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h Mon Oct  5 09:41:27<br>
>> 2015<br>
>> @@ -126,6 +126,13 @@ testing::AssertionResult matchesC(const<br>
>>  }<br>
>><br>
>>  template <typename T><br>
>> +testing::AssertionResult notMatchesC(const std::string &Code,<br>
>> +                                     const T &AMatcher) {<br>
>> +  return matchesConditionally(Code, AMatcher, false, "",<br>
>> FileContentMappings(),<br>
>> +                              "input.c");<br>
>> +}<br>
>> +<br>
>> +template <typename T><br>
>>  testing::AssertionResult notMatchesObjC(const std::string &Code,<br>
>>                                       const T &AMatcher) {<br>
>>    return matchesConditionally(<br>
>><br>
>><br>
>> _______________________________________________<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
><br>
><br>
</div></div></blockquote></div><br></div></div>