diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -596,11 +596,12 @@ } static LinkageInfo getInternalLinkageFor(const NamedDecl *D) { - // Internal linkage declarations within a module interface unit are modeled - // as "module-internal linkage", which means that they have internal linkage - // formally but can be indirectly accessed from outside the module via inline - // functions and templates defined within the module. - if (isInModulePurview(D)) + // (for the modules ts) Internal linkage declarations within a module + // interface unit are modeled as "module-internal linkage", which means that + // they have internal linkage formally but can be indirectly accessed from + // outside the module via inline functions and templates defined within the + // module. + if (isInModulePurview(D) && D->getASTContext().getLangOpts().ModulesTS) return LinkageInfo(ModuleInternalLinkage, DefaultVisibility, false); return LinkageInfo::internal(); diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp --- a/clang/unittests/AST/DeclTest.cpp +++ b/clang/unittests/AST/DeclTest.cpp @@ -194,3 +194,50 @@ EXPECT_EQ(TemplateF->getLinkageInternal(), SpecializedF->getLinkageInternal()); } + +TEST(Decl, ModuleAndInternalLinkage) { + llvm::Annotations Code(R"( + export module M; + static int a; + static int f(int x); + + int b; + int g(int x);)"); + + auto AST = + tooling::buildASTFromCodeWithArgs(Code.code(), /*Args=*/{"-std=c++20"}); + ASTContext &Ctx = AST->getASTContext(); + + const auto *a = + selectFirst("a", match(varDecl(hasName("a")).bind("a"), Ctx)); + const auto *f = selectFirst( + "f", match(functionDecl(hasName("f")).bind("f"), Ctx)); + + EXPECT_EQ(a->getLinkageInternal(), InternalLinkage); + EXPECT_EQ(f->getLinkageInternal(), InternalLinkage); + + const auto *b = + selectFirst("b", match(varDecl(hasName("b")).bind("b"), Ctx)); + const auto *g = selectFirst( + "g", match(functionDecl(hasName("g")).bind("g"), Ctx)); + + EXPECT_EQ(b->getLinkageInternal(), ModuleLinkage); + EXPECT_EQ(g->getLinkageInternal(), ModuleLinkage); + + AST = tooling::buildASTFromCodeWithArgs( + Code.code(), /*Args=*/{"-std=c++20", "-fmodules-ts"}); + ASTContext &CtxTS = AST->getASTContext(); + a = selectFirst("a", match(varDecl(hasName("a")).bind("a"), CtxTS)); + f = selectFirst( + "f", match(functionDecl(hasName("f")).bind("f"), CtxTS)); + + EXPECT_EQ(a->getLinkageInternal(), ModuleInternalLinkage); + EXPECT_EQ(f->getLinkageInternal(), ModuleInternalLinkage); + + b = selectFirst("b", match(varDecl(hasName("b")).bind("b"), CtxTS)); + g = selectFirst( + "g", match(functionDecl(hasName("g")).bind("g"), CtxTS)); + + EXPECT_EQ(b->getLinkageInternal(), ModuleLinkage); + EXPECT_EQ(g->getLinkageInternal(), ModuleLinkage); +}