<div dir="ltr">Ah, is this the fix to make the doc generation script work that I broke when I was fixing ODR violations in the matcher header?<br><br>Thanks for getting to that! Sorry I didn't get around to it/fix it :/</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 17, 2018 at 8:51 AM Benjamin Kramer via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Wed Jan 17 08:50:14 2018<br>
New Revision: 322687<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=322687&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=322687&view=rev</a><br>
Log:<br>
Update dump_ast_matchers for many recent changes.<br>
<br>
The html file hasn't been updated in a long time so there are quite a<br>
few changes in there. No matchers were removed though.<br>
<br>
Modified:<br>
    cfe/trunk/docs/LibASTMatchersReference.html<br>
    cfe/trunk/docs/tools/dump_ast_matchers.py<br>
    cfe/trunk/include/clang/ASTMatchers/ASTMatchersMacros.h<br>
<br>
Modified: cfe/trunk/docs/LibASTMatchersReference.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=322687&r1=322686&r2=322687&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=322687&r1=322686&r2=322687&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/docs/LibASTMatchersReference.html (original)<br>
+++ cfe/trunk/docs/LibASTMatchersReference.html Wed Jan 17 08:50:14 2018<br>
@@ -1255,10 +1255,9 @@ NSString's "alloc". This matcher should<br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Stmt.html</a>">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html</a>">ObjCAtThrowStmt</a>&gt;...</td></tr><br>
-<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C @throw statements.<br>
+<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.<br>
<br>
-Example matches @throw<br>
-  @throw obj;<br>
+Example matches @throw obj;<br>
 </pre></td></tr><br>
