[clang] [clang][Modules] Complete the implementation of P2615: Meaningful exports (PR #194201)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 27 08:46:43 PDT 2026
================
@@ -440,6 +443,87 @@ Decl *Parser::ParseExportDeclaration() {
T.getCloseLocation());
}
+void Parser::CheckUnbracedLinkageOrExportDeclaration(
+ Decl *LinkageOrExportDecl) {
+ const auto *DC = cast<DeclContext>(LinkageOrExportDecl);
+ if (DC->decls_empty())
+ return;
+
+ const Decl *D = *DC->decls_begin();
+
+ // Nested export declarations are diagnosed elsewhere.
+ if (isa<LinkageSpecDecl>(LinkageOrExportDecl) && isa<ExportDecl>(D)) {
+ Diag(LinkageOrExportDecl->getLocation(),
+ diag::err_invalid_decl_in_linkage_spec)
+ << 2;
+ return;
+ }
+
+ // [module.interface]/1 says:
+ //
+ // The name-declaration of an export-declaration shall not declare a
+ // partial specialization.
+ //
+ // There's no equivalent wording for linkage-specification.
+ if (isa<ClassTemplatePartialSpecializationDecl,
+ VarTemplatePartialSpecializationDecl>(D) &&
+ isa<LinkageSpecDecl>(LinkageOrExportDecl))
+ return;
+
+ TemplateSpecializationKind TSK = [&] {
+ if (const auto *EID = dyn_cast<ExplicitInstantiationDecl>(D))
+ return EID->getTemplateSpecializationKind();
+ if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
+ return CTSD->getTemplateSpecializationKind();
+ if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
+ return VTSD->getTemplateSpecializationKind();
+ if (const auto *FD = dyn_cast<FunctionDecl>(D))
+ return FD->getTemplateSpecializationKind();
+ return TSK_Undeclared;
+ }();
----------------
cor3ntin wrote:
There is similar code in `isTemplateSpecializationKind`, maybe in other places, we should try to clean that up
https://github.com/llvm/llvm-project/pull/194201
More information about the cfe-commits
mailing list