<div dir="ltr">The test seems to be failing: <div><div>llvm/tools/clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp:533: Failure</div><div>Value of: matches("double x = 1.2f;", DoubleStmt)</div><div>  Actual: false (Could not find match in "double x = 1.2f;")</div><div>Expected: true</div></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 8, 2017 at 3:00 PM, Peter Wu via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: lekensteyn<br>
Date: Thu Jun  8 17:00:58 2017<br>
New Revision: 305022<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=305022&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=305022&view=rev</a><br>
Log:<br>
[ASTMatchers] Add clang-query support for equals matcher<br>
<br>
Summary:<br>
This allows the clang-query tool to use matchers like<br>
"integerLiteral(equals(32))". For this to work, an overloaded function<br>
is added for each possible parameter type.<br>
<br>
Reviewed By: aaron.ballman<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D33094" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D33094</a><br>
<br>
Modified:<br>
    cfe/trunk/docs/<wbr>LibASTMatchersReference.html<br>
    cfe/trunk/include/clang/<wbr>ASTMatchers/ASTMatchers.h<br>
    cfe/trunk/lib/ASTMatchers/<wbr>Dynamic/Registry.cpp<br>
    cfe/trunk/unittests/<wbr>ASTMatchers/Dynamic/<wbr>RegistryTest.cpp<br>
<br>
Modified: cfe/trunk/docs/<wbr>LibASTMatchersReference.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=305022&r1=305021&r2=305022&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/docs/<wbr>LibASTMatchersReference.html?<wbr>rev=305022&r1=305021&r2=<wbr>305022&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/docs/<wbr>LibASTMatchersReference.html (original)<br>
+++ cfe/trunk/docs/<wbr>LibASTMatchersReference.html Thu Jun  8 17:00:58 2017<br>
@@ -1859,17 +1859,36 @@ Example matches a || b (matcher = binary<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<wbr>CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</<wbr>a></td><td>ValueT  Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;</<wbr>td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</<wbr>a></td><td>ValueT  Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
-Example matches true (matcher = cxxBoolLiteral(equals(true)))<br>
-  true<br>
+Given<br>
+  f('false, 3.14, 42);<br>
+characterLiteral(equals(0))<br>
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))<br>
+  match false<br>
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))<br>
+  match 3.14<br>
+integerLiteral(equals(42))<br>
+  matches 42<br>
<br>
-Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,<br>
+Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;,<br>
            Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FloatingLiteral.html</a>"><wbr>FloatingLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;<br>
 </pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;</<wbr>td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</<wbr>a></td><td>bool Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td><<wbr>/tr><br>
+<br>
+<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;</<wbr>td><td class="name" onclick="toggle('equals11')"><<wbr>a name="equals11Anchor">equals</<wbr>a></td><td>double Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td><wbr></tr><br>
+<br>
+<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;</<wbr>td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</<wbr>a></td><td>unsigned Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td><<wbr>/tr><br>
+<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXCatchStmt.html</a>"><wbr>CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')<wbr>"><a name="isCatchAll0Anchor"><wbr>isCatchAll</a></td><td></td></<wbr>tr><br>
 <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.<br>
<br>
@@ -2296,16 +2315,35 @@ Example: matches the implicit cast aroun<br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;</td><<wbr>td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</<wbr>a></td><td>ValueT  Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.<br>
+<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
-Example matches true (matcher = cxxBoolLiteral(equals(true)))<br>
-  true<br>
+Given<br>
+  f('false, 3.14, 42);<br>
+characterLiteral(equals(0))<br>
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))<br>
+  match false<br>
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))<br>
+  match 3.14<br>
+integerLiteral(equals(42))<br>
+  matches 42<br>
<br>
-Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,<br>
+Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;,<br>
            Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FloatingLiteral.html</a>"><wbr>FloatingLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;<br>
 </pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;</td><<wbr>td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</<wbr>a></td><td>bool Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td><<wbr>/tr><br>
+<br>
+<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;</td><<wbr>td class="name" onclick="toggle('equals10')"><<wbr>a name="equals10Anchor">equals</<wbr>a></td><td>double Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td><wbr></tr><br>
+<br>
+<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;</td><<wbr>td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</<wbr>a></td><td>unsigned Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td><<wbr>/tr><br>
+<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1ClassTemplateSpecializationDe<wbr>cl.html</a>"><wbr>ClassTemplateSpecializationDec<wbr>l</a>&gt;</td><td class="name" onclick="toggle('<wbr>templateArgumentCountIs0')"><a name="<wbr>templateArgumentCountIs0Anchor<wbr>">templateArgumentCountIs</a><<wbr>/td><td>unsigned N</td></tr><br>
 <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><wbr><pre>Matches if the number of template arguments equals N.<br>
