[MinGW] Do dllexport inline methods in template instantiation

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

Differential Revision: https://reviews.llvm.org/D61176

llvm-svn: 359343
This commit is contained in:
Martin Storsjo 2019-04-26 19:31:46 +00:00
parent da93dec330
commit 9534e9dbe4
2 changed files with 6 additions and 5 deletions

View File

@ -5726,9 +5726,12 @@ void Sema::checkClassLevelDLLAttribute(CXXRecordDecl *Class) {
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

View File

@ -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