[clang] [clang][ASTImporter] skip TemplateTypeParmDecl in VisitTypeAliasTemplateDecl (PR #74919)
Qizhi Hu via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 19 01:25:03 PST 2023
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/74919
>From 583cbd47533ff1aa71874c502affc44ce5b5c107 Mon Sep 17 00:00:00 2001
From: huqizhi <huqizhi at feysh.com>
Date: Sat, 9 Dec 2023 12:00:02 +0800
Subject: [PATCH] [clang][ASTImporter] skip TemplateTypeParmDecl in
VisitTypeAliasTemplateDecl
---
clang/lib/AST/ASTImporter.cpp | 9 +++--
clang/lib/AST/ASTStructuralEquivalence.cpp | 12 ++++++
clang/unittests/AST/ASTImporterTest.cpp | 47 ++++++++++++++++++++++
3 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index f1f335118f37a4..270574a7704505 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -2771,9 +2771,11 @@ ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
for (auto *FoundDecl : FoundDecls) {
if (!FoundDecl->isInIdentifierNamespace(IDNS))
continue;
- if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl))
- return Importer.MapImported(D, FoundAlias);
- ConflictingDecls.push_back(FoundDecl);
+ if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
+ if (IsStructuralMatch(D, FoundAlias))
+ return Importer.MapImported(D, FoundAlias);
+ ConflictingDecls.push_back(FoundDecl);
+ }
}
if (!ConflictingDecls.empty()) {
@@ -9391,7 +9393,6 @@ Expected<Decl *> ASTImporter::Import(Decl *FromD) {
setImportDeclError(FromD, *Error);
return make_error<ASTImportError>(*Error);
}
-
// Make sure that ImportImpl registered the imported decl.
assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
if (auto Error = ImportAttrs(ToD, FromD))
diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp
index 6bb4bf14b873d7..1f492b051e0341 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -1977,6 +1977,18 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
D2->getTemplatedDecl()->getType());
}
+static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
+ TypeAliasTemplateDecl *D1,
+ TypeAliasTemplateDecl *D2) {
+ // Check template parameters.
+ if (!IsTemplateDeclCommonStructurallyEquivalent(Context, D1, D2))
+ return false;
+
+ // Check the templated declaration.
+ return IsStructurallyEquivalent(Context, D1->getTemplatedDecl(),
+ D2->getTemplatedDecl());
+}
+
static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
ConceptDecl *D1,
ConceptDecl *D2) {
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index 4dd7510bf8ddf8..2328e98a663810 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -9284,6 +9284,53 @@ TEST_P(ASTImporterOptionSpecificTestBase,
// EXPECT_EQ(ToF1Imported->getPreviousDecl(), ToF1);
}
+TEST_P(ASTImporterOptionSpecificTestBase,
+ ImportTypeAliasTemplateAfterSimilarCalledTemplateTypeParm) {
+ const char *Code =
+ R"(
+ struct S;
+ template <typename>
+ using Callable = S;
+ template <typename Callable>
+ int bindingFunctionVTable;
+ )";
+ Decl *FromTU = getTuDecl(Code, Lang_CXX17);
+
+ auto *FromCallable = FirstDeclMatcher<TypeAliasTemplateDecl>().match(
+ FromTU, typeAliasTemplateDecl(hasName("Callable")));
+
+ auto *FromCallableParm = FirstDeclMatcher<TemplateTypeParmDecl>().match(
+ FromTU, templateTypeParmDecl(hasName("Callable")));
+
+ auto *ToFromCallableParm = Import(FromCallableParm, Lang_CXX17);
+ auto *ToCallable = Import(FromCallable, Lang_CXX17);
+ EXPECT_TRUE(ToFromCallableParm);
+ EXPECT_TRUE(ToCallable);
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase, ImportConflictTypeAliasTemplate) {
+ const char *ToCode =
+ R"(
+ struct S;
+ template <typename, typename>
+ using Callable = S;
+ )";
+ const char *Code =
+ R"(
+ struct S;
+ template <typename>
+ using Callable = S;
+ )";
+ (void)getToTuDecl(ToCode, Lang_CXX17);
+ Decl *FromTU = getTuDecl(Code, Lang_CXX17);
+
+ auto *FromCallable = FirstDeclMatcher<TypeAliasTemplateDecl>().match(
+ FromTU, typeAliasTemplateDecl(hasName("Callable")));
+
+ auto *ImportedCallable = Import(FromCallable, Lang_CXX17);
+ EXPECT_FALSE(ImportedCallable);
+}
+
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions);
More information about the cfe-commits
mailing list