<br>
@@ -2533,16 +2571,27 @@ fieldDecl(isBitField())<br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FloatingLiteral.html</a>"><wbr>FloatingLiteral</a>&gt;</td><<wbr>td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</<wbr>a></td><td>ValueT  Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.<br>
+<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
-Example matches true (matcher = cxxBoolLiteral(equals(true)))<br>
-  true<br>
+Given<br>
+  f('false, 3.14, 42);<br>
+characterLiteral(equals(0))<br>
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))<br>
+  match false<br>
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))<br>
+  match 3.14<br>
+integerLiteral(equals(42))<br>
+  matches 42<br>
<br>
-Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,<br>
+Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;,<br>
            Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FloatingLiteral.html</a>"><wbr>FloatingLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;<br>
 </pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FloatingLiteral.html</a>"><wbr>FloatingLiteral</a>&gt;</td><<wbr>td class="name" onclick="toggle('equals12')"><<wbr>a name="equals12Anchor">equals</<wbr>a></td><td>double Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td><wbr></tr><br>
+<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FunctionDecl.html</a>"><wbr>FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('<wbr>hasDynamicExceptionSpec0')"><a name="<wbr>hasDynamicExceptionSpec0Anchor<wbr>">hasDynamicExceptionSpec</a><<wbr>/td><td></td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><wbr><pre>Matches functions that have a dynamic exception specification.<br>
<br>
@@ -2805,16 +2854,35 @@ functionProtoType(<wbr>parameterCountIs(3))<br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</<wbr>a></td><td>ValueT  Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.<br>
+<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
-Example matches true (matcher = cxxBoolLiteral(equals(true)))<br>
-  true<br>
+Given<br>
+  f('false, 3.14, 42);<br>
+characterLiteral(equals(0))<br>
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))<br>
+  match false<br>
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))<br>
+  match 3.14<br>
+integerLiteral(equals(42))<br>
+  matches 42<br>
<br>
-Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,<br>
+Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CharacterLiteral.html</a>"><wbr>CharacterLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1CXXBoolLiteralExpr.html</a>"><wbr>CXXBoolLiteralExpr</a>&gt;,<br>
            Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1FloatingLiteral.html</a>"><wbr>FloatingLiteral</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;<br>
 </pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</<wbr>a></td><td>bool Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td><<wbr>/tr><br>
+<br>
+<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><<wbr>a name="equals13Anchor">equals</<wbr>a></td><td>double Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td><wbr></tr><br>
+<br>
+<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1IntegerLiteral.html</a>"><wbr>IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</<wbr>a></td><td>unsigned Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td><<wbr>/tr><br>
+<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/<wbr>doxygen/classclang_1_<wbr>1MemberExpr.html</a>">MemberExpr</<wbr>a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><<wbr>a name="isArrow0Anchor">isArrow<<wbr>/a></td><td></td></tr><br>
 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed<br>
 to '.'.<br>
<br>
Modified: cfe/trunk/include/clang/<wbr>ASTMatchers/ASTMatchers.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=305022&r1=305021&r2=305022&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/ASTMatchers/ASTMatchers.<wbr>h?rev=305022&r1=305021&r2=<wbr>305022&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/<wbr>ASTMatchers/ASTMatchers.h (original)<br>
+++ cfe/trunk/include/clang/<wbr>ASTMatchers/ASTMatchers.h Thu Jun  8 17:00:58 2017<br>
@@ -3806,14 +3806,22 @@ AST_MATCHER_P(CompoundStmt, statementCou<br>
   return Node.size() == N;<br>
 }<br>
<br>
-/// \brief Matches literals that are equal to the given value.<br>
+/// \brief Matches literals that are equal to the given value of type ValueT.<br>
 ///<br>
-/// Example matches true (matcher = cxxBoolLiteral(equals(true)))<br>
+/// Given<br>
 /// \code<br>
-///   true<br>
+///   f('\0', false, 3.14, 42);<br>
 /// \endcode<br>
+/// characterLiteral(equals(0))<br>
+///   matches '\0'<br>
+/// cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))<br>
+///   match false<br>
+/// floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))<br>
+///   match 3.14<br>
+/// integerLiteral(equals(42))<br>
+///   matches 42<br>
 ///<br>
-/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>,<br>
+/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,<br>
 ///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral><br>
 template <typename ValueT><br>
 internal::<wbr>PolymorphicMatcherWithParam1<<wbr>internal::ValueEqualsMatcher, ValueT><br>
@@ -3823,6 +3831,34 @@ equals(const ValueT &Value) {<br>
     ValueT>(Value);<br>
 }<br>
<br>
+AST_POLYMORPHIC_MATCHER_P_<wbr>OVERLOAD(equals,<br>
+                          AST_POLYMORPHIC_SUPPORTED_<wbr>TYPES(CharacterLiteral,<br>
+                                                          CXXBoolLiteralExpr,<br>
+                                                          IntegerLiteral),<br>
+                          bool, Value, 0) {<br>
+  return internal::ValueEqualsMatcher<<wbr>NodeType, ParamT>(Value)<br>
+    .matchesNode(Node);<br>
+}<br>
+<br>
+AST_POLYMORPHIC_MATCHER_P_<wbr>OVERLOAD(equals,<br>
+                          AST_POLYMORPHIC_SUPPORTED_<wbr>TYPES(CharacterLiteral,<br>
+                                                          CXXBoolLiteralExpr,<br>
+                                                          IntegerLiteral),<br>
+                          unsigned, Value, 1) {<br>
+  return internal::ValueEqualsMatcher<<wbr>NodeType, ParamT>(Value)<br>
+    .matchesNode(Node);<br>
+}<br>
+<br>
+AST_POLYMORPHIC_MATCHER_P_<wbr>OVERLOAD(equals,<br>
+                          AST_POLYMORPHIC_SUPPORTED_<wbr>TYPES(CharacterLiteral,<br>
+                                                          CXXBoolLiteralExpr,<br>
+                                                          FloatingLiteral,<br>
+                                                          IntegerLiteral),<br>
+                          double, Value, 2) {<br>
+  return internal::ValueEqualsMatcher<<wbr>NodeType, ParamT>(Value)<br>
+    .matchesNode(Node);<br>
+}<br>
+<br>
 /// \brief Matches the operator Name of operator expressions (binary or<br>
 /// unary).<br>
 ///<br>
