<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<<wbr>CXXBoolLiteral></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<<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>></<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<<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>>, Matcher<CXXBoolLiteral>,<br>
+Usable as: Matcher<<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>>, Matcher<<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>>,<br>
Matcher<<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>>, Matcher<<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>><br>
</pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher<<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>></<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<<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>></<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<<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>></<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<<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>></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<<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>></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<<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>>, Matcher<CXXBoolLiteral>,<br>
+Usable as: Matcher<<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>>, Matcher<<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>>,<br>
Matcher<<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>>, Matcher<<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>><br>
</pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher<<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>></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<<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>></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<<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>></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<<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>></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<<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>></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<<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>>, Matcher<CXXBoolLiteral>,<br>
+Usable as: Matcher<<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>>, Matcher<<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>>,<br>
Matcher<<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>>, Matcher<<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>><br>
</pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher<<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>></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<<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>></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<<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>></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<<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>>, Matcher<CXXBoolLiteral>,<br>
+Usable as: Matcher<<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>>, Matcher<<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>>,<br>
Matcher<<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>>, Matcher<<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>><br>
</pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher<<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>></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<<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>></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<<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>></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<<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>></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 '->' 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>