mstorsjo created this revision.
mstorsjo added reviewers: rnk, hans, smeenai.
Herald added a project: clang.

Normally, in MinGW mode, inline methods aren't dllexported.

However, in the case of a dllimported template instantiation, the inline 
methods aren't instantiated locally, but referenced from the instantiation. 
Therefore, those methods also need to be dllexported, in the case of an 
instantiation.

GCC suffers from the same issue, reported at [1], but the issue is still 
unresolved there.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89088


Repository:
  rC Clang

https://reviews.llvm.org/D61176

Files:
  lib/Sema/SemaDeclCXX.cpp
  test/CodeGenCXX/mingw-template-dllexport.cpp


Index: test/CodeGenCXX/mingw-template-dllexport.cpp
===================================================================
--- test/CodeGenCXX/mingw-template-dllexport.cpp
+++ test/CodeGenCXX/mingw-template-dllexport.cpp
@@ -7,11 +7,9 @@
 
 template <class T>
 class c {
-  void f();
+  void f() {}
 };
 
-template <class T> void c<T>::f() {}
-
 template class __declspec(dllexport) c<int>;
 
 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -5726,9 +5726,12 @@
         continue;
 
       if (MD->isInlined()) {
-        // MinGW does not import or export inline methods.
+        // MinGW does not import or export inline methods. But do it for
+        // template instantiations.
         if (!Context.getTargetInfo().getCXXABI().isMicrosoft() &&
-            !Context.getTargetInfo().getTriple().isWindowsItaniumEnvironment())
+            !Context.getTargetInfo().getTriple().isWindowsItaniumEnvironment() 
&&
+            TSK != TSK_ExplicitInstantiationDeclaration &&
+            TSK != TSK_ExplicitInstantiationDefinition)
           continue;
 
         // MSVC versions before 2015 don't export the move assignment operators


Index: test/CodeGenCXX/mingw-template-dllexport.cpp
===================================================================
--- test/CodeGenCXX/mingw-template-dllexport.cpp
+++ test/CodeGenCXX/mingw-template-dllexport.cpp
@@ -7,11 +7,9 @@
 
 template <class T>
 class c {
-  void f();
+  void f() {}
 };
 
-template <class T> void c<T>::f() {}
-
 template class __declspec(dllexport) c<int>;
 
 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -5726,9 +5726,12 @@
         continue;
 
       if (MD->isInlined()) {
-        // MinGW does not import or export inline methods.
+        // MinGW does not import or export inline methods. But do it for
+        // template instantiations.
         if (!Context.getTargetInfo().getCXXABI().isMicrosoft() &&
-            !Context.getTargetInfo().getTriple().isWindowsItaniumEnvironment())
+            !Context.getTargetInfo().getTriple().isWindowsItaniumEnvironment() &&
+            TSK != TSK_ExplicitInstantiationDeclaration &&
+            TSK != TSK_ExplicitInstantiationDefinition)
           continue;
 
         // MSVC versions before 2015 don't export the move assignment operators
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to