[PATCH] D120397: [C++20] [Modules] Make the linkage consistent for template and its specialization
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 23 19:24:52 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG847466860887: [C++20] [Modules] Make the linkage consistent for template and its (authored by ChuanqiXu).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120397/new/
https://reviews.llvm.org/D120397
Files:
clang/lib/AST/Decl.cpp
clang/unittests/AST/DeclTest.cpp
Index: clang/unittests/AST/DeclTest.cpp
===================================================================
--- clang/unittests/AST/DeclTest.cpp
+++ clang/unittests/AST/DeclTest.cpp
@@ -171,3 +171,26 @@
selectFirst<FunctionDecl>("f", match(functionDecl().bind("f"), Ctx));
EXPECT_TRUE(f->isInExportDeclContext());
}
+
+TEST(Decl, InConsistLinkageForTemplates) {
+ llvm::Annotations Code(R"(
+ export module m;
+ export template <class T>
+ void f() {}
+
+ template <>
+ void f<int>() {})");
+
+ auto AST =
+ tooling::buildASTFromCodeWithArgs(Code.code(), /*Args=*/{"-std=c++20"});
+ ASTContext &Ctx = AST->getASTContext();
+
+ llvm::SmallVector<ast_matchers::BoundNodes, 2> Funcs =
+ match(functionDecl().bind("f"), Ctx);
+
+ EXPECT_EQ(Funcs.size(), 2);
+ const FunctionDecl *TemplateF = Funcs[0].getNodeAs<FunctionDecl>("f");
+ const FunctionDecl *SpecializedF = Funcs[1].getNodeAs<FunctionDecl>("f");
+ EXPECT_EQ(TemplateF->getLinkageInternal(),
+ SpecializedF->getLinkageInternal());
+}
Index: clang/lib/AST/Decl.cpp
===================================================================
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -391,11 +391,18 @@
bool considerVisibility =
shouldConsiderTemplateVisibility(fn, specInfo);
- // Merge information from the template parameters.
FunctionTemplateDecl *temp = specInfo->getTemplate();
- LinkageInfo tempLV =
- getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
- LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
+
+ // Merge information from the template declaration.
+ LinkageInfo tempLV = getLVForDecl(temp, computation);
+ // The linkage of the specialization should be consistent with the
+ // template declaration.
+ LV.setLinkage(tempLV.getLinkage());
+
+ // Merge information from the template parameters.
+ LinkageInfo paramsLV =
+ getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
+ LV.mergeMaybeWithVisibility(paramsLV, considerVisibility);
// Merge information from the template arguments.
const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120397.417814.patch
Type: text/x-patch
Size: 2186 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220324/4f73868e/attachment.bin>
More information about the cfe-commits
mailing list