QMetaType: Avoid combination of extern and declspec(__dllexport) on MSVC
MSVC does strange things with this, and it actually tells us so via a warning. We can, however, attach the dllexport to the definition, rather than the declaration of the symbols in order to resolve the problem. Change-Id: I9971e13afc6d8840c49ec20d21820a72c5407200 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
parent
b1e234b224
commit
d9f9bc9bad
@ -2925,14 +2925,23 @@ QMetaType::QMetaType(int typeId) : QMetaType(interfaceForType(typeId)) {}
|
||||
|
||||
namespace QtPrivate {
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
|
||||
#if defined(Q_CC_MSVC) && defined(QT_BUILD_CORE_LIB)
|
||||
#define QT_METATYPE_TEMPLATE_EXPORT Q_CORE_EXPORT
|
||||
#else
|
||||
#define QT_METATYPE_TEMPLATE_EXPORT
|
||||
#endif
|
||||
|
||||
// Explicit instantiation definition
|
||||
#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) template class QMetaTypeForType<Name>;
|
||||
#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) \
|
||||
template class QT_METATYPE_TEMPLATE_EXPORT QMetaTypeForType<Name>;
|
||||
QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
|
||||
#undef QT_METATYPE_DECLARE_TEMPLATE_ITER
|
||||
#undef QT_METATYPE_TEMPLATE_EXPORT
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -2228,10 +2228,15 @@ public:
|
||||
#undef QT_METATYPE_CONSTEXPRLAMDA
|
||||
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
|
||||
#if !defined(Q_CC_MSVC) || !defined(QT_BUILD_CORE_LIB)
|
||||
#define QT_METATYPE_TEMPLATE_EXPORT Q_CORE_EXPORT
|
||||
#else
|
||||
#define QT_METATYPE_TEMPLATE_EXPORT
|
||||
#endif
|
||||
|
||||
#define QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER(TypeName, Id, Name) \
|
||||
extern template class Q_CORE_EXPORT QMetaTypeForType<Name>;
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_MSVC(4910) // '__declspec(dllexport)' and 'extern' are incompatible on an explicit instantiation
|
||||
extern template class QT_METATYPE_TEMPLATE_EXPORT QMetaTypeForType<Name>;
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_GCC("-Wattributes") // false positive because of QMetaTypeForType<void>
|
||||
QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
|
||||
@ -2240,8 +2245,8 @@ QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
|
||||
QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
|
||||
QT_WARNING_POP
|
||||
#undef QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER
|
||||
#undef QT_METATYPE_TEMPLATE_EXPORT
|
||||
#endif
|
||||
|
||||
template<typename T>
|
||||
|
Loading…
x
Reference in New Issue
Block a user