diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/doc/snippets/customtype/customtypeexample.cpp | 1 | ||||
-rw-r--r-- | src/corelib/serialization/qxmlstream.cpp | 1 | ||||
-rw-r--r-- | src/corelib/text/qbytearray.cpp | 22 | ||||
-rw-r--r-- | src/corelib/text/qbytearray.h | 26 | ||||
-rw-r--r-- | src/corelib/text/qstring.cpp | 21 | ||||
-rw-r--r-- | src/corelib/text/qstring.h | 26 | ||||
-rw-r--r-- | src/tools/moc/generator.cpp | 44 | ||||
-rw-r--r-- | src/tools/moc/generator.h | 2 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 11 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 4 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 16 |
11 files changed, 97 insertions, 77 deletions
diff --git a/src/corelib/doc/snippets/customtype/customtypeexample.cpp b/src/corelib/doc/snippets/customtype/customtypeexample.cpp index afa2c4b2688..43f7ac7c3ae 100644 --- a/src/corelib/doc/snippets/customtype/customtypeexample.cpp +++ b/src/corelib/doc/snippets/customtype/customtypeexample.cpp @@ -39,6 +39,7 @@ QDebug operator<<(QDebug dbg, const Message &message); //! [custom type streaming operator] QDebug operator<<(QDebug dbg, const Message &message) { + QDebugStateSaver saver(dbg); const QList<QStringView> pieces = message.body().split(u"\r\n", Qt::SkipEmptyParts); if (pieces.isEmpty()) dbg.nospace() << "Message()"; diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index fe5c2de3bf6..ad9e1089bfe 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -3199,6 +3199,7 @@ void QXmlStreamWriterPrivate::raiseError(QXmlStreamWriter::Error errorCode) errorString = QXmlStream::tr("An error occurred while writing"); break; case QXmlStreamWriter::Error::None: + errorString.clear(); break; } } diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 7a8623dc254..dd91ebce703 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -2014,7 +2014,6 @@ void QByteArray::expand(qsizetype i) } /*! - \fn QByteArray &QByteArray::nullTerminate() \since 6.10 If this byte array's data isn't null-terminated, this method will make @@ -2027,9 +2026,17 @@ void QByteArray::expand(qsizetype i) \sa nullTerminated(), fromRawData(), setRawData() */ +QByteArray &QByteArray::nullTerminate() +{ + // Ensure \0-termination for fromRawData() byte arrays + if (!d.isMutable()) + *this = QByteArray{constData(), size()}; + return *this; +} /*! \fn QByteArray QByteArray::nullTerminated() const & + \fn QByteArray QByteArray::nullTerminated() && \since 6.10 Returns a copy of this byte array that is always null-terminated. @@ -2037,6 +2044,19 @@ void QByteArray::expand(qsizetype i) \sa nullTerminate(), fromRawData(), setRawData() */ +QByteArray QByteArray::nullTerminated() const & +{ + // Ensure \0-termination for fromRawData() byte arrays + if (!d.isMutable()) + return QByteArray{constData(), size()}; + return *this; +} + +QByteArray QByteArray::nullTerminated() && +{ + nullTerminate(); + return std::move(*this); +} /*! \fn QByteArray &QByteArray::prepend(QByteArrayView ba) diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h index 683e6dcca67..b35984d747e 100644 --- a/src/corelib/text/qbytearray.h +++ b/src/corelib/text/qbytearray.h @@ -531,29 +531,9 @@ public: #endif explicit inline QByteArray(DataPointer &&dd) : d(std::move(dd)) {} - [[nodiscard]] QByteArray nullTerminated() const & - { - // Ensure \0-termination for fromRawData() byte arrays - if (!d.isMutable()) - return QByteArray{constData(), size()}; - return *this; - } - - [[nodiscard]] QByteArray nullTerminated() && - { - // Ensure \0-termination for fromRawData() byte arrays - if (!d.isMutable()) - return QByteArray{constData(), size()}; - return std::move(*this); - } - - QByteArray &nullTerminate() - { - // Ensure \0-termination for fromRawData() byte arrays - if (!d.isMutable()) - *this = QByteArray{constData(), size()}; - return *this; - } + [[nodiscard]] QByteArray nullTerminated() const &; + [[nodiscard]] QByteArray nullTerminated() &&; + QByteArray &nullTerminate(); private: friend bool comparesEqual(const QByteArray &lhs, const QByteArrayView &rhs) noexcept diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index b2f4919c7c4..abba4b12fb2 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -7077,9 +7077,17 @@ const ushort *QString::utf16() const \sa nullTerminated(), fromRawData(), setRawData() */ +QString &QString::nullTerminate() +{ + // ensure '\0'-termination for ::fromRawData strings + if (!d->isMutable()) + *this = QString{constData(), size()}; + return *this; +} /*! \fn QString QString::nullTerminated() const & + \fn QString QString::nullTerminated() && \since 6.10 Returns a copy of this string that is always null-terminated. @@ -7087,6 +7095,19 @@ const ushort *QString::utf16() const \sa nullTerminated(), fromRawData(), setRawData() */ +QString QString::nullTerminated() const & +{ + // ensure '\0'-termination for ::fromRawData strings + if (!d->isMutable()) + return QString{constData(), size()}; + return *this; +} + +QString QString::nullTerminated() && +{ + nullTerminate(); + return std::move(*this); +} /*! Returns a string of size \a width that contains this string diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index a89104dbc8e..09cfbdfe94d 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -707,29 +707,9 @@ public: [[nodiscard]] QString repeated(qsizetype times) const; const ushort *utf16() const; // ### Qt 7 char16_t - [[nodiscard]] QString nullTerminated() const & - { - // ensure '\0'-termination for ::fromRawData strings - if (!d->isMutable()) - return QString{constData(), size()}; - return *this; - } - - [[nodiscard]] QString nullTerminated() && - { - // ensure '\0'-termination for ::fromRawData strings - if (!d->isMutable()) - return QString{constData(), size()}; - return std::move(*this); - } - - QString &nullTerminate() - { - // ensure '\0'-termination for ::fromRawData strings - if (!d->isMutable()) - *this = QString{constData(), size()}; - return *this; - } + [[nodiscard]] QString nullTerminated() const &; + [[nodiscard]] QString nullTerminated() &&; + QString &nullTerminate(); #if !defined(Q_QDOC) [[nodiscard]] QByteArray toLatin1() const & diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index b60b65d5fb5..1c3e529e531 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -628,11 +628,11 @@ void Generator::addFunctions(const QList<FunctionDef> &list, const char *functyp if (f.isConstructor) fprintf(out, "Constructor("); else - fprintf(out, "%s(", f.type.name.constData()); // return type + fprintf(out, "%s(", disambiguatedTypeName(f.type.name).constData()); // return type const char *comma = ""; for (const auto &argument : f.arguments) { - fprintf(out, "%s%s", comma, argument.type.name.constData()); + fprintf(out, "%s%s", comma, disambiguatedTypeName(argument.type.name).constData()); comma = ", "; } @@ -725,7 +725,7 @@ void Generator::addProperties() for (const PropertyDef &p : std::as_const(cdef->propertyList)) { fprintf(out, " // property '%s'\n" " QtMocHelpers::PropertyData<%s%s>(%d, ", - p.name.constData(), cxxTypeTag(p.typeTag), p.type.constData(), stridx(p.name)); + p.name.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), stridx(p.name)); generateTypeInfo(p.type); fputc(',', out); @@ -810,7 +810,7 @@ void Generator::addEnums() fprintf(out, " // %s '%s'\n" " QtMocHelpers::EnumData<%s>(%d, %d,", e.flags & EnumIsFlag ? "flag" : "enum", e.name.constData(), - e.name.constData(), stridx(e.name), stridx(typeName)); + disambiguatedTypeName(e.name).constData(), stridx(e.name), stridx(typeName)); if (e.flags) { const char *separator = ""; @@ -959,7 +959,7 @@ void Generator::generateStaticMetacall() if (it != begin) fprintf(out, ","); fprintf(out, "(*reinterpret_cast<%s>(_a[%d]))", - a.typeNameForCast.constData(), offset++); + disambiguatedTypeNameForCast(a.normalizedType).constData(), offset++); } }; @@ -1006,7 +1006,7 @@ void Generator::generateStaticMetacall() Q_ASSERT(!f.normalizedType.isEmpty()); fprintf(out, " case %d: ", methodindex); if (f.normalizedType != "void") - fprintf(out, "{ %s _r = ", noRef(f.normalizedType).constData()); + fprintf(out, "{ %s _r = ", disambiguatedTypeName(noRef(f.normalizedType)).constData()); fprintf(out, "_t->"); if (f.inPrivateClass.size()) fprintf(out, "%s->", f.inPrivateClass.constData()); @@ -1023,7 +1023,7 @@ void Generator::generateStaticMetacall() const ArgumentDef &a = *it; if (it != begin) fprintf(out, ","); - fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))",a.typeNameForCast.constData(), offset++); + fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))", disambiguatedTypeNameForCast(a.normalizedType).constData(), offset++); usedArgs |= UsedA; } if (f.isPrivateSignal) { @@ -1035,7 +1035,7 @@ void Generator::generateStaticMetacall() fprintf(out, ");"); if (f.normalizedType != "void") { fprintf(out, "\n if (_a[0]) *reinterpret_cast< %s*>(_a[0]) = std::move(_r); } ", - noRef(f.normalizedType).constData()); + disambiguatedTypeName(noRef(f.normalizedType)).constData()); usedArgs |= UsedA; } fprintf(out, " break;\n"); @@ -1169,19 +1169,19 @@ void Generator::generateStaticMetacall() #if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) else if (auto eflags = cdef->enumDeclarations.value(p.type); eflags & EnumIsFlag) fprintf(out, " case %d: QtMocHelpers::assignFlags<%s>(_v, %s%s()); break;\n", - propindex, p.type.constData(), prefix.constData(), p.read.constData()); + propindex, disambiguatedTypeName(p.type).constData(), prefix.constData(), p.read.constData()); #endif else if (p.read == "default") fprintf(out, " case %d: *reinterpret_cast<%s%s*>(_v) = %s%s().value(); break;\n", - propindex, cxxTypeTag(p.typeTag), p.type.constData(), + propindex, cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), prefix.constData(), p.bind.constData()); else if (!p.read.isEmpty()) fprintf(out, " case %d: *reinterpret_cast<%s%s*>(_v) = %s%s(); break;\n", - propindex, cxxTypeTag(p.typeTag), p.type.constData(), + propindex, cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), prefix.constData(), p.read.constData()); else fprintf(out, " case %d: *reinterpret_cast<%s%s*>(_v) = %s%s; break;\n", - propindex, cxxTypeTag(p.typeTag), p.type.constData(), + propindex, cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), prefix.constData(), p.member.constData()); } fprintf(out, " default: break;\n"); @@ -1206,21 +1206,21 @@ void Generator::generateStaticMetacall() if (p.write == "default") { fprintf(out, " case %d: {\n", propindex); fprintf(out, " %s%s().setValue(*reinterpret_cast<%s%s*>(_v));\n", - prefix.constData(), p.bind.constData(), cxxTypeTag(p.typeTag), p.type.constData()); + prefix.constData(), p.bind.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); fprintf(out, " break;\n"); fprintf(out, " }\n"); } else if (!p.write.isEmpty()) { fprintf(out, " case %d: %s%s(*reinterpret_cast<%s%s*>(_v)); break;\n", propindex, prefix.constData(), p.write.constData(), - cxxTypeTag(p.typeTag), p.type.constData()); + cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); } else { fprintf(out, " case %d:", propindex); if (p.notify.isEmpty()) { fprintf(out, " QtMocHelpers::setProperty(%s%s, *reinterpret_cast<%s%s*>(_v)); break;\n", - prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), p.type.constData()); + prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); } else { fprintf(out, "\n if (QtMocHelpers::setProperty(%s%s, *reinterpret_cast<%s%s*>(_v)))\n", - prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), p.type.constData()); + prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); fprintf(out, " Q_EMIT _t->%s(", p.notify.constData()); if (p.notifyId > -1) { const FunctionDef &f = cdef->signalList.at(p.notifyId); @@ -1483,6 +1483,18 @@ void Generator::generatePluginMetaData() fputs("\n", out); } +QByteArray Generator::disambiguatedTypeName(const QByteArray &name) +{ + if (cdef->allEnumNames.contains(name)) + return "enum " + name; + return name; +} + +QByteArray Generator::disambiguatedTypeNameForCast(const QByteArray &name) +{ + return QByteArray("std::add_pointer_t<"+ disambiguatedTypeName(name) +">"); +} + QT_WARNING_DISABLE_GCC("-Wunused-function") QT_WARNING_DISABLE_CLANG("-Wunused-function") QT_WARNING_DISABLE_CLANG("-Wundefined-internal") diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index 0ee2ad23919..a9d65764a2b 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -40,6 +40,8 @@ private: void generateStaticMetacall(); void generateSignal(const FunctionDef *def, int index); void generatePluginMetaData(); + QByteArray disambiguatedTypeName(const QByteArray &name); + QByteArray disambiguatedTypeNameForCast(const QByteArray &name); QMultiMap<QByteArray, int> automaticPropertyMetaTypesHelper(); QMap<int, QMultiMap<QByteArray, int>> methodsWithAutomaticTypesHelper(const QList<FunctionDef> &methodList); diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index da0096ebfe1..14280712154 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -243,7 +243,7 @@ enum class IncludeState { NoInclude, }; -bool Moc::parseEnum(EnumDef *def) +bool Moc::parseEnum(EnumDef *def, ClassDef *containingClass) { bool isTypdefEnum = false; // typedef enum { ... } Foo; @@ -252,6 +252,8 @@ bool Moc::parseEnum(EnumDef *def) if (test(IDENTIFIER)) { def->name = lexem(); + if (containingClass) + containingClass->allEnumNames.insert(def->name); } else { if (lookup(-1) != TYPEDEF) return false; // anonymous enum @@ -294,6 +296,8 @@ bool Moc::parseEnum(EnumDef *def) if (!test(IDENTIFIER)) return false; def->name = lexem(); + // used as the name for our enum, but we don't track it, + // because we only care about types that might conflict with members } return true; } @@ -316,7 +320,6 @@ void Moc::parseFunctionArguments(FunctionDef *def) arg.rightType += lexem(); } arg.normalizedType = normalizeType(QByteArray(arg.type.name + ' ' + arg.rightType)); - arg.typeNameForCast = QByteArray("std::add_pointer_t<"+arg.normalizedType+">"); if (test(EQ)) arg.isDefault = true; def->arguments += arg; @@ -772,7 +775,7 @@ void Moc::parse() break; case ENUM: { EnumDef enumDef; - if (parseEnum(&enumDef)) + if (parseEnum(&enumDef, nullptr)) def.enumList += enumDef; } break; case CLASS: @@ -979,7 +982,7 @@ void Moc::parse() break; case ENUM: { EnumDef enumDef; - if (parseEnum(&enumDef)) + if (parseEnum(&enumDef, &def)) def.enumList += enumDef; } break; case SEMIC: diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 6ee48b83df1..f08edb3f0d2 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -66,7 +66,6 @@ struct ArgumentDef ArgumentDef() : isDefault(false) {} Type type; QByteArray rightType, normalizedType, name; - QByteArray typeNameForCast; // type name to be used in cast from void * in metacall bool isDefault; QJsonObject toJson() const; @@ -198,6 +197,7 @@ struct ClassDef : BaseDef { QList<FunctionDef> signalList, slotList, methodList, publicList; QList<QByteArray> nonClassSignalList; QList<PropertyDef> propertyList; + QSet<QByteArray> allEnumNames; int revisionedMethods = 0; bool hasQObject = false; @@ -260,7 +260,7 @@ public: Type parseType(); - bool parseEnum(EnumDef *def); + bool parseEnum(EnumDef *def, ClassDef *containingClass); bool parseFunction(FunctionDef *def, bool inMacro = false); bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def); diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index b44046969f5..a8d42e556fd 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -622,6 +622,13 @@ void QMenuPrivate::hideMenu(QMenu *menu) QWindow *QMenuPrivate::transientParentWindow() const { Q_Q(const QMenu); + if (causedPopup.widget) { + if (const QWidget *w = causedPopup.widget.data()) { + if (const QWidget *ww = w->window()) + return ww->windowHandle(); + } + } + if (const QWidget *parent = q->nativeParentWidget()) { if (parent->windowHandle()) return parent->windowHandle(); @@ -632,13 +639,6 @@ QWindow *QMenuPrivate::transientParentWindow() const return w->transientParent(); } - if (causedPopup.widget) { - if (const QWidget *w = causedPopup.widget.data()) { - if (const QWidget *ww = w->window()) - return ww->windowHandle(); - } - } - return nullptr; } @@ -3037,7 +3037,7 @@ bool QMenu::event(QEvent *e) d->sloppyState.reset(); if (d->currentAction) d->popupAction(d->currentAction, 0, false); - if (isWindow() && window() && window()->windowHandle() && !window()->windowHandle()->transientParent()) + if (isWindow() && window() && window()->windowHandle()) window()->windowHandle()->setTransientParent(d->transientParentWindow()); break; #if QT_CONFIG(tooltip) |