[clang] [clang][ASTImporter] import InstantiatedFromMember of ClassTemplateSpecializationDecl (PR #76493)
Qizhi Hu via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 28 17:22:55 PST 2023
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/76493
>From 9a9a203bbea079a033a14e610a3c00dff5ec408a Mon Sep 17 00:00:00 2001
From: huqizhi <huqizhi at feysh.com>
Date: Thu, 28 Dec 2023 15:51:32 +0800
Subject: [PATCH] [clang][ASTImporter] import InstantiatedFromMember of
ClassTemplateSpecializationDecl
---
clang/lib/AST/ASTImporter.cpp | 5 ++++
clang/unittests/AST/ASTImporterTest.cpp | 32 +++++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index b61180c4f3491d..9ffae72346f2af 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -6141,6 +6141,11 @@ ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
InsertPos))
// Add this partial specialization to the class template.
ClassTemplate->AddPartialSpecialization(PartSpec2, InsertPos);
+ if (Expected<ClassTemplatePartialSpecializationDecl *> ToInstOrErr =
+ import(PartialSpec->getInstantiatedFromMember()))
+ PartSpec2->setInstantiatedFromMember(*ToInstOrErr);
+ else
+ return ToInstOrErr.takeError();
updateLookupTableForTemplateParameters(*ToTPList);
} else { // Not a partial specialization.
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index ed8ecb080e268d..3c228d0e5ecd5f 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -9342,6 +9342,38 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportConflictTypeAliasTemplate) {
EXPECT_FALSE(ImportedCallable);
}
+AST_MATCHER(ClassTemplateSpecializationDecl, hasInstantiatedFromMember) {
+ if (auto Instantiate = Node.getInstantiatedFrom()) {
+ if (auto *FromPartialSpecialization =
+ Instantiate.get<ClassTemplatePartialSpecializationDecl *>()) {
+ return nullptr != FromPartialSpecialization->getInstantiatedFromMember();
+ }
+ }
+ return false;
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase, ImportInstantiatedFromMember) {
+ const char *Code =
+ R"(
+ template <typename> struct B {
+ template <typename, bool = false> union D;
+ template <typename T> union D<T> {};
+ D<int> d;
+ };
+ B<int> b;
+ )";
+ Decl *FromTU = getTuDecl(Code, Lang_CXX17);
+ auto *FromA = FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
+ FromTU, classTemplateSpecializationDecl(hasName("D"),
+ hasInstantiatedFromMember()));
+ auto *FromPartialSpecialization =
+ cast<ClassTemplatePartialSpecializationDecl *>(
+ FromA->getInstantiatedFrom());
+ auto *ImportedPartialSpecialization =
+ Import(FromPartialSpecialization, Lang_CXX11);
+ EXPECT_TRUE(ImportedPartialSpecialization->getInstantiatedFromMember());
+}
+
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions);
More information about the cfe-commits
mailing list