<br>
Modified: cfe/trunk/lib/ASTMatchers/<wbr>Dynamic/Registry.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=305022&r1=305021&r2=305022&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>ASTMatchers/Dynamic/Registry.<wbr>cpp?rev=305022&r1=305021&r2=<wbr>305022&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/ASTMatchers/<wbr>Dynamic/Registry.cpp (original)<br>
+++ cfe/trunk/lib/ASTMatchers/<wbr>Dynamic/Registry.cpp Thu Jun  8 17:00:58 2017<br>
@@ -56,20 +56,24 @@ void RegistryMaps::registerMatcher(<br>
   registerMatcher(#name, internal::<wbr>makeMatcherAutoMarshall(                    \<br>
                              ::clang::ast_matchers::name, #name));<br>
<br>
+#define REGISTER_MATCHER_OVERLOAD(<wbr>name)                                        \<br>
+  registerMatcher(#name,                                                       \<br>
+      llvm::make_unique<internal::<wbr>OverloadedMatcherDescriptor>(<wbr>name##Callbacks))<br>
+<br>
 #define SPECIFIC_MATCHER_OVERLOAD(<wbr>name, Id)                                    \<br>
   static_cast<::clang::ast_<wbr>matchers::name##_Type##Id>(                         \<br>
       ::clang::ast_matchers::name)<br>
<br>
+#define MATCHER_OVERLOAD_ENTRY(name, Id)                                       \<br>
+        internal::<wbr>makeMatcherAutoMarshall(<wbr>SPECIFIC_MATCHER_OVERLOAD(<wbr>name, Id), \<br>
+                                          #name)<br>
+<br>
 #define REGISTER_OVERLOADED_2(name)                                            \<br>
   do {                                                                         \<br>
-    std::unique_ptr<<wbr>MatcherDescriptor> Callbacks[] = {                         \<br>
-        internal::<wbr>makeMatcherAutoMarshall(<wbr>SPECIFIC_MATCHER_OVERLOAD(<wbr>name, 0),  \<br>
-                                          #name),                              \<br>
-        internal::<wbr>makeMatcherAutoMarshall(<wbr>SPECIFIC_MATCHER_OVERLOAD(<wbr>name, 1),  \<br>
-                                          #name)};                             \<br>
-    registerMatcher(                                                           \<br>
-        #name,                                                                 \<br>
-        llvm::make_unique<internal::<wbr>OverloadedMatcherDescriptor>(<wbr>Callbacks));  \<br>
+    std::unique_ptr<<wbr>MatcherDescriptor> name##Callbacks[] = {                   \<br>
+        MATCHER_OVERLOAD_ENTRY(name, 0),                                       \<br>
+        MATCHER_OVERLOAD_ENTRY(name, 1)};                                      \<br>
+    REGISTER_MATCHER_OVERLOAD(<wbr>name);                                           \<br>
   } while (0)<br>
<br>
 /// \brief Generate a registry map with all the known matchers.<br>
@@ -83,7 +87,6 @@ RegistryMaps::RegistryMaps() {<br>
   // findAll<br>
   //<br>
   // Other:<br>
-  // equals<br>
   // equalsNode<br>
<br>
   REGISTER_OVERLOADED_2(callee);<br>
@@ -96,6 +99,13 @@ RegistryMaps::RegistryMaps() {<br>
   REGISTER_OVERLOADED_2(<wbr>references);<br>
   REGISTER_OVERLOADED_2(<wbr>thisPointerType);<br>
<br>
+  std::unique_ptr<<wbr>MatcherDescriptor> equalsCallbacks[] = {<br>
+      MATCHER_OVERLOAD_ENTRY(equals, 0),<br>
+      MATCHER_OVERLOAD_ENTRY(equals, 1),<br>
+      MATCHER_OVERLOAD_ENTRY(equals, 2),<br>
+  };<br>
+  REGISTER_MATCHER_OVERLOAD(<wbr>equals);<br>
+<br>
   REGISTER_MATCHER(<wbr>accessSpecDecl);<br>
   REGISTER_MATCHER(<wbr>addrLabelExpr);<br>
   REGISTER_MATCHER(alignOfExpr);<br>
<br>
Modified: cfe/trunk/unittests/<wbr>ASTMatchers/Dynamic/<wbr>RegistryTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp?rev=305022&r1=305021&r2=305022&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/unittests/<wbr>ASTMatchers/Dynamic/<wbr>RegistryTest.cpp?rev=305022&<wbr>r1=305021&r2=305022&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/unittests/<wbr>ASTMatchers/Dynamic/<wbr>RegistryTest.cpp (original)<br>
+++ cfe/trunk/unittests/<wbr>ASTMatchers/Dynamic/<wbr>RegistryTest.cpp Thu Jun  8 17:00:58 2017<br>
@@ -511,6 +511,46 @@ TEST_F(RegistryTest, ParenExpr) {<br>
   EXPECT_FALSE(matches("int i = 1;", Value));<br>
 }<br>
<br>
+TEST_F(RegistryTest, EqualsMatcher) {<br>
+  Matcher<Stmt> BooleanStmt = constructMatcher(<br>
+      "cxxBoolLiteral", constructMatcher("equals", VariantValue(true)))<br>
+      .getTypedMatcher<Stmt>();<br>
+  EXPECT_TRUE(matches("bool x = true;", BooleanStmt));<br>
+  EXPECT_FALSE(matches("bool x = false;", BooleanStmt));<br>
+  EXPECT_FALSE(matches("bool x = 0;", BooleanStmt));<br>
+<br>
+  BooleanStmt = constructMatcher(<br>
+      "cxxBoolLiteral", constructMatcher("equals", VariantValue(0)))<br>
+      .getTypedMatcher<Stmt>();<br>
+  EXPECT_TRUE(matches("bool x = false;", BooleanStmt));<br>
+  EXPECT_FALSE(matches("bool x = true;", BooleanStmt));<br>
+  EXPECT_FALSE(matches("bool x = 0;", BooleanStmt));<br>
+<br>
+  Matcher<Stmt> DoubleStmt = constructMatcher(<br>
+      "floatLiteral", constructMatcher("equals", VariantValue(1.2)))<br>
+      .getTypedMatcher<Stmt>();<br>
+  EXPECT_TRUE(matches("double x = 1.2;", DoubleStmt));<br>
+  EXPECT_TRUE(matches("double x = 1.2f;", DoubleStmt));<br>
+  EXPECT_TRUE(matches("double x = 1.2l;", DoubleStmt));<br>
+  EXPECT_TRUE(matches("double x = 12e-1;", DoubleStmt));<br>
+  EXPECT_FALSE(matches("double x = 1.23;", DoubleStmt));<br>
+<br>
+  Matcher<Stmt> IntegerStmt = constructMatcher(<br>
+      "integerLiteral", constructMatcher("equals", VariantValue(42)))<br>
+      .getTypedMatcher<Stmt>();<br>
+  EXPECT_TRUE(matches("int x = 42;", IntegerStmt));<br>
+  EXPECT_FALSE(matches("int x = 1;", IntegerStmt));<br>
+<br>
+  Matcher<Stmt> CharStmt = constructMatcher(<br>
+      "characterLiteral", constructMatcher("equals", VariantValue('x')))<br>
+      .getTypedMatcher<Stmt>();<br>
+  EXPECT_TRUE(matches("int x = 'x';", CharStmt));<br>
+  EXPECT_TRUE(matches("int x = L'x';", CharStmt));<br>
+  EXPECT_TRUE(matches("int x = u'x';", CharStmt));<br>
+  EXPECT_TRUE(matches("int x = U'x';", CharStmt));<br>
+  EXPECT_FALSE(matches("int x = 120;", CharStmt));<br>
+}<br>
+<br>
 } // end anonymous namespace<br>
 } // end namespace dynamic<br>
 } // end namespace ast_matchers<br>
<br>
<br>
______________________________<wbr>_________________<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/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>