MS ABI: Inherit DLL attributes to partial class template specializations
llvm-svn: 216333
This commit is contained in:
parent
5777edf05c
commit
205c39bb6b
|
@ -4421,6 +4421,19 @@ static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
|
|||
/// \brief Check class-level dllimport/dllexport attribute.
|
||||
static void checkDLLAttribute(Sema &S, CXXRecordDecl *Class) {
|
||||
Attr *ClassAttr = getDLLAttr(Class);
|
||||
|
||||
// MSVC inherits DLL attributes to partial class template specializations.
|
||||
if (S.Context.getTargetInfo().getCXXABI().isMicrosoft() && !ClassAttr) {
|
||||
if (auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(Class)) {
|
||||
if (Attr *TemplateAttr =
|
||||
getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
|
||||
auto *A = cast<InheritableAttr>(TemplateAttr->clone(S.getASTContext()));
|
||||
A->setInherited(true);
|
||||
ClassAttr = A;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ClassAttr)
|
||||
return;
|
||||
|
||||
|
|
|
@ -579,12 +579,20 @@ USEMEMFUNC(PartiallySpecializedClassTemplate<void*>, f);
|
|||
// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?f@?$PartiallySpecializedClassTemplate@PAX@@QAEXXZ"
|
||||
// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN33PartiallySpecializedClassTemplateIPvE1fEv
|
||||
|
||||
// Attributes on explicit specializations are honored.
|
||||
template <typename T> struct ExplicitlySpecializedClassTemplate {};
|
||||
template <> struct __declspec(dllexport) ExplicitlySpecializedClassTemplate<void*> { void f() {} };
|
||||
USEMEMFUNC(ExplicitlySpecializedClassTemplate<void*>, f);
|
||||
// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?f@?$ExplicitlySpecializedClassTemplate@PAX@@QAEXXZ"
|
||||
// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN34ExplicitlySpecializedClassTemplateIPvE1fEv
|
||||
|
||||
// MS inherits DLL attributes to partial specializations.
|
||||
template <typename T> struct __declspec(dllexport) PartiallySpecializedExportedClassTemplate {};
|
||||
template <typename T> struct PartiallySpecializedExportedClassTemplate<T*> { void f() {} };
|
||||
USEMEMFUNC(PartiallySpecializedExportedClassTemplate<void*>, f);
|
||||
// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?f@?$PartiallySpecializedExportedClassTemplate@PAX@@QAEXXZ"
|
||||
// G32-DAG: define linkonce_odr x86_thiscallcc @_ZN41PartiallySpecializedExportedClassTemplateIPvE1fEv
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Classes with template base classes
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -679,12 +679,21 @@ USEMEMFUNC(PartiallySpecializedClassTemplate<void*>, f);
|
|||
// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?f@?$PartiallySpecializedClassTemplate@PAX@@QAEXXZ"
|
||||
// G32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @_ZN33PartiallySpecializedClassTemplateIPvE1fEv
|
||||
|
||||
// Attributes on explicit specializations are honored.
|
||||
template <typename T> struct ExplicitlySpecializedClassTemplate {};
|
||||
template <> struct __declspec(dllimport) ExplicitlySpecializedClassTemplate<void*> { void f() {} };
|
||||
USEMEMFUNC(ExplicitlySpecializedClassTemplate<void*>, f);
|
||||
// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?f@?$ExplicitlySpecializedClassTemplate@PAX@@QAEXXZ"
|
||||
// G32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @_ZN34ExplicitlySpecializedClassTemplateIPvE1fEv
|
||||
|
||||
// MS inherits DLL attributes to partial specializations.
|
||||
template <typename T> struct __declspec(dllimport) PartiallySpecializedImportedClassTemplate {};
|
||||
template <typename T> struct PartiallySpecializedImportedClassTemplate<T*> { void f() {} };
|
||||
USEMEMFUNC(PartiallySpecializedImportedClassTemplate<void*>, f);
|
||||
// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?f@?$PartiallySpecializedImportedClassTemplate@PAX@@QAEXXZ"
|
||||
// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN41PartiallySpecializedImportedClassTemplateIPvE1fEv
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Classes with template base classes
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue