summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/tools/qarraydataops.h6
-rw-r--r--src/corelib/tools/qcache.h11
-rw-r--r--src/corelib/tools/qcontiguouscache.h2
-rw-r--r--src/corelib/tools/qflatmap_p.h2
-rw-r--r--src/corelib/tools/qhash.h6
-rw-r--r--src/corelib/tools/qmap.h25
-rw-r--r--src/corelib/tools/qvarlengtharray.h2
7 files changed, 42 insertions, 12 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index 183b6b0410..6e16d9280c 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -223,6 +223,8 @@ template <class T>
struct QPodArrayOps
: public QArrayDataPointer<T>
{
+ static_assert (std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
protected:
typedef QTypedArrayData<T> Data;
@@ -462,6 +464,8 @@ template <class T>
struct QGenericArrayOps
: public QArrayDataPointer<T>
{
+ static_assert (std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
protected:
typedef QTypedArrayData<T> Data;
@@ -892,6 +896,8 @@ template <class T>
struct QMovableArrayOps
: QGenericArrayOps<T>
{
+ static_assert (std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
protected:
typedef QTypedArrayData<T> Data;
diff --git a/src/corelib/tools/qcache.h b/src/corelib/tools/qcache.h
index 868b4a5854..4cfe4a4a48 100644
--- a/src/corelib/tools/qcache.h
+++ b/src/corelib/tools/qcache.h
@@ -193,8 +193,15 @@ class QCache
public:
inline explicit QCache(qsizetype maxCost = 100) noexcept
: mx(maxCost)
- {}
- inline ~QCache() { clear(); }
+ {
+ }
+ inline ~QCache()
+ {
+ static_assert(std::is_nothrow_destructible_v<Key>, "Types with throwing destructors are not supported in Qt containers.");
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
+ clear();
+ }
inline qsizetype maxCost() const noexcept { return mx; }
void setMaxCost(qsizetype m) noexcept(std::is_nothrow_destructible_v<Node>)
diff --git a/src/corelib/tools/qcontiguouscache.h b/src/corelib/tools/qcontiguouscache.h
index e4d493cc52..d830c31891 100644
--- a/src/corelib/tools/qcontiguouscache.h
+++ b/src/corelib/tools/qcontiguouscache.h
@@ -73,6 +73,8 @@ struct QContiguousCacheTypedData : public QContiguousCacheData
template<typename T>
class QContiguousCache {
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
typedef QContiguousCacheTypedData<T> Data;
Data *d;
public:
diff --git a/src/corelib/tools/qflatmap_p.h b/src/corelib/tools/qflatmap_p.h
index bf0efb2543..1b3eaea01c 100644
--- a/src/corelib/tools/qflatmap_p.h
+++ b/src/corelib/tools/qflatmap_p.h
@@ -109,6 +109,8 @@ template<class Key, class T, class Compare = std::less<Key>, class KeyContainer
class MappedContainer = QList<T>>
class QFlatMap : private QFlatMapValueCompare<Key, T, Compare>
{
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
using full_map_t = QFlatMap<Key, T, Compare, KeyContainer, MappedContainer>;
template <class U>
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index ce8982416d..5dc88943fc 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -725,6 +725,9 @@ public:
}
~QHash()
{
+ static_assert(std::is_nothrow_destructible_v<Key>, "Types with throwing destructors are not supported in Qt containers.");
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
if (d && !d->ref.deref())
delete d;
}
@@ -1191,6 +1194,9 @@ public:
}
~QMultiHash()
{
+ static_assert(std::is_nothrow_destructible_v<Key>, "Types with throwing destructors are not supported in Qt containers.");
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
if (d && !d->ref.deref())
delete d;
}
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index 7b59688fa4..e63eb85bca 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -68,6 +68,9 @@ public:
using iterator = typename Map::iterator;
using const_iterator = typename Map::const_iterator;
+ static_assert(std::is_nothrow_destructible_v<Key>, "Types with throwing destructors are not supported in Qt containers.");
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
Map m;
QMapData() = default;
@@ -217,7 +220,8 @@ public:
template <class Key, class T>
class QMap
{
- using MapData = QMapData<std::map<Key, T>>;
+ using Map = std::map<Key, T>;
+ using MapData = QMapData<Map>;
QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
friend class QMultiMap<Key, T>;
@@ -446,8 +450,8 @@ public:
friend class QMap<Key, T>;
friend class const_iterator;
- typename MapData::Map::iterator i;
- explicit iterator(typename MapData::Map::iterator it) : i(it) {}
+ typename Map::iterator i;
+ explicit iterator(typename Map::iterator it) : i(it) {}
public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef qptrdiff difference_type;
@@ -491,8 +495,8 @@ public:
class const_iterator
{
friend class QMap<Key, T>;
- typename MapData::Map::const_iterator i;
- explicit const_iterator(typename MapData::Map::const_iterator it) : i(it) {}
+ typename Map::const_iterator i;
+ explicit const_iterator(typename Map::const_iterator it) : i(it) {}
public:
typedef std::bidirectional_iterator_tag iterator_category;
@@ -745,7 +749,8 @@ Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(Map)
template <class Key, class T>
class QMultiMap
{
- using MapData = QMapData<std::multimap<Key, T>>;
+ using Map = std::multimap<Key, T>;
+ using MapData = QMapData<Map>;
QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
public:
@@ -1062,8 +1067,8 @@ public:
friend class QMultiMap<Key, T>;
friend class const_iterator;
- typename MapData::Map::iterator i;
- explicit iterator(typename MapData::Map::iterator it) : i(it) {}
+ typename Map::iterator i;
+ explicit iterator(typename Map::iterator it) : i(it) {}
public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef qptrdiff difference_type;
@@ -1107,8 +1112,8 @@ public:
class const_iterator
{
friend class QMultiMap<Key, T>;
- typename MapData::Map::const_iterator i;
- explicit const_iterator(typename MapData::Map::const_iterator it) : i(it) {}
+ typename Map::const_iterator i;
+ explicit const_iterator(typename Map::const_iterator it) : i(it) {}
public:
typedef std::bidirectional_iterator_tag iterator_category;
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index b538cf292d..975d088a48 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -60,6 +60,8 @@ QT_BEGIN_NAMESPACE
template<class T, qsizetype Prealloc>
class QVarLengthArray
{
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+
public:
QVarLengthArray() : QVarLengthArray(0) {}