[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