moc: bump the full output revision and remove old support

This removes the venerable integer generation at moc time that was added
in Qt 4.0, in favor of the generation at constexpr time.

Change-Id: Ia1238b1de442a329d739fffd91d1498cad70bfb9
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
This commit is contained in:
Thiago Macieira 2024-08-27 22:22:46 -07:00
parent 29a6cb3386
commit c17c69c2ed
9 changed files with 56 additions and 456 deletions

View File

@ -11,7 +11,8 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
#ifndef Q_MOC_OUTPUT_REVISION #ifndef Q_MOC_OUTPUT_REVISION
#define Q_MOC_OUTPUT_REVISION 68 // This number should be in sync with moc's outputrevision.h
#define Q_MOC_OUTPUT_REVISION 69
#endif #endif
// The following macros can be defined by tools that understand Qt // The following macros can be defined by tools that understand Qt

View File

@ -78,8 +78,6 @@ template <uint... Nx> constexpr auto stringData(const char (&...strings)[Nx])
return result; return result;
} }
# define QT_MOC_HAS_STRINGDATA 1
struct NoType {}; struct NoType {};
template <typename T> struct ForceCompleteMetaTypes {}; template <typename T> struct ForceCompleteMetaTypes {};
@ -568,8 +566,6 @@ constexpr auto metaObjectData(uint flags, const Methods &methods, const Properti
return result; return result;
} }
#define QT_MOC_HAS_UINTDATA 1
template <typename T> inline std::enable_if_t<std::is_enum_v<T>> assignFlags(void *v, T t) noexcept template <typename T> inline std::enable_if_t<std::is_enum_v<T>> assignFlags(void *v, T t) noexcept
{ {
*static_cast<T *>(v) = t; *static_cast<T *>(v) = t;

View File

@ -131,17 +131,6 @@ int Generator::stridx(const QByteArray &s)
return i; return i;
} }
// Returns the sum of all parameters (including return type) for the given
// \a list of methods. This is needed for calculating the size of the methods'
// parameter type/name meta-data.
static int aggregateParameterCount(const QList<FunctionDef> &list)
{
int sum = 0;
for (const FunctionDef &def : list)
sum += int(def.arguments.size()) + 1; // +1 for return type
return sum;
}
bool Generator::registerableMetaType(const QByteArray &propertyType) bool Generator::registerableMetaType(const QByteArray &propertyType)
{ {
if (metaTypes.contains(propertyType)) if (metaTypes.contains(propertyType))
@ -269,8 +258,7 @@ void Generator::generateCode()
// Build the strings using QtMocHelpers::stringData // Build the strings using QtMocHelpers::stringData
// //
fprintf(out, "\n#ifdef QT_MOC_HAS_STRINGDATA\n" fprintf(out, "static constexpr auto qt_meta_stringdata_%s = QtMocHelpers::stringData(",
"static constexpr auto qt_meta_stringdata_%s = QtMocHelpers::stringData(",
qualifiedClassNameIdentifier.constData()); qualifiedClassNameIdentifier.constData());
{ {
char comma = 0; char comma = 0;
@ -281,10 +269,7 @@ void Generator::generateCode()
comma = ','; comma = ',';
} }
} }
fprintf(out, "\n);\n" fprintf(out, "\n);\n\n");
"#else // !QT_MOC_HAS_STRINGDATA\n");
fprintf(out, "#error \"qtmochelpers.h not found or too old.\"\n");
fprintf(out, "#endif // !QT_MOC_HAS_STRINGDATA\n\n");
// //
// build the data array // build the data array
@ -294,8 +279,7 @@ void Generator::generateCode()
// creating the meta object for, so we get access to everything it has // creating the meta object for, so we get access to everything it has
// access to and with the same contexts (for example, member enums and // access to and with the same contexts (for example, member enums and
// types). // types).
fprintf(out, "#ifdef QT_MOC_HAS_UINTDATA\n" fprintf(out, "template <> constexpr inline auto %s::qt_create_metaobjectdata<qt_meta_tag_%s_t>()\n"
"template <> constexpr inline auto %s::qt_create_metaobjectdata<qt_meta_tag_%s_t>()\n"
"{\n" "{\n"
" namespace QMC = QtMocConstants;\n" " namespace QMC = QtMocConstants;\n"
" QtMocHelpers::UintData qt_methods {\n", " QtMocHelpers::UintData qt_methods {\n",
@ -372,137 +356,13 @@ void Generator::generateCode()
// create a copy of qt_meta_data_types' members so the uint array ends up // create a copy of qt_meta_data_types' members so the uint array ends up
// in the pure .rodata section while the meta types is in .data.rel.ro // in the pure .rodata section while the meta types is in .data.rel.ro
fprintf(out, "static constexpr auto qt_meta_data_%s_array =\n" fprintf(out, "static constexpr auto qt_meta_data_%s =\n"
" qt_meta_data_types_%s.data;\n", " qt_meta_data_types_%s.data;\n",
qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData()); qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData());
fprintf(out, "static constexpr const uint *qt_meta_data_%s =\n"
" qt_meta_data_%s_array.data();\n",
qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData());
fprintf(out, "static constexpr auto qt_meta_types_%s =\n" fprintf(out, "static constexpr auto qt_meta_types_%s =\n"
" qt_meta_data_types_%s.metaTypes;\n", " qt_meta_data_types_%s.metaTypes;\n\n",
qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData()); qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData());
fprintf(out, "#else // !QT_MOC_HAS_UINTDATA\n");
int index = MetaObjectPrivateFieldCount;
fprintf(out, "Q_CONSTINIT static const uint qt_meta_data_%s[] = {\n", qualifiedClassNameIdentifier.constData());
fprintf(out, "\n // content:\n");
fprintf(out, " %4d, // revision\n", 12); // hardcoded to an earlier version
fprintf(out, " %4d, // classname\n", stridx(cdef->qualified));
fprintf(out, " %4d, %4d, // classinfo\n", int(cdef->classInfoList.size()), int(cdef->classInfoList.size() ? index : 0));
index += cdef->classInfoList.size() * 2;
qsizetype methodCount = 0;
if (qAddOverflow(cdef->signalList.size(), cdef->slotList.size(), &methodCount)
|| qAddOverflow(cdef->methodList.size(), methodCount, &methodCount)) {
parser->error("internal limit exceeded: the total number of member functions"
" (including signals and slots) is too big.");
}
fprintf(out, " %4" PRIdQSIZETYPE ", %4d, // methods\n", methodCount, methodCount ? index : 0);
index += methodCount * QMetaObjectPrivate::IntsPerMethod;
if (cdef->revisionedMethods)
index += methodCount;
int paramsIndex = index;
int totalParameterCount = aggregateParameterCount(cdef->signalList)
+ aggregateParameterCount(cdef->slotList)
+ aggregateParameterCount(cdef->methodList)
+ aggregateParameterCount(cdef->constructorList);
index += totalParameterCount * 2 // types and parameter names
- methodCount // return "parameters" don't have names
- int(cdef->constructorList.size()); // "this" parameters don't have names
fprintf(out, " %4d, %4d, // properties\n", int(cdef->propertyList.size()), int(cdef->propertyList.size() ? index : 0));
index += cdef->propertyList.size() * QMetaObjectPrivate::IntsPerProperty;
fprintf(out, " %4d, %4d, // enums/sets\n", int(cdef->enumList.size()), cdef->enumList.size() ? index : 0);
int enumsIndex = index;
for (const EnumDef &def : std::as_const(cdef->enumList))
index += QMetaObjectPrivate::IntsPerEnum + (def.values.size() * 2);
fprintf(out, " %4d, %4d, // constructors\n", isConstructible ? int(cdef->constructorList.size()) : 0,
isConstructible ? index : 0);
int flags = 0;
if (cdef->hasQGadget || cdef->hasQNamespace) {
// Ideally, all the classes could have that flag. But this broke classes generated
// by qdbusxml2cpp which generate code that require that we call qt_metacall for properties
flags |= PropertyAccessInStaticMetaCall;
}
fprintf(out, " %4d, // flags\n", flags);
fprintf(out, " %4d, // signalCount\n", int(cdef->signalList.size()));
//
// Build classinfo array
//
generateClassInfos();
qsizetype propEnumCount = 0;
// all property metatypes + all enum metatypes + 1 for the type of the current class itself
if (qAddOverflow(cdef->propertyList.size(), cdef->enumList.size(), &propEnumCount)
|| qAddOverflow(propEnumCount, qsizetype(1), &propEnumCount)
|| propEnumCount >= std::numeric_limits<int>::max()) {
parser->error("internal limit exceeded: number of property and enum metatypes is too big.");
}
int initialMetaTypeOffset = int(propEnumCount);
//
// Build signals array first, otherwise the signal indices would be wrong
//
generateFunctions(cdef->signalList, "signal", MethodSignal, paramsIndex, initialMetaTypeOffset);
//
// Build slots array
//
generateFunctions(cdef->slotList, "slot", MethodSlot, paramsIndex, initialMetaTypeOffset);
//
// Build method array
//
generateFunctions(cdef->methodList, "method", MethodMethod, paramsIndex, initialMetaTypeOffset);
//
// Build method version arrays
//
if (cdef->revisionedMethods) {
generateFunctionRevisions(cdef->signalList, "signal");
generateFunctionRevisions(cdef->slotList, "slot");
generateFunctionRevisions(cdef->methodList, "method");
}
//
// Build method parameters array
//
generateFunctionParameters(cdef->signalList, "signal");
generateFunctionParameters(cdef->slotList, "slot");
generateFunctionParameters(cdef->methodList, "method");
if (isConstructible)
generateFunctionParameters(cdef->constructorList, "constructor");
//
// Build property array
//
generateProperties();
//
// Build enums array
//
generateEnums(enumsIndex);
//
// Build constructors array
//
if (isConstructible)
generateFunctions(cdef->constructorList, "constructor", MethodConstructor, paramsIndex, initialMetaTypeOffset);
//
// Terminate data array
//
fprintf(out, "\n 0 // eod\n};\n");
fprintf(out, "#endif // !QT_MOC_HAS_UINTDATA\n\n");
// //
// Build extra array // Build extra array
// //
@ -590,7 +450,7 @@ void Generator::generateCode()
else else
fprintf(out, " nullptr,\n"); fprintf(out, " nullptr,\n");
fprintf(out, " qt_meta_stringdata_%s.offsetsAndSizes,\n" fprintf(out, " qt_meta_stringdata_%s.offsetsAndSizes,\n"
" qt_meta_data_%s,\n", qualifiedClassNameIdentifier.constData(), " qt_meta_data_%s.data(),\n", qualifiedClassNameIdentifier.constData(),
qualifiedClassNameIdentifier.constData()); qualifiedClassNameIdentifier.constData());
if (hasStaticMetaCall) if (hasStaticMetaCall)
fprintf(out, " qt_static_metacall,\n"); fprintf(out, " qt_static_metacall,\n");
@ -602,70 +462,9 @@ void Generator::generateCode()
else else
fprintf(out, " qt_meta_extradata_%s,\n", qualifiedClassNameIdentifier.constData()); fprintf(out, " qt_meta_extradata_%s,\n", qualifiedClassNameIdentifier.constData());
fprintf(out, "#ifdef QT_MOC_HAS_UINTDATA\n" fprintf(out, " qt_meta_types_%s.data(),\n",
" qt_meta_types_%s.data(),\n"
"#else\n",
qualifiedClassNameIdentifier.constData()); qualifiedClassNameIdentifier.constData());
const char *comma = "";
auto stringForType = [requireCompleteness](const QByteArray &type, bool forceComplete) -> QByteArray {
const char *forceCompleteType = forceComplete ? ", std::true_type>" : ", std::false_type>";
if (requireCompleteness)
return type;
return "QtPrivate::TypeAndForceComplete<" % type % forceCompleteType;
};
if (!requireCompleteness) {
fprintf(out, " qt_incomplete_metaTypeArray<qt_meta_tag_%s_t", qualifiedClassNameIdentifier.constData());
comma = ",";
} else {
fprintf(out, " qt_metaTypeArray<");
}
// metatypes for properties
for (const PropertyDef &p : std::as_const(cdef->propertyList)) {
fprintf(out, "%s\n // property '%s'\n %s",
comma, p.name.constData(), stringForType(p.type, true).constData());
comma = ",";
}
// metatypes for enums
for (const EnumDef &e : std::as_const(cdef->enumList)) {
fprintf(out, "%s\n // enum '%s'\n %s",
comma, e.name.constData(), stringForType(e.qualifiedType(cdef), true).constData());
comma = ",";
}
fprintf(out, "%s\n // Q_OBJECT / Q_GADGET\n %s",
comma, stringForType(ownType, true).constData());
comma = ",";
// metatypes for all exposed methods
// because we definitely printed something above, this section doesn't need comma control
const auto allMethods = {&cdef->signalList, &cdef->slotList, &cdef->methodList};
for (const QList<FunctionDef> *methodContainer : allMethods) {
for (const FunctionDef &fdef : *methodContainer) {
fprintf(out, ",\n // method '%s'\n %s",
fdef.name.constData(), stringForType(fdef.type.name, false).constData());
for (const auto &argument: fdef.arguments)
fprintf(out, ",\n %s", stringForType(argument.type.name, false).constData());
}
}
// but constructors have no return types, so this needs comma control again
for (const FunctionDef &fdef : std::as_const(cdef->constructorList)) {
if (fdef.arguments.isEmpty())
continue;
fprintf(out, "%s\n // constructor '%s'", comma, fdef.name.constData());
comma = "";
for (const auto &argument: fdef.arguments) {
fprintf(out, "%s\n %s", comma,
stringForType(argument.type.name, false).constData());
comma = ",";
}
}
fprintf(out, "\n >,\n");
fprintf(out, "#endif // !QT_MOC_HAS_UINTDATA\n");
fprintf(out, " nullptr\n} };\n\n"); fprintf(out, " nullptr\n} };\n\n");
// //
@ -781,17 +580,6 @@ void Generator::addClassInfos()
fprintf(out, " { %4d, %4d },\n", stridx(c.name), stridx(c.value)); fprintf(out, " { %4d, %4d },\n", stridx(c.name), stridx(c.value));
} }
void Generator::generateClassInfos()
{
if (cdef->classInfoList.isEmpty())
return;
fprintf(out, "\n // classinfo: key, value\n");
for (const ClassInfoDef &c : std::as_const(cdef->classInfoList))
fprintf(out, " %4d, %4d,\n", stridx(c.name), stridx(c.value));
}
void Generator::registerFunctionStrings(const QList<FunctionDef> &list) void Generator::registerFunctionStrings(const QList<FunctionDef> &list)
{ {
for (const FunctionDef &f : list) { for (const FunctionDef &f : list) {
@ -882,91 +670,6 @@ void Generator::addFunctions(const QList<FunctionDef> &list, const char *functyp
} }
} }
void Generator::generateFunctions(const QList<FunctionDef> &list, const char *functype, int type,
int &paramsIndex, int &initialMetatypeOffset)
{
if (list.isEmpty())
return;
fprintf(out, "\n // %ss: name, argc, parameters, tag, flags, initial metatype offsets\n", functype);
for (const FunctionDef &f : list) {
QByteArray comment;
uint flags = type;
if (f.access == FunctionDef::Private) {
flags |= AccessPrivate;
comment.append("Private");
} else if (f.access == FunctionDef::Public) {
flags |= AccessPublic;
comment.append("Public");
} else if (f.access == FunctionDef::Protected) {
flags |= AccessProtected;
comment.append("Protected");
}
if (f.isCompat) {
flags |= MethodCompatibility;
comment.append(" | MethodCompatibility");
}
if (f.wasCloned) {
flags |= MethodCloned;
comment.append(" | MethodCloned");
}
if (f.isScriptable) {
flags |= MethodScriptable;
comment.append(" | isScriptable");
}
if (f.revision > 0) {
flags |= MethodRevisioned;
comment.append(" | MethodRevisioned");
}
if (f.isConst) {
flags |= MethodIsConst;
comment.append(" | MethodIsConst ");
}
const int argc = int(f.arguments.size());
fprintf(out, " %4d, %4d, %4d, %4d, 0x%02x, %4d /* %s */,\n",
stridx(f.name), argc, paramsIndex, stridx(f.tag), flags, initialMetatypeOffset, comment.constData());
paramsIndex += 1 + argc * 2;
// constructors don't have a return type
initialMetatypeOffset += (f.isConstructor ? 0 : 1) + argc;
}
}
void Generator::generateFunctionRevisions(const QList<FunctionDef> &list, const char *functype)
{
if (list.size())
fprintf(out, "\n // %ss: revision\n", functype);
for (const FunctionDef &f : list)
fprintf(out, " %4d,\n", f.revision);
}
void Generator::generateFunctionParameters(const QList<FunctionDef> &list, const char *functype)
{
if (list.isEmpty())
return;
fprintf(out, "\n // %ss: parameters\n", functype);
for (const FunctionDef &f : list) {
fprintf(out, " ");
// Types
const bool allowEmptyName = f.isConstructor;
generateTypeInfo(f.normalizedType, allowEmptyName);
fputc(',', out);
for (const ArgumentDef &arg : f.arguments) {
fputc(' ', out);
generateTypeInfo(arg.normalizedType, allowEmptyName);
fputc(',', out);
}
// Parameter names
for (const ArgumentDef &arg : f.arguments)
fprintf(out, " %4d,", stridx(arg.name));
fprintf(out, "\n");
}
}
void Generator::generateTypeInfo(const QByteArray &typeName, bool allowEmptyName) void Generator::generateTypeInfo(const QByteArray &typeName, bool allowEmptyName)
{ {
@ -1074,65 +777,6 @@ void Generator::addProperties()
} }
} }
void Generator::generateProperties()
{
//
// Create meta data
//
if (cdef->propertyList.size())
fprintf(out, "\n // properties: name, type, flags, notifyId, revision\n");
for (const PropertyDef &p : std::as_const(cdef->propertyList)) {
uint flags = Invalid;
if (!isBuiltinType(p.type))
flags |= EnumOrFlag;
if (!p.member.isEmpty() && !p.constant)
flags |= Writable;
if (!p.read.isEmpty() || !p.member.isEmpty())
flags |= Readable;
if (!p.write.isEmpty()) {
flags |= Writable;
if (p.stdCppSet())
flags |= StdCppSet;
}
if (!p.reset.isEmpty())
flags |= Resettable;
if (p.designable != "false")
flags |= Designable;
if (p.scriptable != "false")
flags |= Scriptable;
if (p.stored != "false")
flags |= Stored;
if (p.user != "false")
flags |= User;
if (p.constant)
flags |= Constant;
if (p.final)
flags |= Final;
if (p.required)
flags |= Required;
if (!p.bind.isEmpty())
flags |= Bindable;
fprintf(out, " %4d, ", stridx(p.name));
generateTypeInfo(p.type);
int notifyId = p.notifyId;
if (p.notifyId < -1) {
// signal is in parent class
const int indexInStrings = int(strings.indexOf(p.notify));
notifyId = indexInStrings | IsUnresolvedSignal;
}
fprintf(out, ", 0x%.8x, uint(%d), %d,\n", flags, notifyId, p.revision);
}
}
void Generator::registerEnumStrings() void Generator::registerEnumStrings()
{ {
for (const EnumDef &e : std::as_const(cdef->enumList)) { for (const EnumDef &e : std::as_const(cdef->enumList)) {
@ -1184,38 +828,6 @@ void Generator::addEnums()
} }
} }
void Generator::generateEnums(int index)
{
if (cdef->enumDeclarations.isEmpty())
return;
fprintf(out, "\n // enums: name, alias, flags, count, data\n");
index += QMetaObjectPrivate::IntsPerEnum * cdef->enumList.size();
int i;
for (i = 0; i < cdef->enumList.size(); ++i) {
const EnumDef &e = cdef->enumList.at(i);
uint flags = e.flags | cdef->enumDeclarations.value(e.name);
fprintf(out, " %4d, %4d, 0x%.1x, %4d, %4d,\n",
stridx(e.name),
e.enumName.isNull() ? stridx(e.name) : stridx(e.enumName),
flags,
int(e.values.size()),
index);
index += e.values.size() * 2;
}
fprintf(out, "\n // enum data: key, value\n");
for (const EnumDef &e : std::as_const(cdef->enumList)) {
QByteArray prefix = cdef->qualified;
if (e.flags & EnumIsScoped)
prefix += "::" + (e.enumName.isNull() ? e.name : e.enumName);
for (const QByteArray &val : e.values) {
fprintf(out, " %4d, uint(%s::%s),\n",
stridx(val), prefix.constData(), val.constData());
}
}
}
void Generator::generateMetacall() void Generator::generateMetacall()
{ {
bool isQObject = (cdef->classname == "QObject"); bool isQObject = (cdef->classname == "QObject");

View File

@ -26,22 +26,15 @@ public:
private: private:
bool registerableMetaType(const QByteArray &propertyType); bool registerableMetaType(const QByteArray &propertyType);
void registerClassInfoStrings(); void registerClassInfoStrings();
void generateClassInfos();
void registerFunctionStrings(const QList<FunctionDef> &list); void registerFunctionStrings(const QList<FunctionDef> &list);
void registerByteArrayVector(const QList<QByteArray> &list); void registerByteArrayVector(const QList<QByteArray> &list);
void addProperties(); void addProperties();
void addEnums(); void addEnums();
void addFunctions(const QList<FunctionDef> &list, const char *functype); void addFunctions(const QList<FunctionDef> &list, const char *functype);
void addClassInfos(); void addClassInfos();
void generateFunctions(const QList<FunctionDef> &list, const char *functype, int type,
int &paramsIndex, int &initialMetatypeOffset);
void generateFunctionRevisions(const QList<FunctionDef> &list, const char *functype);
void generateFunctionParameters(const QList<FunctionDef> &list, const char *functype);
void generateTypeInfo(const QByteArray &typeName, bool allowEmptyName = false); void generateTypeInfo(const QByteArray &typeName, bool allowEmptyName = false);
void registerEnumStrings(); void registerEnumStrings();
void generateEnums(int index);
void registerPropertyStrings(); void registerPropertyStrings();
void generateProperties();
void generateMetacall(); void generateMetacall();
void generateStaticMetacall(); void generateStaticMetacall();
void generateSignal(const FunctionDef *def, int index); void generateSignal(const FunctionDef *def, int index);

View File

@ -4,7 +4,7 @@
#ifndef OUTPUTREVISION_H #ifndef OUTPUTREVISION_H
#define OUTPUTREVISION_H #define OUTPUTREVISION_H
// if the output revision changes, you MUST change it in qobjectdefs.h too // if the output revision changes, you MUST change it in qtmetamacros.h too
enum { mocOutputRevision = 68 }; // moc format output revision enum { mocOutputRevision = 69 }; // moc format output revision
#endif // OUTPUTREVISION_H #endif // OUTPUTREVISION_H

View File

@ -15,6 +15,6 @@
} }
], ],
"inputFile": "MetaType.h", "inputFile": "MetaType.h",
"outputRevision": 68 "outputRevision": 69
} }
] ]

