diff --git a/src/libs/qtcreatorcdbext/containers.cpp b/src/libs/qtcreatorcdbext/containers.cpp index e61fbd68e61..7dec387111a 100644 --- a/src/libs/qtcreatorcdbext/containers.cpp +++ b/src/libs/qtcreatorcdbext/containers.cpp @@ -758,14 +758,8 @@ static inline AbstractSymbolGroupNodePtrVector AddressSequence(arrayAddress, pointerSize), v.module(), innerType, count); // Check condition for large||static. - bool isLargeOrStatic = innerTypeSize > pointerSize; - if (!isLargeOrStatic && !SymbolGroupValue::isPointerType(innerType)) { - const KnownType kt = knownType(innerType, false); // inner type, no 'class ' prefix. - if (kt != KT_Unknown && !(kt & (KT_POD_Type|KT_Qt_PrimitiveType|KT_Qt_MovableType)) - && !(kt == KT_QStringList && QtInfo::get(v.context()).version >= 5)) { - isLargeOrStatic = true; - } - } + const bool isLargeOrStatic = innerTypeSize > pointerSize + || !SymbolGroupValue::isMovable(innerType, v); if (SymbolGroupValue::verbose) DebugPrint() << "isLargeOrStatic " << isLargeOrStatic; if (isLargeOrStatic) { @@ -776,7 +770,8 @@ static inline AbstractSymbolGroupNodePtrVector arrayChildList(v.node()->symbolGroup(), AddressArraySequence(reinterpret_cast(data)), v.module(), innerType, count) : - arrayChildList(v.node()->symbolGroup(), AddressArraySequence(reinterpret_cast(data)), + arrayChildList(v.node()->symbolGroup(), + AddressArraySequence(reinterpret_cast(data)), v.module(), innerType, count); delete [] data; return rc; diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp index db9d42a48f1..f02c12538ad 100644 --- a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp @@ -1505,6 +1505,14 @@ void formatKnownTypeFlags(std::ostream &os, KnownType kt) os << " simple_dumper"; } +unsigned SymbolGroupValue::isMovable(const std::string &t, const SymbolGroupValue &v) +{ + KnownType kt = knownType(t, false); + if (kt & (KT_POD_Type | KT_Qt_MovableType | KT_Qt_PrimitiveType)) + return true; + return kt == KT_QStringList && QtInfo::get(v.context()).version >= 5; +} + static inline DumpParameterRecodeResult checkCharArrayRecode(const SymbolGroupValue &v) { diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.h b/src/libs/qtcreatorcdbext/symbolgroupvalue.h index 529f937e3b6..56a8affb648 100644 --- a/src/libs/qtcreatorcdbext/symbolgroupvalue.h +++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.h @@ -112,6 +112,7 @@ public: static std::string moduleOfType(const std::string &type); // pointer type, return number of characters to strip static unsigned isPointerType(const std::string &); + static unsigned isMovable(const std::string &, const SymbolGroupValue &v); static bool isArrayType(const std::string &); static bool isVTableType(const std::string &t); // add pointer type 'Foo' -> 'Foo *', 'Foo *' -> 'Foo **'