<div dir="ltr">Now with the right cfe-dev<br><br><div class="gmail_quote"><div dir="ltr">On Fri, Oct 28, 2016 at 4:14 PM Manuel Klimek <<a href="mailto:klimek@google.com">klimek@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Somehow we lost cfe-dev on this mail thread :( :(<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">adding Aaron, who has also contributed to that part of the code</div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Fri, Oct 28, 2016 at 4:11 PM Manuel Klimek <<a href="mailto:klimek@google.com" class="gmail_msg" target="_blank">klimek@google.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Fri, Oct 28, 2016 at 3:54 PM Łukasz Anforowicz <<a href="mailto:lukasza@google.com" class="gmail_msg" target="_blank">lukasza@google.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Some notes from me (that hopefully will helpful to consider during the meeting):<div class="gmail_msg"><ul class="gmail_msg"><li class="gmail_msg">I agree that forcing hasDeclaration to consider all subclasses of Types (i.e. forcing via #include "clang/AST/TypeNodes.def" in the proposal below) seems to be a good thing.  The subset of types supported today seems to be rather arbitrary (I think;  please let me know if there is good reasoning + a way to describe the currently chosen subset of supported types).</li><li class="gmail_msg">As a user of hasDeclaration, I have to "manually" drill through *some* can paints today.  For example in <a href="https://codereview.chromium.org/2256913002/patch/180001/190001" class="gmail_msg" target="_blank">https://codereview.chromium.org/2256913002/patch/180001/190001</a> I am manually jumping over pointers and references (what I want to do is to tell whether a member dereference will end up using one of "my" classdecls where I am renaming methods and fields) - see |blink_qual_type_matcher| in that Chromium code review.  Manually stripping pointers and references is doable but 1) it is easy to get wrong (i.e. strip only one level) and 2) it is questionable whether other required stripping is not missed (i.e. auto type?),</li><li class="gmail_msg">Today hasDeclaration doesn't match "the outermost can in our russian doll" as suggested (or proposed) by Manual.  Today desugaring is done in an arbitrary order of types - some (deep) types will be preferred over other (shallow) types as shown in an <a href="https://docs.google.com/document/d/1y1F6uKdulluYBFch680g6bmHe_zDe8mHFYjfXRoakNI/edit#heading=h.teax79qcqv70" class="gmail_msg" target="_blank">example</a> in the separate doc.  In the example, even though the typeAliasDecl is the most shallow desugaring result, it will *never* be matched because hasDeclaration will first try (and latch onto) other types first.</li><li class="gmail_msg">"has" vs "hasDescendant" is not a perfectly valid analogy.  "hasDeclaration" is not like "has" today, because even today it can strip multiple layers of sugar (see the example from the previous bullet item).<br class="gmail_msg"></li></ul><div class="gmail_msg">So:</div></div><div class="gmail_msg"><ul class="gmail_msg"><li class="gmail_msg">I would vote to make "hasDeclaration" match at every desugaring level (i.e. without splitting it into a "has" and a "hasDescendant"-like variant).  Having "hasDeclaration" and "eventuallyDesugarsToDeclaration" ("hasDeepDeclaration"?) sounds like an okay option, but it seems to me that even today 1) hasDeclaration code and 2) users of hasDeclaration, behave like or expect behavior of "eventuallyDesugarsToDeclaration"</li></ul></div></div></blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">I'm still looking into where we made the fundamental error that we're running into those discussions now. There should be something simpler so that the behavior more clearly matches the design of the clang AST.<br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><ul class="gmail_msg"><li class="gmail_msg">I hope that the discussion of "hasDeclaration" vs "hasDeepDeclaration" can be independent from, and not block the fixes from <a href="https://reviews.llvm.org/D24361" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24361</a> (i.e. being able to land them in the next 1-2 would be great). </li></ul></div></div></blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">As Richard noted on the doc, it really depends on which direction we want to go in, and whether the patch is a step in the right direction. Sorry :(</div><div class="gmail_msg">But please continue pinging / making sure we drive this forward - I think this is important, and I'm happy to spend some time to make sure we get this right, and thanks for all the work you've already put into this, I really appreciate it, and I think it's helping us getting to the root of the problem.</div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg">On Thu, Oct 27, 2016 at 1:12 AM, Manuel Klimek <span dir="ltr" class="gmail_msg"><<a href="mailto:klimek@google.com" class="gmail_msg" target="_blank">klimek@google.com</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">+ben & sam<br class="gmail_msg"></div><div dir="ltr" class="gmail_msg"><br class="gmail_msg"></div><div dir="ltr" class="gmail_msg">On Wed, Oct 26, 2016 at 6:50 PM Łukasz Anforowicz <<a href="mailto:lukasza@google.com" class="gmail_msg" target="_blank">lukasza@google.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On Wed, Oct 26, 2016 at 9:46 AM, Łukasz Anforowicz <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:lukasza@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">lukasza@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">So - is it fair to say that the CL under review can proceed as-is (*) given that:</div><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><ul class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">The ordering problem has existed *before* the CL under review (admittedly the CL under review adds 2 more cases to the list of problematic ordering scenarios)</li><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Below it seems that we have a promising direction for solving the ordering problem (the solution probably requires a slightly bigger CL - one that also tackles the question of what hasDeclaration should do about AutoType, PointerType, etc.)</li></ul></div><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">-Lukasz</div><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">(*) I know that I need to add documentation changes to mention ElaboratedType</div><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On Tue, Oct 25, 2016 at 5:02 PM, Richard Smith <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:richardsmith@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">richardsmith@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On 25 October 2016 at 16:47, Łukasz Anforowicz <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:lukasza@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">lukasza@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I think I understand the concern - the concern is that desugaring done in HasDeclarationMatcher::matchesSpecialized(const QualType&, ...) *latches* onto desugared types in *arbitrary* order.  I agree that this is a problem (most obvious for me for the <a href="https://docs.google.com/document/d/1y1F6uKdulluYBFch680g6bmHe_zDe8mHFYjfXRoakNI/edit#heading=h.teax79qcqv70" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">typeAliasDecl and classTemplateSpecializationDecl case</a>).  I agree that the CL adds a new case to the set of ordered desugaring attempts done by this method (and therefore can be seen as making the old problem slightly worse).  <div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I think this problem can be fixed by getting rid of the *order* inside HasDeclarationMatcher::matchesSpecialized(const QualType&, ...) - instead of:</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">if (auto *TD = Node->getAsTagDecl())</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  return matchesDecl(TD, Finder, Builder);</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">else if (auto *TT = Node->getAs<TypedefType>())</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  return matchesDecl(TT->getDecl(), Finder, Builder);</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">/* the CL under review would add ElaboratedType and</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">   TemplateSpecializationType somewhere here */</div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">...<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">else if (auto *ICNT = Node->getAs<InjectedClassNameType>())</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  return matchesDecl(ICNT->getDecl(), Finder, Builder);</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">return false;</div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">have something like this:</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (auto *TD = Node->getAsTagDecl()) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      if (matchesDecl(TD, Finder, Builder))</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        return true;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (auto *TT = Node->getAs<TypedefType>()) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      if (matchesDecl(TT->getDecl(), Finder, Builder))</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        return true;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (auto *ET = Node->getAs<ElaboratedType>()) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      if (matchesSpecialized(ET->getNamedType(), Finder, Builder))</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        return true;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (auto *TST = Node->getAs<TemplateSpecializationType>()) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      if (matchesSpecialized(*TST, Finder, Builder))</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        return true;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">...<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (auto *ICNT = Node->getAs<InjectedClassNameType>()) {<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      if (matchesDecl(ICNT->getDecl(), Finder, Builder))</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        return true;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    return false;</div></div></blockquote></div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I think this is an interesting idea. It would certainly address my concerns. (You'd actually want something slightly different from the above, I think: given</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  typedef int A;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  typedef A B;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  B x;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">... varDecl(hasType(qualType(hasDeclaration(typedefNameDecl().bind("TD"))))) should match x /twice/: once with TD pointing at A and once with it pointing at B. So you probably want to repeatedly single-step desugar the type and try extracting a declaration from each level of type sugar.)</div></div></div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Oh, good point - I haven't thought about this scenario.  I think this direction (based on getAsSuger from Type.cpp) look promising (passes a test with 2 chained typedefs):</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">template <typename T, typename DeclMatcherT></div></div></div></div><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">class HasDeclarationMatcher : public WrapperMatcherInterface<T> {</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">...</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  /// \brief Extracts the TagDecl of a QualType and returns whether the inner</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  /// matcher matches on it.</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  bool matchesSpecialized(const <b class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">QualType</b> &Node, ASTMatchFinder *Finder,</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">                          BoundNodesTreeBuilder *Builder) const {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (Node.isNull())</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      return false;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    // Do not use getAs<TemplateTypeParmType> instead of the direct dyn_cast.</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    // Calling getAs will return the canonical type, but that type does not</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    // store a TemplateTypeParmDecl. We *need* the uncanonical type, if it is</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    // available, and using dyn_cast ensures that.</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    if (auto *TTP = dyn_cast<TemplateTypeParmType>(Node.getTypePtr())) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      if (matchesDecl(TTP->getDecl(), Finder, Builder))</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        return true;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    const Type* Cur = Node.getTypePtr();</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    while (Cur) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      switch (Cur->getTypeClass()) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">#define ABSTRACT_TYPE(Class, Parent)</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">#define TYPE(Class, Parent) \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      case Type::Class: { \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        const Class##Type *Ty = cast<Class##Type>(Cur); \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        if (matchesSpecialized(*Ty, Finder, Builder)) \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">          return true; \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        if (!Ty->isSugared()) return false; \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        Cur = Ty->desugar().getTypePtr(); \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">        break; \</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">#include "clang/AST/TypeNodes.def"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    }</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">    return false;</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  }</div></div></div></div></blockquote><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></div></div></div></blockquote></div></div></div><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">BTW: I have to note that the code above is potentially O(N^2) where N is the length of the desugaring chain (because each desugaring step can potentially call back into the QualType overload).  This is obviously suboptimal.  We probably need to discuss this when we review / talk about landing something like this.</div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">It's basically the same difference between has() and hasDescendant.</div><div class="gmail_msg">I think</div><div class="gmail_msg">a) if we go that route, we should make it explicit by having a matcher that has it in its name</div><div class="gmail_msg">b) we need to be able to memoize at each step, so this needs to become part of the visitor interface of the matchers; given the sheer number of types this seems like it'll get rather complex</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I'll make sure to discuss this with Richard etc al in person next week when we're at LLVM conf.</div><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"> </div><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">but it opens a whole bunch of questions - what to do with other types - for example should hasDeclaration "jump over / drill holes in paint cans" for:</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><ul class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">AutoType, TypeOfExprType, DecltypeType, TypeOfType <br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></li><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">LValueReferenceType, ValueReferenceType</li><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">PointerType, ReferenceType</li><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">And all the other types where I had to add a matchSpecialized overload for so that things compile (some of these obviously don't have a decl [and therefore shouldn't match hasDeclaration(...)] - like BuiltinType, but I am listing all of them for completeness): AtomicType, PipeType, ObjCObjectPointerType, ObjCObjectType, PackExpansionType, DependentTemplateSpecializationType, DependentNameType, AttributedType, UnaryTransformType, SubstTemplateTypeParmPackType, SubstTemplateTypeParmType, AdjustedType, DecayedType, ParenType, FunctionNoProtoType, FunctionProtoType, ExtVectorType, VectorType, DependentSizedExtVectorType, DependentSizedArrayType, VariableArrayType, IncompleteArrayType, ConstantArrayType, MemberPointerType, BlockPointerType, ComplexType, BuiltinType, </li></ul><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Also - I am not quite sure if I understand if special-casing of TemplateTypeParmType is needed.  It probably is (because here we use dyn_cast rather than cast).  At any rate drilling into details here can probably wait until a real review in Phabricator...</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"> </div><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">The code above passes all tests from the clang-test ninja target + results in the following behavior for the 2 cases pointed out in an email:</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">TEST(HasDeclaration, Case1FromEmail) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  std::string input =</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "template<typename T>\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "class Template {\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      " public:\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "  void Method() {}\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "};\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "template <typename U>\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "void Function(Template<U> param) {\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "  param.Method();\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "};\n";</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  // param type has-declaration matches class template decl?</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  EXPECT_TRUE(matches(input, parmVarDecl(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasName("param"),</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasType(qualType(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">          hasDeclaration(decl(classTemplateDecl(hasName("Template")))))))));</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  // param type has-declaration matches class decl?</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  EXPECT_FALSE(matches(input, parmVarDecl(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasName("param"),</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasType(qualType(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">          hasDeclaration(decl(cxxRecordDecl(hasName("Template")))))))));</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">}</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">TEST(HasDeclaration, Case2FromEmail) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  std::string input =</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "template<typename T>\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "class Template {\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      " public:\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "  void Method() {}\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "};\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "void Function(Template<int> param) {\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "  param.Method();\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "};\n";</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  // param type has-declaration matches class template decl?</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  EXPECT_TRUE(matches(input, parmVarDecl(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasName("param"),</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasType(qualType(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">          hasDeclaration(decl(classTemplateDecl(hasName("Template")))))))));</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  // param type has-declaration matches class decl?</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  EXPECT_TRUE(matches(input, parmVarDecl(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasName("param"),</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasType(qualType(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">          hasDeclaration(decl(cxxRecordDecl(hasName("Template")))))))));</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">}</div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></blockquote></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">If the test expectations above look reasonable, then we can just discuss how to land the code changes above (e.g. as a single CL or 2 CLs - I would prefer 2 separate CLs).  Otherwise, let's talk about the test expectations - what should they look like / how should they be different from the test snippet above?</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></div><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On Tue, Oct 25, 2016 at 1:42 PM, Richard Smith <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:richardsmith@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">richardsmith@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On 25 October 2016 at 01:57, Manuel Klimek <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:klimek@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">klimek@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-h5 m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On Tue, Oct 25, 2016 at 3:25 AM Richard Smith <<a href="mailto:richardsmith@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">richardsmith@google.com</a>> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On 24 October 2016 at 16:41, Łukasz Anforowicz <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:lukasza@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">lukasza@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I am not sure if we are making progress, but so far, we have seen 1) test cases that are broken and fixed by the CL under review and 2) test cases that are not changed by the CL under review and 3) no test cases that are made worse by the CL under review.  I've tried to gather the scenarios and the associated test cases in <a href="https://docs.google.com/document/d/1y1F6uKdulluYBFch680g6bmHe_zDe8mHFYjfXRoakNI/edit" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">https://docs.google.com/document/d/1y1F6uKdulluYBFch680g6bmHe_zDe8mHFYjfXRoakNI/edit</a>.  Could you please take a look and shout if I misrepresented anything (i.e. whether we agree that a specific test scenario shows a bug).<div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I've also added some comments below / inline.<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><span class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail- m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On Mon, Oct 24, 2016 at 3:54 PM, Richard Smith <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:richardsmith@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">richardsmith@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-m_713380783943109327gmail-h5 m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On 24 October 2016 at 15:25, Łukasz Anforowicz <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:lukasza@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">lukasza@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-m_713380783943109327gmail-m_9187172870018739585h5 m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On Mon, Oct 24, 2016 at 2:21 PM, Richard Smith <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:richardsmith@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">richardsmith@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><span class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-m_713380783943109327gmail-m_9187172870018739585m_2292074263157205842gmail- m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">On 24 October 2016 at 11:23, Łukasz Anforowicz <span dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><<a href="mailto:lukasza@google.com" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">lukasza@google.com</a>></span> wrote:<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I've run a few more experiments and I see that before any changes:<div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><ul class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">(1) Presence of ElaboratedType means that hasDeclaration doesn’t match *anything*.  This is clearly wrong.  I still want to fix that.<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></li><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">(2) Both examples from Richard’s email consistently match the class template decl (and not the class decl).  If Richard’s expectations are not met *prior* to my CL, then I don’t think these expectations should be fixed by my CL.</li><ul class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">OTOH, maybe it is worth to open a bug to investigate this more - personally I would argue that hasDeclaration should match *any* decl - for example any of type alias / template class decl / class decl.</li></ul><li class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">(3) If desugaring can result in both TemplateSpecializationType and TypedefType, then only one is arbitrarily picked - see test case TypedefTypeAndTemplateSpecializationTypeAreBothHere.  Again - this problem exists *prior* to my CL.<br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></li></ul></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">So - my plan right now is to just simplify/revert my patches so they only fix (1).  I don't think discussion of (2) should impact the CL, because the behavior that disagrees with Richard's expectations is happening *before* my changes.  I will also not attempt to fix (3), because this starts to interfere with (2) - sorry :-/.</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">QUESTION: Does the plan from the previous paragraph sound good to you?</div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></span><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Yes; I agree that failing to look through ElaboratedType here is just a bug.</div></div></div></div></blockquote></div></div></div></div></div></blockquote></div></div></div></div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></span><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Ack.  I've marked "<a href="https://docs.google.com/document/d/1y1F6uKdulluYBFch680g6bmHe_zDe8mHFYjfXRoakNI/edit#heading=h.d5khzityt7x" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" target="_blank">elaborated type</a>" section in the doc as something that is improved by the CL under review.</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-h5 m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-m_713380783943109327gmail-h5 m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-m_713380783943109327gmail-m_9187172870018739585h5 m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><span class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297m_8610438996115299200gmail-m_713380783943109327gmail-m_9187172870018739585m_2292074263157205842gmail- m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"> </div><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Experiments before my changes were done with the following unit tests:</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">// This testcase shows that Richard’s expectations are not met *prior* to my CL.</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">// (i.e. the testcase below passes before my CL;  the expectations in the testcase</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">// are the opposite of Richard’s expectations).</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">TEST(HasDeclaration, Case1FromEmail) {</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  std::string input =</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "template<typename T>\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "class Template {\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      " public:\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "  void Method() {}\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "};\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "template <typename U>\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "void Function(Template<U> param) {\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "  param.Method();\n"</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      "};\n";</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  // param type has-declaration matches class template decl?</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">  EXPECT_TRUE(matches(input, parmVarDecl(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasName("param"),</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">      hasType(templateSpecializationType(</div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">          hasDeclaration(decl(classTemplateDecl(hasName("Template")))))))));</div></div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></span><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">I don't think we're talking about the same thing. It seems fine, and appropriate, for hasType(templateSpecializationType(hasDeclaration(...))) to match the template. There's nothing else that hasDeclaration could reasonably mean as a TemplateSpecializationType matcher (ignoring "interesting" cases with alias templates).</div></div></div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></div></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">Hmm...  To me not matching the cxxRecordDecl is not that obvious, but this is not important - the more important thing is to figure out what exactly (if anything) is made worse by the CL under review.</div><span class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><blockquote class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_extra m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="gmail_quote m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg">My concern is entirely about hasType(hasDeclaration(...)), /without/ the intervening match of a TemplateSpecializationType, which -- unless I've completely misunderstood the patch -- is what you're changing. I would expect that matcher to not match here...</div></div></div></div></blockquote><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"><br class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></span><div class="m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871m_-5226633533572622593m_7283991568194142627gmail-m_-9122174251317343079m_-7008114788909674699m_2941828441159403347gmail-m_-6766532181255968297gmail_msg m_9662206511807302m_-3811435329940190365m_8431176651204802362gmail-m_5720481935643210871gmail_msg gmail_msg"></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div></div></div></div></div></div></blockquote></div></div></div></blockquote></div></div></div></div></blockquote></div></div></div></blockquote></div></div></blockquote></div></div></div></blockquote></div></div></div></blockquote></div></div></div></blockquote></div></div></blockquote></div></div></div></blockquote></div></div></blockquote></div></div></div></blockquote></div></div>