r335600 - [ASTImporter] Use InjectedClassNameType at import of templated record.
Gabor Marton via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 26 06:44:24 PDT 2018
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
More information about the cfe-commits
mailing list