forked from OSchip/llvm-project
[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:
parent
da93dec330
commit
9534e9dbe4
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue