https://github.com/mzyKi updated https://github.com/llvm/llvm-project/pull/68774
>From a0e6d307436ab147bc02db5c38c9453d98379074 Mon Sep 17 00:00:00 2001 From: miaozhiyuan <miaozhiy...@feysh.com> Date: Wed, 11 Oct 2023 15:45:36 +0800 Subject: [PATCH] [clang][ASTImporter] Fix crash when template class static member imported to other translation unit. Fixes: #68769 --- clang/docs/ReleaseNotes.rst | 4 +++ clang/lib/AST/ASTImporter.cpp | 11 ++++++++ clang/unittests/AST/ASTImporterTest.cpp | 34 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 31969201a1cac8c..bd3869bc9c010f9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -500,6 +500,10 @@ Bug Fixes to C++ Support rather than prefer the non-templated constructor as specified in [standard.group]p3. +- Fix crash when template class static member imported to other translation unit. + Fixes: + (`#68769 <https://github.com/llvm/llvm-project/issues/68769>`_) + Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ - Fixed an import failure of recursive friend class template. diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 72e70427161bb0e..2a8add84f55dc3b 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -4475,6 +4475,17 @@ ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) { auto ToVTOrErr = import(D->getDescribedVarTemplate()); if (!ToVTOrErr) return ToVTOrErr.takeError(); + } else if (MemberSpecializationInfo *MSI = D->getMemberSpecializationInfo()) { + TemplateSpecializationKind SK = MSI->getTemplateSpecializationKind(); + VarDecl *FromInst = D->getInstantiatedFromStaticDataMember(); + if (Expected<VarDecl *> ToInstOrErr = import(FromInst)) + ToVar->setInstantiationOfStaticDataMember(*ToInstOrErr, SK); + else + return ToInstOrErr.takeError(); + if (ExpectedSLoc POIOrErr = import(MSI->getPointOfInstantiation())) + ToVar->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr); + else + return POIOrErr.takeError(); } if (Error Err = ImportInitializer(D, ToVar)) diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 393ed44de3f1831..b0cc598a369abe9 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -1373,6 +1373,40 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportCorrectTemplatedDecl) { ASSERT_EQ(ToTemplated1, ToTemplated); } +TEST_P(ASTImporterOptionSpecificTestBase, + ImportTemplateSpecializationStaticMember) { + auto FromCode = R"( + template <typename H> class Test{ + public: + static const unsigned int length; + }; + + template<> const unsigned int Test<int>::length; + template<> const unsigned int Test<int>::length = 0; + )"; + auto ToCode = R"( + template <typename H> class Test + { + public: + static const unsigned int length; + }; + template<> const unsigned int Test<int>::length; + + void foo(){ + int i = 1 / Test<int>::length; + } + )"; + Decl *FromTU = getTuDecl(FromCode, Lang_CXX14); + auto FromDecl = FirstDeclMatcher<VarDecl>().match( + FromTU, varDecl(hasName("length"), isDefinition())); + Decl *ToTu = getToTuDecl(ToCode, Lang_CXX14); + auto ToX = Import(FromDecl, Lang_CXX03); + auto ToDecl = FirstDeclMatcher<VarDecl>().match( + ToTu, varDecl(hasName("length"), isDefinition())); + EXPECT_TRUE(ToX); + EXPECT_EQ(ToX, ToDecl); +} + TEST_P(ASTImporterOptionSpecificTestBase, ImportChooseExpr) { // This tests the import of isConditionTrue directly to make sure the importer // gets it right. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits