[PATCH] D24969: [Sema] Use the instantiated name of destructors in FindInstantiatedDecl and RebuildMemberExpr

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 31 14:49:21 PST 2017


Richard, what do you think? I don't believe this fixes a 3.9
regression, but the fix looks small, so it might be worth it.

On Tue, Jan 31, 2017 at 12:07 PM, Akira Hatanaka <ahatanaka at apple.com> wrote:
> Thanks for the review. r293678.
>
> Should this be merged to 4.0?
>
>> On Jan 31, 2017, at 12:04 PM, Akira Hatanaka via Phabricator via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>>
>> This revision was automatically updated to reflect the committed changes.
>> Closed by commit rL293678: [Sema] Transform a templated name before looking it up in (authored by ahatanak).
>>
>> Changed prior to commit:
>>  https://reviews.llvm.org/D24969?vs=82134&id=86474#toc
>>
>> Repository:
>>  rL LLVM
>>
>> https://reviews.llvm.org/D24969
>>
>> Files:
>>  cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>>  cfe/trunk/lib/Sema/TreeTransform.h
>>  cfe/trunk/test/SemaCXX/destructor.cpp
>>
>>
>> Index: cfe/trunk/test/SemaCXX/destructor.cpp
>> ===================================================================
>> --- cfe/trunk/test/SemaCXX/destructor.cpp
>> +++ cfe/trunk/test/SemaCXX/destructor.cpp
>> @@ -431,3 +431,23 @@
>>
>> // The constructor definition should not have errors
>> Invalid::~Invalid() {}
>> +
>> +namespace PR30361 {
>> +template <typename T>
>> +struct C1 {
>> +  ~C1() {}
>> +  operator C1<T>* () { return nullptr; }
>> +  void foo1();
>> +};
>> +
>> +template<typename T>
>> +void C1<T>::foo1() {
>> +  C1::operator C1<T>*();
>> +  C1::~C1();
>> +}
>> +
>> +void foo1() {
>> +  C1<int> x;
>> +  x.foo1();
>> +}
>> +}
>> Index: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> ===================================================================
>> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> @@ -4990,8 +4990,12 @@
>>     NamedDecl *Result = nullptr;
>>     // FIXME: If the name is a dependent name, this lookup won't necessarily
>>     // find it. Does that ever matter?
>> -    if (D->getDeclName()) {
>> -      DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName());
>> +    if (auto Name = D->getDeclName()) {
>> +      DeclarationNameInfo NameInfo(Name, D->getLocation());
>> +      Name = SubstDeclarationNameInfo(NameInfo, TemplateArgs).getName();
>> +      if (!Name)
>> +        return nullptr;
>> +      DeclContext::lookup_result Found = ParentDC->lookup(Name);
>>       Result = findInstantiationOf(Context, D, Found.begin(), Found.end());
>>     } else {
>>       // Since we don't have a name for the entity we're looking for,
>> Index: cfe/trunk/lib/Sema/TreeTransform.h
>> ===================================================================
>> --- cfe/trunk/lib/Sema/TreeTransform.h
>> +++ cfe/trunk/lib/Sema/TreeTransform.h
>> @@ -8966,12 +8966,18 @@
>>   // base (and therefore couldn't do the check) and a
>>   // nested-name-qualifier (and therefore could do the lookup).
>>   NamedDecl *FirstQualifierInScope = nullptr;
>> +  DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
>> +  if (MemberNameInfo.getName()) {
>> +    MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
>> +    if (!MemberNameInfo.getName())
>> +      return ExprError();
>> +  }
>>
>>   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
>>                                         E->isArrow(),
>>                                         QualifierLoc,
>>                                         TemplateKWLoc,
>> -                                        E->getMemberNameInfo(),
>> +                                        MemberNameInfo,
>>                                         Member,
>>                                         FoundDecl,
>>                                         (E->hasExplicitTemplateArgs()
>>
>>
>> <D24969.86474.patch>_______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>


More information about the cfe-commits mailing list