diff --git a/src/corelib/kernel/qpropertyprivate.h b/src/corelib/kernel/qpropertyprivate.h index 0edfe5781b7..91d9e56d2f0 100644 --- a/src/corelib/kernel/qpropertyprivate.h +++ b/src/corelib/kernel/qpropertyprivate.h @@ -283,7 +283,7 @@ public: void setPointer(T *ptr) { - *d = (reinterpret_cast(ptr) & QTaggedPointer::pointerMask()) | (*d & QTaggedPointer::tagMask()); + *d = reinterpret_cast(ptr) | (*d & QTaggedPointer::tagMask()); } T *get() const diff --git a/src/corelib/tools/qtaggedpointer.h b/src/corelib/tools/qtaggedpointer.h index 819ebb2387c..f6ce85eebc3 100644 --- a/src/corelib/tools/qtaggedpointer.h +++ b/src/corelib/tools/qtaggedpointer.h @@ -83,14 +83,13 @@ public: constexpr QTaggedPointer(std::nullptr_t) noexcept : QTaggedPointer() {} explicit QTaggedPointer(T *pointer, Tag tag = Tag()) noexcept - : d(quintptr(pointer)) + : d(quintptr(pointer) | quintptr(tag)) { static_assert(sizeof(Type*) == sizeof(QTaggedPointer)); - Q_ASSERT_X((quintptr(pointer) & tagMask()) == 0, - "QTaggedPointer", "Pointer is not aligned"); - - setTag(tag); + Q_ASSERT_X((quintptr(pointer) & tagMask()) == 0, "QTaggedPointer", "Pointer is not aligned"); + Q_ASSERT_X((static_cast::TagType>(tag) & pointerMask()) == 0, + "QTaggedPointer::setTag", "Tag is larger than allowed by number of available tag bits"); } Type &operator*() const noexcept @@ -125,7 +124,7 @@ public: Q_ASSERT_X((static_cast::TagType>(tag) & pointerMask()) == 0, "QTaggedPointer::setTag", "Tag is larger than allowed by number of available tag bits"); - d = (d & pointerMask()) | (static_cast::TagType>(tag) & tagMask()); + d = (d & pointerMask()) | static_cast(tag); } Tag tag() const noexcept