<div dir="ltr">I think there was some work recently that changed how we represented lambdas, but not sure whether that affected this behavior.<div>Here, the FieldDecl of the CXXRecordDecl has a const Foo & type and it has the 'fn' as the TypeLoc - I assume the location is a bug.</div><div><br></div><div>I got there through clang-query by adding hasParent() and guessing the types, iterating between output dump, print and diag.</div><div><br></div><div>Note that the output of the class in the second query is a red herring - the first one shows that we end up there via a FieldDecl (Binding for "3").</div><div><br></div><div><span style="color:rgb(0,0,0);font-family:monospace">clang-query> m typeLoc(loc(qualType(hasDeclaration(namedDecl(hasName("Foo"))))), hasParent(typeLoc(hasParent(typeLoc(hasParent(decl(hasParent(decl().bind("4"))).bind("3"))).bind("2"))).bind("1"))) </span><br></div><div><span style="font-family:monospace">
<br></span></div><div><span style="font-family:monospace">Match #1:
<br>
<br>Binding for "1":
<br>Unable to dump values of type TypeLoc
<br>
<br>Binding for "2":
<br>Unable to dump values of type TypeLoc
<br>
<br>Binding for "3":
<br><span style="font-weight:bold;color:rgb(84,255,84)">FieldDecl</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91ee0</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">/tmp/t.cc:7:5</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(178,104,24)">col:5</span><span style="color:rgb(0,0,0)"> implicit </span><span style="color:rgb(24,178,24)">'Fn<Foo> &'</span><span style="color:rgb(0,0,0)">
</span><br>
<br>Binding for "4":
<br><span style="font-weight:bold;color:rgb(84,255,84)">CXXRecordDecl</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91c88</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">/tmp/t.cc:6:3</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(178,104,24)">col:3</span><span style="color:rgb(0,0,0)"> implicit class definition
</span><br><span style="color:rgb(24,24,178)">|-</span><span style="font-weight:bold;color:rgb(84,255,84)">DefinitionData</span><span style="color:rgb(0,0,0)"> lambda pass_in_registers trivially_copyable can_const_default_init
</span><br><span style="color:rgb(24,24,178)">| |-</span><span style="font-weight:bold;color:rgb(84,255,84)">DefaultConstructor</span><span style="color:rgb(0,0,0)">
</span><br><span style="color:rgb(24,24,178)">| |-</span><span style="font-weight:bold;color:rgb(84,255,84)">CopyConstructor</span><span style="color:rgb(0,0,0)"> simple trivial has_const_param needs_implicit implicit_has_const_param
</span><br><span style="color:rgb(24,24,178)">| |-</span><span style="font-weight:bold;color:rgb(84,255,84)">MoveConstructor</span><span style="color:rgb(0,0,0)"> exists simple trivial needs_implicit
</span><br><span style="color:rgb(24,24,178)">| |-</span><span style="font-weight:bold;color:rgb(84,255,84)">CopyAssignment</span><span style="color:rgb(0,0,0)"> trivial has_const_param needs_implicit implicit_has_const_param
</span><br><span style="color:rgb(24,24,178)">| |-</span><span style="font-weight:bold;color:rgb(84,255,84)">MoveAssignment</span><span style="color:rgb(0,0,0)">
</span><br><span style="color:rgb(24,24,178)">| `-</span><span style="font-weight:bold;color:rgb(84,255,84)">Destructor</span><span style="color:rgb(0,0,0)"> simple irrelevant trivial
</span><br><span style="color:rgb(24,24,178)">|-</span><span style="font-weight:bold;color:rgb(84,255,84)">FieldDecl</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91ee0</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">line:7:5</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(178,104,24)">col:5</span><span style="color:rgb(0,0,0)"> implicit </span><span style="color:rgb(24,178,24)">'Fn<Foo> &'</span><span style="color:rgb(0,0,0)">
</span><br><span style="color:rgb(24,24,178)">|-</span><span style="font-weight:bold;color:rgb(84,255,84)">CXXMethodDecl</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91dc0</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">line:6:21</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(178,104,24)">line:8:3</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(178,104,24)">line:6:3</span><span style="font-weight:bold;color:rgb(84,255,255)"> operator()</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(24,178,24)">'void (const Foo &) const'</span><span style="color:rgb(0,0,0)"> inline
</span><br><span style="color:rgb(24,24,178)">| |-</span><span style="font-weight:bold;color:rgb(84,255,84)">ParmVarDecl</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91ba8</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">col:7</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(178,104,24)">col:18</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(178,104,24)">col:18</span><span style="font-weight:bold;color:rgb(84,255,255)"> foo</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(24,178,24)">'const Foo &'</span><span style="color:rgb(0,0,0)">
</span><br><span style="color:rgb(24,24,178)">| `-</span><span style="font-weight:bold;color:rgb(255,84,255)">CompoundStmt</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91f30</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">col:23</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(178,104,24)">line:8:3</span><span style="color:rgb(0,0,0)">>
</span><br><span style="color:rgb(24,24,178)">|   `-</span><span style="font-weight:bold;color:rgb(255,84,255)">DeclRefExpr</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91e78</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">line:7:5</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(24,178,24)">'Fn<Foo>':'Fn<Foo>'</span><span style="color:rgb(24,178,178)"> lvalue</span><span style="color:rgb(0,0,0)"> </span><span style="font-weight:bold;color:rgb(84,255,84)">ParmVar</span><span style="color:rgb(178,104,24)"> 0x7f51ffd91980</span><span style="font-weight:bold;color:rgb(84,255,255)"> 'fn'</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(24,178,24)">'Fn<Foo> &'</span><span style="color:rgb(0,0,0)">
</span><br><span style="color:rgb(24,24,178)">`-</span><span style="font-weight:bold;color:rgb(84,255,84)">CXXDestructorDecl</span><span style="color:rgb(178,104,24)"> 0x7f51ffdc3080</span><span style="color:rgb(0,0,0)"> <</span><span style="color:rgb(178,104,24)">line:6:3</span><span style="color:rgb(0,0,0)">> </span><span style="color:rgb(178,104,24)">col:3</span><span style="color:rgb(0,0,0)"> implicit referenced</span><span style="font-weight:bold;color:rgb(84,255,255)"> ~</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(24,178,24)">'void () noexcept'</span><span style="color:rgb(0,0,0)"> inline default trivial
</span><br>
<br>Binding for "root":
<br>Unable to dump values of type TypeLoc</span></div><div><span style="font-family:monospace"><br>
</span><span style="font-family:monospace"><span style="color:rgb(0,0,0)">clang-query> set output print </span></span></div><div><br></div><div><span style="font-family:monospace">clang-query> m typeLoc(loc(qualType(hasDeclaration(namedDecl(hasName("Foo"))))), hasParent(typeLoc(hasParent(typeLoc(hasParent(decl(hasParent(decl().bind("4"))).bind("3"))).bind("2"))).bind("1")))
<br>
<br>Match #1:
<br>
<br>Binding for "1":
<br>Fn<Foo>
<br>Binding for "2":
<br>Fn<Foo> &
<br>Binding for "3":
<br>Fn<Foo> &
<br>Binding for "4":
<br>class {
<br>    inline void operator()(const Foo &foo) const     {
<br>        fn;
<br>    }
<br>}
<br>Binding for "root":
<br>Foo
<br>1 match.<br></span></div><div><br></div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 14, 2019 at 3:13 PM Eric Liu via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi,<div><br></div><div>In the following example, the captured variable `fn` is matched as a TypeLoc of Foo; `fn` outside of the lambda is not matched.</div><div>```</div><div>// test.cc</div><div><div>class Foo {};                              </div><div>  </div><div>template <typename T> struct Fn { T t; };  </div><div><br></div><div>void f(Fn<Foo> &fn) {</div><div>  [&](const Foo &foo) {</div><div>    fn;  // <--------- *** This is matched as a TypeLoc of Foo ***</div><div>  }; </div><div>}</div></div><div>```</div><div><br></div><div>clang-query> m typeLoc(loc(qualType(hasDeclaration(namedDecl(hasName("Foo"))))))</div><div>...</div><div><div>Match #2:</div><div>test.cc:7:5: note: "root" binds here</div><div>    fn;</div><div>    ^~</div></div><div>...</div><div><br></div><div>Is this a bug? If not, is there a way to filter this out? </div><div><br></div><div>Thanks,</div><div>Eric</div><div><br></div></div></div></div></div>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div></div>