diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-06-05 14:24:31 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-06-09 14:20:31 +0200 |
commit | 4c32443bc9e738067f518fff54b1db99cde1c3fd (patch) | |
tree | cba262e4aa90db64dfa07bf67ce31c2fc2e8cfe8 /src | |
parent | 910804a4202d5be645a841a1e2ec38ad63c0598d (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')
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 20 |
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 { |