summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetatype.h
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2020-06-05 14:24:31 +0200
committerFabian Kosmale <fabian.kosmale@qt.io>2020-06-09 14:20:31 +0200
commit4c32443bc9e738067f518fff54b1db99cde1c3fd (patch)
treecba262e4aa90db64dfa07bf67ce31c2fc2e8cfe8 /src/corelib/kernel/qmetatype.h
parent910804a4202d5be645a841a1e2ec38ad63c0598d (diff)
metatype: Do not try analyze T in Q*Pointer<T> if T is incomplete
Change-Id: I41737ce470f6d2b071ad5e85f8cad1da3869241c Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r--src/corelib/kernel/qmetatype.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 6939adb678..d8b547c8e2 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -2839,11 +2839,29 @@ struct is_complete_helper {
template <typename T, typename ODR_VIOLATION_PREVENTER>
struct is_complete : detail::is_complete_helper<T, ODR_VIOLATION_PREVENTER>::type {};
+template<typename T>
+struct qRemovePointerLike
+{
+ using type = std::remove_pointer_t<T>;
+};
+
+#define Q_REMOVE_POINTER_LIKE_IMPL(Pointer) \
+template <typename T> \
+struct qRemovePointerLike<Pointer<T>> \
+{ \
+ using type = T; \
+};
+
+QT_FOR_EACH_AUTOMATIC_TEMPLATE_SMART_POINTER(Q_REMOVE_POINTER_LIKE_IMPL)
+template<typename T>
+using qRemovePointerLike_t = typename qRemovePointerLike<T>::type;
+#undef Q_REMOVE_POINTER_LIKE_IMPL
+
template<typename Unique, typename T>
constexpr QMetaTypeInterface *qTryMetaTypeInterfaceForType()
{
using Ty = std::remove_cv_t<std::remove_reference_t<T>>;
- using Tz = std::remove_pointer_t<Ty>;
+ using Tz = qRemovePointerLike_t<Ty>;
if constexpr (!is_complete<Tz, Unique>::value) {
return nullptr;
} else {