<br>
<br>
@@ -1927,7 +1926,11 @@ Example matches a || b (matcher = binary<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/doxygen/classclang_1_1CXXBoolLiteralExpr.html</a>">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr><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/doxygen/classclang_1_1CXXBoolLiteralExpr.html</a>">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals5"><pre></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/doxygen/classclang_1_1CXXBoolLiteralExpr.html</a>">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const 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>
 Given<br>
@@ -1953,10 +1956,6 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><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/doxygen/classclang_1_1CXXBoolLiteralExpr.html</a>">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals5"><pre></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/doxygen/classclang_1_1CXXBoolLiteralExpr.html</a>">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr><br>
<br>
@@ -2409,7 +2408,11 @@ Example: matches the implicit cast aroun<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/doxygen/classclang_1_1CharacterLiteral.html</a>">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT  Value</td></tr><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/doxygen/classclang_1_1CharacterLiteral.html</a>">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals4"><pre></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/doxygen/classclang_1_1CharacterLiteral.html</a>">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
 Given<br>
@@ -2435,10 +2438,6 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><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/doxygen/classclang_1_1CharacterLiteral.html</a>">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals4"><pre></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/doxygen/classclang_1_1CharacterLiteral.html</a>">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr><br>
<br>
@@ -2673,7 +2672,7 @@ fieldDecl(isBitField())<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/doxygen/classclang_1_1FloatingLiteral.html</a>">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT  Value</td></tr><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/doxygen/classclang_1_1FloatingLiteral.html</a>">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
 Given<br>
@@ -2811,6 +2810,7 @@ functionDecl(isExplicitTemplateSpecializ<br>
 Usable as: Matcher&lt;<a 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;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html</a>">VarDecl</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html</a>">CXXRecordDecl</a>&gt;<br>
 </pre></td></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/doxygen/classclang_1_1FunctionDecl.html</a>">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr><br>
 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.<br>
<br>
@@ -2827,6 +2827,7 @@ varDecl(isExternC())<br>
   matches the declaration of x and y, but not the declaration of z.<br>
 </pre></td></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/doxygen/classclang_1_1FunctionDecl.html</a>">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr><br>
 <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with<br>
 the inline keyword.<br>
@@ -2974,7 +2975,11 @@ functionProtoType(parameterCountIs(3))<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/doxygen/classclang_1_1IntegerLiteral.html</a>">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT  Value</td></tr><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/doxygen/classclang_1_1IntegerLiteral.html</a>">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr><br>
+<tr><td colspan="4" class="doc" id="equals6"><pre></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/doxygen/classclang_1_1IntegerLiteral.html</a>">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.<br>
<br>
 Given<br>
@@ -3000,10 +3005,6 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><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/doxygen/classclang_1_1IntegerLiteral.html</a>">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr><br>
-<tr><td colspan="4" class="doc" id="equals6"><pre></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/doxygen/classclang_1_1IntegerLiteral.html</a>">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr><br>
<br>
@@ -3049,7 +3050,7 @@ void f() {}<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html</a>">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string  Name</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html</a>">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string  Name</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.<br>
<br>
 Supports specifying enclosing namespaces or classes by prefixing the name<br>
@@ -3798,6 +3799,7 @@ functionDecl(isExplicitTemplateSpecializ<br>
 Usable as: Matcher&lt;<a 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;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html</a>">VarDecl</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html</a>">CXXRecordDecl</a>&gt;<br>
 </pre></td></tr><br>
<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html</a>">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr><br>
 <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.<br>
<br>
@@ -3814,6 +3816,7 @@ varDecl(isExternC())<br>
   matches the declaration of x and y, but not the declaration of z.<br>
 </pre></td></tr><br>
<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html</a>">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr><br>
 <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage<br>
 class specifier ("static" keyword) written in the source.<br>
@@ -4079,7 +4082,7 @@ Example 2 (conditional binary operator):<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -4090,8 +4093,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -4214,7 +4226,7 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html</a>">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Expr.html</a>">Expr</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html</a>">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Expr.html</a>">Expr</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a<br>
 binary operator matches.<br>
 </pre></td></tr><br>
@@ -4311,7 +4323,7 @@ Example matches y in x(y)<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -4322,8 +4334,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -4505,7 +4526,7 @@ cxxNewExpr(hasArraySize(intgerLiteral(eq<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -4516,8 +4537,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -4640,7 +4670,7 @@ Example matches y in x(y)<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -4651,8 +4681,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -4676,7 +4715,18 @@ caseStmt(hasCaseConstant(integerLiteral(<br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html</a>">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Expr.html</a>">Expr</a>&gt; InnerMatcher</td></tr><br>
-<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr><br>
+<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression<br>
+or opaque value's source expression matches the given matcher.<br>
+<br>
+Example 1: matches "a string"<br>
+(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))<br>
+class URL { URL(string); };<br>
+URL url = "a string";<br>
+<br>
+Example 2: matches 'b' (matcher =<br>
+opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))<br>
+int a = b ?: 1;<br>
+</pre></td></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/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html</a>">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html</a>">TemplateArgument</a>&gt; InnerMatcher</td></tr><br>
@@ -4781,7 +4831,7 @@ with compoundStmt()<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -4792,8 +4842,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -4945,7 +5004,7 @@ declaration of d.<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1EnumType.html</a>">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1EnumType.html</a>">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -4956,8 +5015,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5293,7 +5361,7 @@ FIXME: Unit test this matcher<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html</a>">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html</a>">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5304,8 +5372,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5317,7 +5394,7 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html</a>">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html</a>">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5328,8 +5405,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5341,7 +5427,7 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><br>
 </pre></td></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/doxygen/classclang_1_1MemberExpr.html</a>">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><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/doxygen/classclang_1_1MemberExpr.html</a>">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5352,8 +5438,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5522,7 +5617,18 @@ matches the [webView ...] message invoca<br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html</a>">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Expr.html</a>">Expr</a>&gt; InnerMatcher</td></tr><br>
-<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr><br>
+<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression<br>
+or opaque value's source expression matches the given matcher.<br>
+<br>
+Example 1: matches "a string"<br>
+(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))<br>
+class URL { URL(string); };<br>
+URL url = "a string";<br>
+<br>
+Example 2: matches 'b' (matcher =<br>
+opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))<br>
+int a = b ?: 1;<br>
+</pre></td></tr><br>
<br>
<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html</a>">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt; InnerMatcher</td></tr><br>
@@ -5601,7 +5707,7 @@ declaration of b but varDecl(hasType(qua<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1QualType.html</a>">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1QualType.html</a>">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5612,8 +5718,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5673,7 +5788,7 @@ Example matches X &amp;x and const X &am<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1RecordType.html</a>">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1RecordType.html</a>">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5684,8 +5799,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5754,7 +5878,7 @@ with compoundStmt()<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Stmt.html</a>">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html</a>">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Stmt.html</a>">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html</a>">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching<br>
 alignof.<br>
 </pre></td></tr><br>
@@ -5774,7 +5898,7 @@ returnStmt(forFunction(hasName("operator<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Stmt.html</a>">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html</a>">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Stmt.html</a>">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html</a>">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching<br>
 sizeof.<br>
 </pre></td></tr><br>
@@ -5816,7 +5940,7 @@ Example matches true (matcher = hasCondi<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TagType.html</a>">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TagType.html</a>">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5827,8 +5951,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5929,7 +6062,7 @@ functionDecl(hasAnyTemplateArgument(refe<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html</a>">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html</a>">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5940,8 +6073,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5973,7 +6115,7 @@ functionDecl(hasTemplateArgument(0, refe<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html</a>">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html</a>">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -5984,8 +6126,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -5997,7 +6148,7 @@ Usable as: Matcher&lt;<a href="<a href="http://cl" rel="noreferrer" target="_blank">http://cl</a><br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt;  Matcher</td></tr><br>
+<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt;  Matcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.<br>
<br>
 Generates results for each match.<br>
@@ -6026,7 +6177,7 @@ Example matches x (matcher = expr(hasTyp<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html</a>">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html</a>">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -6037,8 +6188,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html</a>">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html</a>">CXXNewExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html</a>">DeclRefExpr</a>&gt;,<br>
@@ -6057,7 +6217,7 @@ type of the matched node.<br>
 For example, in:<br>
   class A {};<br>
   using B = A;<br>
-The matcher type(hasUniqualifeidDesugaredType(recordType())) matches<br>
+The matcher type(hasUnqualifeidDesugaredType(recordType())) matches<br>
 both B and A.<br>
 </pre></td></tr><br>
<br>
@@ -6081,7 +6241,7 @@ Example matches true (matcher = hasUnary<br>
 </pre></td></tr><br>
<br>
<br>
-<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html</a>">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html</a>">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Decl.html</a>">Decl</a>&gt;  InnerMatcher</td></tr><br>
 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node<br>
 matches the given matcher.<br>
<br>
@@ -6092,8 +6252,17 @@ The associated declaration is:<br>
 - for CXXConstructExpr, the declaration of the constructor<br>
 - for CXXNewExpr, the declaration of the operator new<br>
<br>
-Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member<br>
-function. e.g. various subtypes of clang::Type and various expressions.<br>
+For type nodes, hasDeclaration will generally match the declaration of the<br>
+sugared type. Given<br>
+  class X {};<br>
+  typedef X Y;<br>
+  Y y;<br>
+in varDecl(hasType(hasDeclaration(decl()))) the decl will match the<br>
+typedefDecl. A common use case is to match the underlying, desugared type.<br>
+This can be achieved by using the hasUnqualifiedDesugaredType matcher:<br>
+  varDecl(hasType(hasUnqualifiedDesugaredType(<br>
+      recordType(hasDeclaration(decl())))))<br>
+In this matcher, the decl will match the CXXRecordDecl of class X.<br>
<br>
 Usable as: Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html</a>">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html</a>">CallExpr</a>&gt;,<br>
   Matcher&lt;<a href="</blockquote></div>