<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 31 January 2017 at 14:49, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Richard, what do you think? I don't believe this fixes a 3.9<br>
regression, but the fix looks small, so it might be worth it.<br></blockquote><div><br></div><div>I think on the whole the benefit of this change outweighs the risk of it regressing something.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Tue, Jan 31, 2017 at 12:07 PM, Akira Hatanaka <<a href="mailto:ahatanaka@apple.com">ahatanaka@apple.com</a>> wrote:<br>
> Thanks for the review. r293678.<br>
><br>
> Should this be merged to 4.0?<br>
><br>
>> On Jan 31, 2017, at 12:04 PM, Akira Hatanaka via Phabricator via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> This revision was automatically updated to reflect the committed changes.<br>
>> Closed by commit rL293678: [Sema] Transform a templated name before looking it up in (authored by ahatanak).<br>
>><br>
>> Changed prior to commit:<br>
>>  <a href="https://reviews.llvm.org/D24969?vs=82134&id=86474#toc" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D24969?vs=82134&id=86474#toc</a><br>
>><br>
>> Repository:<br>
>>  rL LLVM<br>
>><br>
>> <a href="https://reviews.llvm.org/D24969" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D24969</a><br>
>><br>
>> Files:<br>
>>  cfe/trunk/lib/Sema/<wbr>SemaTemplateInstantiateDecl.<wbr>cpp<br>
>>  cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br>
>>  cfe/trunk/test/SemaCXX/<wbr>destructor.cpp<br>
>><br>
>><br>
>> Index: cfe/trunk/test/SemaCXX/<wbr>destructor.cpp<br>
>> ==============================<wbr>==============================<wbr>=======<br>
>> --- cfe/trunk/test/SemaCXX/<wbr>destructor.cpp<br>
>> +++ cfe/trunk/test/SemaCXX/<wbr>destructor.cpp<br>
>> @@ -431,3 +431,23 @@<br>
>><br>
>> // The constructor definition should not have errors<br>
>> Invalid::~Invalid() {}<br>
>> +<br>
>> +namespace PR30361 {<br>
>> +template <typename T><br>
>> +struct C1 {<br>
>> +  ~C1() {}<br>
>> +  operator C1<T>* () { return nullptr; }<br>
>> +  void foo1();<br>
>> +};<br>
>> +<br>
>> +template<typename T><br>
>> +void C1<T>::foo1() {<br>
>> +  C1::operator C1<T>*();<br>
>> +  C1::~C1();<br>
>> +}<br>
>> +<br>
>> +void foo1() {<br>
>> +  C1<int> x;<br>
>> +  x.foo1();<br>
>> +}<br>
>> +}<br>
>> Index: cfe/trunk/lib/Sema/<wbr>SemaTemplateInstantiateDecl.<wbr>cpp<br>
>> ==============================<wbr>==============================<wbr>=======<br>
>> --- cfe/trunk/lib/Sema/<wbr>SemaTemplateInstantiateDecl.<wbr>cpp<br>
>> +++ cfe/trunk/lib/Sema/<wbr>SemaTemplateInstantiateDecl.<wbr>cpp<br>
>> @@ -4990,8 +4990,12 @@<br>
>>     NamedDecl *Result = nullptr;<br>
>>     // FIXME: If the name is a dependent name, this lookup won't necessarily<br>
>>     // find it. Does that ever matter?<br>
>> -    if (D->getDeclName()) {<br>
>> -      DeclContext::lookup_result Found = ParentDC->lookup(D-><wbr>getDeclName());<br>
>> +    if (auto Name = D->getDeclName()) {<br>
>> +      DeclarationNameInfo NameInfo(Name, D->getLocation());<br>
>> +      Name = SubstDeclarationNameInfo(<wbr>NameInfo, TemplateArgs).getName();<br>
>> +      if (!Name)<br>
>> +        return nullptr;<br>
>> +      DeclContext::lookup_result Found = ParentDC->lookup(Name);<br>
>>       Result = findInstantiationOf(Context, D, Found.begin(), Found.end());<br>
>>     } else {<br>
>>       // Since we don't have a name for the entity we're looking for,<br>
>> Index: cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br>
>> ==============================<wbr>==============================<wbr>=======<br>
>> --- cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br>
>> +++ cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br>
>> @@ -8966,12 +8966,18 @@<br>
>>   // base (and therefore couldn't do the check) and a<br>
>>   // nested-name-qualifier (and therefore could do the lookup).<br>
>>   NamedDecl *FirstQualifierInScope = nullptr;<br>
>> +  DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();<br>
>> +  if (MemberNameInfo.getName()) {<br>
>> +    MemberNameInfo = getDerived().<wbr>TransformDeclarationNameInfo(<wbr>MemberNameInfo);<br>
>> +    if (!MemberNameInfo.getName())<br>
>> +      return ExprError();<br>
>> +  }<br>
>><br>
>>   return getDerived().<wbr>RebuildMemberExpr(Base.get(), FakeOperatorLoc,<br>
>>                                         E->isArrow(),<br>
>>                                         QualifierLoc,<br>
>>                                         TemplateKWLoc,<br>
>> -                                        E->getMemberNameInfo(),<br>
>> +                                        MemberNameInfo,<br>
>>                                         Member,<br>
>>                                         FoundDecl,<br>
>>                                         (E->hasExplicitTemplateArgs()<br>
>><br>
>><br>
>> <D24969.86474.patch>__________<wbr>______________________________<wbr>_______<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
><br>
</blockquote></div><br></div></div>