[clang] [Clang] Warn about ignored dllimport on explicit instantiations (PR #191392)
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 8 06:57:22 PDT 2026
================
@@ -10230,44 +10230,44 @@ DeclResult Sema::ActOnExplicitInstantiation(
? TSK_ExplicitInstantiationDefinition
: TSK_ExplicitInstantiationDeclaration;
+ bool DLLAttrAffected = false;
+ const ParsedAttr *AttachedExportAttr = nullptr;
+ const ParsedAttr *AttachedImportAttr = nullptr;
+ for (const ParsedAttr &AL : Attr) {
+ if (AL.getKind() == ParsedAttr::AT_DLLExport)
+ AttachedExportAttr = &AL;
+ else if (AL.getKind() == ParsedAttr::AT_DLLImport)
+ AttachedImportAttr = &AL;
+ }
+
if (TSK == TSK_ExplicitInstantiationDeclaration &&
!Context.getTargetInfo().getTriple().isOSCygMing()) {
// Check for dllexport class template instantiation declarations,
// except for MinGW mode.
- for (const ParsedAttr &AL : Attr) {
- if (AL.getKind() == ParsedAttr::AT_DLLExport) {
- Diag(ExternLoc,
- diag::warn_attribute_dllexport_explicit_instantiation_decl);
- Diag(AL.getLoc(), diag::note_attribute);
- break;
- }
+ if (AttachedExportAttr) {
+ Diag(ExternLoc,
+ diag::warn_attribute_dllexport_explicit_instantiation_decl);
+ Diag(AttachedExportAttr->getLoc(), diag::note_attribute);
+ DLLAttrAffected = true;
}
if (auto *A = ClassTemplate->getTemplatedDecl()->getAttr<DLLExportAttr>()) {
Diag(ExternLoc,
diag::warn_attribute_dllexport_explicit_instantiation_decl);
Diag(A->getLocation(), diag::note_attribute);
+ DLLAttrAffected = true;
}
}
// In MSVC mode, dllimported explicit instantiation definitions are treated as
// instantiation declarations for most purposes.
bool DLLImportExplicitInstantiationDef = false;
if (TSK == TSK_ExplicitInstantiationDefinition &&
- Context.getTargetInfo().getCXXABI().isMicrosoft()) {
+ Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
// Check for dllimport class template instantiation definitions.
bool DLLImport =
ClassTemplate->getTemplatedDecl()->getAttr<DLLImportAttr>();
- for (const ParsedAttr &AL : Attr) {
- if (AL.getKind() == ParsedAttr::AT_DLLImport)
- DLLImport = true;
- if (AL.getKind() == ParsedAttr::AT_DLLExport) {
- // dllexport trumps dllimport here.
- DLLImport = false;
- break;
- }
- }
- if (DLLImport) {
+ if ((DLLImport || AttachedImportAttr) && !AttachedExportAttr) {
TSK = TSK_ExplicitInstantiationDeclaration;
----------------
zmodem wrote:
Maybe keep the "dllexport trumps dllimport here" comment?
https://github.com/llvm/llvm-project/pull/191392
More information about the cfe-commits
mailing list