Add support for QSharedPointer<cv qualified>::create()

[ChangeLog][QtCore][QSharedPointer] Fixed a problem that made create()
on a type with const qualification fail to compile.

Task-number: QTBUG-68300
Change-Id: I0825ff5b5f6f4c85939ffffd152f3e55e5b9caae
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
Thiago Macieira 2018-05-16 14:48:57 -07:00
parent fce6303a35
commit c359df5ca6
2 changed files with 15 additions and 4 deletions

View File

@ -246,7 +246,8 @@ namespace QtSharedPointer {
struct ExternalRefCountWithContiguousData: public ExternalRefCountData struct ExternalRefCountWithContiguousData: public ExternalRefCountData
{ {
typedef ExternalRefCountData Parent; typedef ExternalRefCountData Parent;
T data; typedef typename std::remove_cv<T>::type NoCVType;
NoCVType data;
static void deleter(ExternalRefCountData *self) static void deleter(ExternalRefCountData *self)
{ {
@ -262,7 +263,7 @@ namespace QtSharedPointer {
} }
static void noDeleter(ExternalRefCountData *) { } static void noDeleter(ExternalRefCountData *) { }
static inline ExternalRefCountData *create(T **ptr, DestroyerFn destroy) static inline ExternalRefCountData *create(NoCVType **ptr, DestroyerFn destroy)
{ {
ExternalRefCountWithContiguousData *d = ExternalRefCountWithContiguousData *d =
static_cast<ExternalRefCountWithContiguousData *>(::operator new(sizeof(ExternalRefCountWithContiguousData))); static_cast<ExternalRefCountWithContiguousData *>(::operator new(sizeof(ExternalRefCountWithContiguousData)));
@ -437,10 +438,12 @@ public:
# endif # endif
typename Private::DestroyerFn noDestroy = &Private::noDeleter; typename Private::DestroyerFn noDestroy = &Private::noDeleter;
QSharedPointer result(Qt::Uninitialized); QSharedPointer result(Qt::Uninitialized);
result.d = Private::create(&result.value, noDestroy); typename std::remove_cv<T>::type *ptr;
result.d = Private::create(&ptr, noDestroy);
// now initialize the data // now initialize the data
new (result.data()) T(std::forward<Args>(arguments)...); new (ptr) T(std::forward<Args>(arguments)...);
result.value = ptr;
result.d->destroyer = destroy; result.d->destroyer = destroy;
result.d->setQObjectShared(result.value, true); result.d->setQObjectShared(result.value, true);
# ifdef QT_SHAREDPOINTER_TRACK_POINTERS # ifdef QT_SHAREDPOINTER_TRACK_POINTERS

View File

@ -93,6 +93,7 @@ private slots:
void lambdaCustomDeleter(); void lambdaCustomDeleter();
#endif #endif
void creating(); void creating();
void creatingCvQualified();
void creatingVariadic(); void creatingVariadic();
void creatingQObject(); void creatingQObject();
void mixTrackingPointerCode(); void mixTrackingPointerCode();
@ -1771,6 +1772,13 @@ void tst_QSharedPointer::creating()
safetyCheck(); safetyCheck();
} }
void tst_QSharedPointer::creatingCvQualified()
{
auto cptr = QSharedPointer<const Data>::create();
auto vptr = QSharedPointer<volatile Data>::create();
auto cvptr = QSharedPointer<const volatile Data>::create();
}
void tst_QSharedPointer::creatingVariadic() void tst_QSharedPointer::creatingVariadic()
{ {
int i = 42; int i = 42;