View File

@ -30,6 +30,6 @@
} }
], ],
"inputFile": "MetaType.h", "inputFile": "MetaType.h",
"outputRevision": 68 "outputRevision": 69
} }
] ]

View File

@ -23,7 +23,7 @@
} }
], ],
"inputFile": "backslash-newlines.h", "inputFile": "backslash-newlines.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -41,7 +41,7 @@
} }
], ],
"inputFile": "c-comments.h", "inputFile": "c-comments.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -73,7 +73,7 @@
} }
], ],
"inputFile": "cstyle-enums.h", "inputFile": "cstyle-enums.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -306,7 +306,7 @@
} }
], ],
"inputFile": "cxx11-enums.h", "inputFile": "cxx11-enums.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -654,7 +654,7 @@
} }
], ],
"inputFile": "cxx11-explicit-override-control.h", "inputFile": "cxx11-explicit-override-control.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -768,7 +768,7 @@
} }
], ],
"inputFile": "cxx11-final-classes.h", "inputFile": "cxx11-final-classes.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -848,7 +848,7 @@
} }
], ],
"inputFile": "cxx11-trailing-return.h", "inputFile": "cxx11-trailing-return.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -886,7 +886,7 @@
} }
], ],
"inputFile": "cxx17-namespaces.h", "inputFile": "cxx17-namespaces.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -916,7 +916,7 @@
} }
], ],
"inputFile": "dir-in-include-path.h", "inputFile": "dir-in-include-path.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -934,7 +934,7 @@
} }
], ],
"inputFile": "enum_with_include.h", "inputFile": "enum_with_include.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -966,7 +966,7 @@
} }
], ],
"inputFile": "escapes-in-string-literals.h", "inputFile": "escapes-in-string-literals.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1186,7 +1186,7 @@
} }
], ],
"inputFile": "forward-declared-param.h", "inputFile": "forward-declared-param.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1218,7 +1218,7 @@
} }
], ],
"inputFile": "function-with-attributes.h", "inputFile": "function-with-attributes.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1252,7 +1252,7 @@
} }
], ],
"inputFile": "gadgetwithnoenums.h", "inputFile": "gadgetwithnoenums.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1288,7 +1288,7 @@
} }
], ],
"inputFile": "grand-parent-gadget-class.h", "inputFile": "grand-parent-gadget-class.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1356,7 +1356,7 @@
} }
], ],
"inputFile": "moc_include.h", "inputFile": "moc_include.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1422,7 +1422,7 @@
} }
], ],
"inputFile": "namespace.h", "inputFile": "namespace.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1453,7 +1453,7 @@
} }
], ],
"inputFile": "namespaced-base-class.h", "inputFile": "namespaced-base-class.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1541,7 +1541,7 @@
} }
], ],
"inputFile": "namespaced-flags.h", "inputFile": "namespaced-flags.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1575,7 +1575,7 @@
} }
], ],
"inputFile": "no-keywords.h", "inputFile": "no-keywords.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1593,7 +1593,7 @@
} }
], ],
"inputFile": "non-gadget-parent-class.h", "inputFile": "non-gadget-parent-class.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1656,7 +1656,7 @@
} }
], ],
"inputFile": "oldstyle-casts.h", "inputFile": "oldstyle-casts.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1878,7 +1878,7 @@
} }
], ],
"inputFile": "parse-defines.h", "inputFile": "parse-defines.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1896,7 +1896,7 @@
} }
], ],
"inputFile": "plugin_metadata.h", "inputFile": "plugin_metadata.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -1993,7 +1993,7 @@
} }
], ],
"inputFile": "pointery_to_incomplete.h", "inputFile": "pointery_to_incomplete.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2069,7 +2069,7 @@
} }
], ],
"inputFile": "pure-virtual-signals.h", "inputFile": "pure-virtual-signals.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2138,7 +2138,7 @@
} }
], ],
"inputFile": "qflags64object.h", "inputFile": "qflags64object.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2190,7 +2190,7 @@
} }
], ],
"inputFile": "qinvokable.h", "inputFile": "qinvokable.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2228,7 +2228,7 @@
} }
], ],
"inputFile": "qmlmacro.h", "inputFile": "qmlmacro.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2262,7 +2262,7 @@
} }
], ],
"inputFile": "qprivateslots.h", "inputFile": "qprivateslots.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2284,7 +2284,7 @@
} }
], ],
"inputFile": "qtbug-35657-gadget.h", "inputFile": "qtbug-35657-gadget.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2317,7 +2317,7 @@
} }
], ],
"inputFile": "related-metaobjects-in-gadget.h", "inputFile": "related-metaobjects-in-gadget.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2372,7 +2372,7 @@
} }
], ],
"inputFile": "related-metaobjects-in-namespaces.h", "inputFile": "related-metaobjects-in-namespaces.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2832,7 +2832,7 @@
} }
], ],
"inputFile": "related-metaobjects-name-conflict.h", "inputFile": "related-metaobjects-name-conflict.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2871,7 +2871,7 @@
} }
], ],
"inputFile": "signal-with-default-arg.h", "inputFile": "signal-with-default-arg.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2899,7 +2899,7 @@
} }
], ],
"inputFile": "single-quote-digit-separator-n3781.h", "inputFile": "single-quote-digit-separator-n3781.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2973,7 +2973,7 @@
} }
], ],
"inputFile": "slots-with-void-template.h", "inputFile": "slots-with-void-template.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -2991,7 +2991,7 @@
} }
], ],
"inputFile": "task192552.h", "inputFile": "task192552.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -3021,7 +3021,7 @@
} }
], ],
"inputFile": "task234909.h", "inputFile": "task234909.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -3184,7 +3184,7 @@
} }
], ],
"inputFile": "task240368.h", "inputFile": "task240368.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -3202,7 +3202,7 @@
} }
], ],
"inputFile": "task87883.h", "inputFile": "task87883.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -3281,7 +3281,7 @@
} }
], ],
"inputFile": "tech-preview.h", "inputFile": "tech-preview.h",
"outputRevision": 68 "outputRevision": 69
}, },
{ {
"classes": [ "classes": [
@ -3360,6 +3360,6 @@
} }
], ],
"inputFile": "trigraphs.h", "inputFile": "trigraphs.h",
"outputRevision": 68 "outputRevision": 69
} }
] ]

View File

@ -2599,13 +2599,11 @@ public Q_SLOTS:
void someSlot2(int) {} void someSlot2(int) {}
public: public:
Q_INVOKABLE PrivateClass() {} Q_INVOKABLE PrivateClass() {}
#ifdef QT_MOC_HAS_UINTDATA // access to private class' enums was fixed for Qt 6.9
enum SomeEnum { enum SomeEnum {
Value0, Value0,
Value1, Value1,
}; };
Q_ENUM(SomeEnum) Q_ENUM(SomeEnum)
#endif
}; };
void tst_Moc::privateClass() void tst_Moc::privateClass()