summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/doc/snippets/customtype/customtypeexample.cpp1
-rw-r--r--src/corelib/serialization/qxmlstream.cpp1
-rw-r--r--src/corelib/text/qbytearray.cpp22
-rw-r--r--src/corelib/text/qbytearray.h26
-rw-r--r--src/corelib/text/qstring.cpp21
-rw-r--r--src/corelib/text/qstring.h26
-rw-r--r--src/tools/moc/generator.cpp44
-rw-r--r--src/tools/moc/generator.h2
-rw-r--r--src/tools/moc/moc.cpp11
-rw-r--r--src/tools/moc/moc.h4
-rw-r--r--src/widgets/widgets/qmenu.cpp16
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)