[clang] [clang][Modules] Complete the implementation of P2615: Meaningful exports (PR #194201)
Yanzuo Liu via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 26 06:32:24 PDT 2026
================
@@ -440,6 +443,52 @@ 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;
+ }
+
+ 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;
+ }();
+
+ if (TSK == TSK_Undeclared)
+ return;
+
+ if (const auto *ED = dyn_cast<ExportDecl>(LinkageOrExportDecl)) {
+ Diag(ED->getExportLoc(), diag::err_meaningless_export)
+ << (TSK == TSK_ExplicitSpecialization)
+ << FixItHint::CreateRemoval(ED->getExportLoc());
----------------
zwuis wrote:
Please add tests.
https://github.com/llvm/llvm-project/pull/194201
More information about the cfe-commits
mailing list