Author: martong Date: Tue Jun 26 06:44:24 2018 New Revision: 335600 URL: http://llvm.org/viewvc/llvm-project?rev=335600&view=rev Log: [ASTImporter] Use InjectedClassNameType at import of templated record.
Summary: At import of a record describing a template set its type to InjectedClassNameType (instead of RecordType). Reviewers: a.sidorin, martong, r.stahl Reviewed By: a.sidorin, martong, r.stahl Subscribers: a_sidorin, rnkovacs, martong, cfe-commits Differential Revision: https://reviews.llvm.org/D47450 Patch by Balazs Keri! Added: cfe/trunk/test/ASTMerge/injected-class-name-decl/ cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/ cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp cfe/trunk/test/ASTMerge/injected-class-name-decl/test.cpp Modified: cfe/trunk/lib/AST/ASTImporter.cpp Modified: cfe/trunk/lib/AST/ASTImporter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=335600&r1=335599&r2=335600&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTImporter.cpp (original) +++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Jun 26 06:44:24 2018 @@ -2135,6 +2135,29 @@ Decl *ASTNodeImporter::VisitRecordDecl(R if (!ToDescribed) return nullptr; D2CXX->setDescribedClassTemplate(ToDescribed); + if (!DCXX->isInjectedClassName()) { + // In a record describing a template the type should be an + // InjectedClassNameType (see Sema::CheckClassTemplate). Update the + // previously set type to the correct value here (ToDescribed is not + // available at record create). + // FIXME: The previous type is cleared but not removed from + // ASTContext's internal storage. + CXXRecordDecl *Injected = nullptr; + for (NamedDecl *Found : D2CXX->noload_lookup(Name)) { + auto *Record = dyn_cast<CXXRecordDecl>(Found); + if (Record && Record->isInjectedClassName()) { + Injected = Record; + break; + } + } + D2CXX->setTypeForDecl(nullptr); + Importer.getToContext().getInjectedClassNameType(D2CXX, + ToDescribed->getInjectedClassNameSpecialization()); + if (Injected) { + Injected->setTypeForDecl(nullptr); + Importer.getToContext().getTypeDeclType(Injected, D2CXX); + } + } } else if (MemberSpecializationInfo *MemberInfo = DCXX->getMemberSpecializationInfo()) { TemplateSpecializationKind SK = Added: cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp?rev=335600&view=auto ============================================================================== --- cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp (added) +++ cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp Tue Jun 26 06:44:24 2018 @@ -0,0 +1,2 @@ +template <class X> +class C { static X x; }; Added: cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp?rev=335600&view=auto ============================================================================== --- cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp (added) +++ cfe/trunk/test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp Tue Jun 26 06:44:24 2018 @@ -0,0 +1,2 @@ +template <class X> +X C<X>::x; Added: cfe/trunk/test/ASTMerge/injected-class-name-decl/test.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/injected-class-name-decl/test.cpp?rev=335600&view=auto ============================================================================== --- cfe/trunk/test/ASTMerge/injected-class-name-decl/test.cpp (added) +++ cfe/trunk/test/ASTMerge/injected-class-name-decl/test.cpp Tue Jun 26 06:44:24 2018 @@ -0,0 +1,3 @@ +// RUN: %clang_cc1 -std=c++1z -emit-pch -o %t.ast %S/Inputs/inject1.cpp +// RUN: %clang_cc1 -std=c++1z -emit-obj -o /dev/null -ast-merge %t.ast %S/Inputs/inject2.cpp +// expected-no-diagnostics _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits