[clang] 869d168 - [clang][ASTImporter] Fix crash when import `VarTemplateDecl` in record (#67522)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 6 18:36:08 PDT 2023
Author: Qizhi Hu
Date: 2023-10-07T09:36:04+08:00
New Revision: 869d1680edb0cc264f01fc6e59f0a1b93330c6da
URL: https://github.com/llvm/llvm-project/commit/869d1680edb0cc264f01fc6e59f0a1b93330c6da
DIFF: https://github.com/llvm/llvm-project/commit/869d1680edb0cc264f01fc6e59f0a1b93330c6da.diff
LOG: [clang][ASTImporter] Fix crash when import `VarTemplateDecl` in record (#67522)
[clang][ASTImporter] Fix crash when import `VarTemplateDecl` in record
static VarTemplateDecl in record isn't a definition, when imported
before, it will crash in `ASTContext::setTemplateOrSpecializationInfo`
due to setting specialization while it already exists. This patch skip
this specific case.
Co-authored-by: huqizhi <836744285 at qq.com>
Added:
Modified:
clang/lib/AST/ASTImporter.cpp
clang/unittests/AST/ASTImporterTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 29b9d492904f5c8..6c5aaee3f42f218 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -6242,6 +6242,9 @@ ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
// FIXME Check for ODR error if the two definitions have
//
diff erent initializers?
return Importer.MapImported(D, FoundDef);
+ if (FoundTemplate->getDeclContext()->isRecord() &&
+ D->getDeclContext()->isRecord())
+ return Importer.MapImported(D, FoundTemplate);
FoundByLookup = FoundTemplate;
break;
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index e9e8cac2a15bc70..393ed44de3f1831 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -4988,6 +4988,37 @@ TEST_P(ASTImporterOptionSpecificTestBase,
}
}
+TEST_P(ImportFriendClasses, RecordVarTemplateDecl) {
+ Decl *ToTU = getToTuDecl(
+ R"(
+ template <class T>
+ class A {
+ public:
+ template <class U>
+ static constexpr bool X = true;
+ };
+ )",
+ Lang_CXX14);
+
+ auto *ToTUX = FirstDeclMatcher<VarTemplateDecl>().match(
+ ToTU, varTemplateDecl(hasName("X")));
+ Decl *FromTU = getTuDecl(
+ R"(
+ template <class T>
+ class A {
+ public:
+ template <class U>
+ static constexpr bool X = true;
+ };
+ )",
+ Lang_CXX14, "input1.cc");
+ auto *FromX = FirstDeclMatcher<VarTemplateDecl>().match(
+ FromTU, varTemplateDecl(hasName("X")));
+ auto *ToX = Import(FromX, Lang_CXX11);
+ EXPECT_TRUE(ToX);
+ EXPECT_EQ(ToTUX, ToX);
+}
+
TEST_P(ASTImporterOptionSpecificTestBase, VarTemplateParameterDeclContext) {
constexpr auto Code =
R"(
More information about the cfe-commits
mailing list