https://github.com/danix800 updated https://github.com/llvm/llvm-project/pull/105492
>From 2ac3aa1b85d727fd15d49fa1649147f2229576cb Mon Sep 17 00:00:00 2001 From: dingfei <fd...@feysh.com> Date: Wed, 21 Aug 2024 17:52:04 +0800 Subject: [PATCH 1/3] [clang][ASTImporter] set nonnull type for var specialized from lambda template There's circular deps here when importing btw VarTemplateSpecializationDecl (m) and its type. VarDecl is created with a null type QualType(), and the importing of its type will leads to linkage computation (for the templated lambda) which depends on the var's type (not yet imported). This fix uses a non-null type instead of a null one. But this seems still cannot ensure the computation is correct. --- clang/lib/AST/ASTImporter.cpp | 6 ++++-- clang/unittests/AST/ASTImporterTest.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 103235547f482e..cc1bd01f15bef6 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -6582,6 +6582,8 @@ ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl( return std::move(Err); } + QualType ToTmpTy = Importer.getToContext().IntTy; + ToTmpTy = ToTmpTy.withCVRQualifiers(D->getType().getCVRQualifiers()); using PartVarSpecDecl = VarTemplatePartialSpecializationDecl; // Create a new specialization. if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) { @@ -6592,7 +6594,7 @@ ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl( PartVarSpecDecl *ToPartial; if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC, *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, - VarTemplate, QualType(), nullptr, + VarTemplate, ToTmpTy, nullptr, D->getStorageClass(), TemplateArgs)) return ToPartial; @@ -6613,7 +6615,7 @@ ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl( } else { // Full specialization if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, *BeginLocOrErr, *IdLocOrErr, VarTemplate, - QualType(), nullptr, D->getStorageClass(), + ToTmpTy, nullptr, D->getStorageClass(), TemplateArgs)) return D2; } diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 57242ff49fe3b8..06996268d1fb94 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -9919,6 +9919,19 @@ TEST_P(ImportTemplateParmDeclDefaultValue, ImportExistingVarTemplate) { testImport(FromLastD); } +TEST_P(ASTImporterOptionSpecificTestBase, VarTemplatedLambdaInGlobalScope) { + Decl *FromTU = getTuDecl( + R"( + namespace { template <typename> auto m = [] {}; } + void bar() { auto n = m<int>; } + )", + Lang_CXX14, "input0.cc"); + FunctionDecl *FromF = FirstDeclMatcher<FunctionDecl>().match( + FromTU, functionDecl(hasName("bar"))); + FunctionDecl *ToF = Import(FromF, Lang_CXX14); + EXPECT_TRUE(ToF); +} + INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions); >From 81efe9531fb901b18191c850e838b1825562d650 Mon Sep 17 00:00:00 2001 From: dingfei <fd...@feysh.com> Date: Wed, 21 Aug 2024 21:52:04 +0800 Subject: [PATCH 2/3] fix clang-format check failure --- clang/lib/AST/ASTImporter.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index cc1bd01f15bef6..ad7cd7eee2a4e7 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -6613,10 +6613,9 @@ ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl( // to adopt template parameters. // updateLookupTableForTemplateParameters(**ToTPListOrErr); } else { // Full specialization - if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, - *BeginLocOrErr, *IdLocOrErr, VarTemplate, - ToTmpTy, nullptr, D->getStorageClass(), - TemplateArgs)) + if (GetImportedOrCreateDecl( + D2, D, Importer.getToContext(), DC, *BeginLocOrErr, *IdLocOrErr, + VarTemplate, ToTmpTy, nullptr, D->getStorageClass(), TemplateArgs)) return D2; } >From 8f1fc146b7d2a6d6accfdfeae53f13c6cdb5413b Mon Sep 17 00:00:00 2001 From: dingfei <fd...@feysh.com> Date: Wed, 21 Aug 2024 21:56:12 +0800 Subject: [PATCH 3/3] rename testcase --- clang/unittests/AST/ASTImporterTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 06996268d1fb94..827e73e90d2e70 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -9919,7 +9919,7 @@ TEST_P(ImportTemplateParmDeclDefaultValue, ImportExistingVarTemplate) { testImport(FromLastD); } -TEST_P(ASTImporterOptionSpecificTestBase, VarTemplatedLambdaInGlobalScope) { +TEST_P(ASTImporterOptionSpecificTestBase, VarTemplatedLambdaWithCircularDeps) { Decl *FromTU = getTuDecl( R"( namespace { template <typename> auto m = [] {}; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits