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 <836744...@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"( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits