summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel
Commit message (Collapse)AuthorAgeFilesLines
* Anticipate various warnings in tst_QVariantEdward Welbourne2022-10-181-18/+40
| | | | | | | | | Various places were knowingly provoking warnings without telling QTest to check for and suppress those warnings. Some others did check for this warning, so let's consistently suppress the noise. Change-Id: I71b9829680c7a513f4d8fbb3c57442875a6c2dc4 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Port from qAsConst() to std::as_const()Marc Mutz2022-10-112-2/+2
| | | | | | | | | | | | | | | | We've been requiring C++17 since Qt 6.0, and our qAsConst use finally starts to bother us (QTBUG-99313), so time to port away from it now. Since qAsConst has exactly the same semantics as std::as_const (down to rvalue treatment, constexpr'ness and noexcept'ness), there's really nothing more to it than a global search-and-replace, with manual unstaging of the actual definition and documentation in dist/, src/corelib/doc/ and src/corelib/global/. Task-number: QTBUG-99313 Change-Id: I4c7114444a325ad4e62d0fcbfd347d2bbfb21541 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
* Distinguish the repeats of QSystemSemaphor's processes testsEdward Welbourne2022-10-111-3/+3
| | | | | | | | It's not clear why this test repeats each test-case five times, but give the duplicates distinct names, at least. Change-Id: I4a098d90c3fe6f61842745c1d5f62047fe13a9b5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Remove duplicate tst_QVariant canConvert:Int data rowEdward Welbourne2022-10-111-3/+0
| | | | | | | There were simply two copies of the same row-adding code. Change-Id: I12240dedf2649c314ad32984f4de9d6b9bf280d8 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* JNI: add generic support for array-typesVolker Hilsheimer2022-10-101-0/+9
| | | | | | | | | | | | | | | | | | | The typeSignature for a type T[] is always "[" + typeSignature<t>, so we can just implicitly support arrays of any known type. To prevent support for multi-dimensional arrays, make sure that the underlying type is not also an array. By adding a QJniTypes::isArrayType in addition (that is true for any type with a signature starting with '['), methods like QJniObject::callMethod could then return a special QJniArray type that provides array-specific functionality. As a drive-by, and since all lines need to be touched to add braces, replace std::is_same<>::value with std::is_same_v. Change-Id: Iccadf03cfceb8544381a8f635bb54baeddf46c99 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
* Port from container.count()/length() to size()Marc Mutz2022-10-049-54/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is semantic patch using ClangTidyTransformator: auto QtContainerClass = expr(hasType(namedDecl(hasAnyName(<classes>)))).bind(o) makeRule(cxxMemberCallExpr(on(QtContainerClass), callee(cxxMethodDecl(hasAnyName({"count", "length"), parameterCountIs(0))))), changeTo(cat(access(o, cat("size"), "()"))), cat("use 'size()' instead of 'count()/length()'")) a.k.a qt-port-to-std-compatible-api with config Scope: 'Container'. <classes> are: // sequential: "QByteArray", "QList", "QQueue", "QStack", "QString", "QVarLengthArray", "QVector", // associative: "QHash", "QMultiHash", "QMap", "QMultiMap", "QSet", // Qt has no QMultiSet Change-Id: Ibe8837be96e8d30d1846881ecd65180c1bc459af Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* tst_QSharedMemory: remove mention of gravlaks.troll.noThiago Macieira2022-09-281-4/+0
| | | | | | | | | | | | | | | | | It was our old, HP-UX machine on Itanium (ran on big-endian mode). We don't support HP-UX any more; HP will still support the 11i v3 release until 2025, but I doubt anyone wants to run any new software there. One hopes that HP has long since fixed the issue, but I doubt it since the last release is from 2007. Gravlaks probably ran HP-UX 11i v3. There are a couple other left-overs of ".troll.no" in the repository, the majority of which are URL manipulation in tst_qurl.cpp and in tst_qnetworkcookie.cpp, then the certificates for fluke.troll.no (valid until 2035) and aspiriniks.troll.no (expired in 2009, but we don't need it for validity). Change-Id: I810d70e579eb4e2c8e45fffd1719122747d7b85a Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* QMetaType: Support custom unary converters with optional<To> return typeArno Rehn2022-09-271-14/+53
| | | | | | | | | | | | | | | To indicate success of a conversion, the public API has previously only supported registering member functions of the form To (From::*)(bool *). When adding custom converters for types that cannot be modified, this is usually not a possibility. As an alternative, this patch adds support for std::optional in the UnaryFunction overload of QMetaType::registerConverter. If the returned optional has no value, the conversion is considered failed. Task-number: QTBUG-92902 Change-Id: Ibac52d2cb9b5a2457081b4bebb0def1f03e3c55d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Remove preprocessor conditionals for chrono includeKonrad Kujawa2022-09-162-17/+1
| | | | | | | | | __has_include(<chrono>) is always true, because C++11 chrono include is required since 6.0. Pick-to: 6.4 6.3 6.2 Change-Id: I50cb92571bf4f1f86e2f3f2b5f486dd3c3f30f4a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QWinRegistryKey: refactorYuhang Zhao2022-09-144-0/+243
| | | | | | | | | | | | | | | | | | | | | | Refactor QWinRegistryKey to make it more modern and more usable from outside. Adjust the test for QWinRegistryKey to test the new functions, merged with the original test. Will port raw registry accessing code in QtBase to use this class in follow-up commits. This change is the first step. The long term goal is to port QSettings registry code to this class instead of using raw Win32 APIs, however, there's much more registry code in QSettings and migrate them to this class needs a large refactor, so jsut leave it for now. Will fix it in some future commit. Change-Id: Iada2adb41b4d58e1b658ff6870a4b31ace479d43 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Compile guard tests in corelib/kernel that need threading supportMikolaj Boc2022-09-116-0/+20
| | | | | | | | | Some tests in corelib/kernel need threading support, but they are not guarded against compilation if Qt is built without threading. Such tests have been disabled in this case. Change-Id: I2f5dc9582f2a59b6af2a9e56638b045dca06193d Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
* Fix cmake warnings from using deprecated PUBLIC_LIBRARIESVolker Hilsheimer2022-09-051-1/+1
| | | | | | Pick-to: 6.4 Change-Id: I8d4f0d9e98edc4e06dda9f58e62197572b4cbdbc Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* Don't batch qmetaobject_compatMikolaj Boc2022-09-021-0/+1
| | | | | | | | | | Batching the tests leads to one of the tests tst_qmetaobject and tst_qmetaobject_compat not being registered in the batch. Attempts to batch those together fail as batch test name is defined per-source, which, in this rare case, is the same across the two targets. Change-Id: I356931feabc004c39ba0b6863b5f64e06d739a58 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* QMetaObject: pass the QMetaTypes in variadic invoke/newInstanceThiago Macieira2022-09-013-77/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [ChangeLog][QtCore][Meta Object] QMetaMethod::invoke(), QMetaObject::invokeMethod(), and QMetaObject::newInstance() are no longer limited to 10 arguments. [ChangeLog][QtCore][Meta Object] The use of the Q_ARG macro is no longer necessary when using QMetaMethod::invoke(), QMetaObject::invokeMethod(), and QMetaObject::newInstance(). Types may now be passed directly. Similarly, Q_RETURN_ARG can be replaced by the free function qReturnArg(). [ChangeLog][Potentially Source-Incompatible Changes] QMetaMethod::invoke(), QMetaObject::invokeMethod(), and QMetaObject::newInstance() no longer support passing forward-declared types in the argument list (it was possible to pass them by const-ref). From Qt 6.5 onwards, all types in the argument list must be fully defined. [ChangeLog][Potentially Source-Incompatible Changes] Attempting to use the internal types QArgument, QReturnArgument, QGenericArgument, or QGenericReturnArgument directly with QMetaMethod::invoke(), QMetaObject::invokeMethod() or QMetaObject::newInstance() may fail to compile. Those are internal types that were never meant to be used directly and will be removed in Qt 7. If really necessary, ensure all arguments passed to those functions are directly using those classes and not mixed with Q_ARG and Q_RETURN_ARG. Implementations of bindings to other languages should contact the Qt development mailing list to discuss options. Change-Id: I36b24183fbd041179f2ffffd1701e3e8e47e0fba Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QVariant: fix conversions of Q_ENUM that are QFlags<> to stringEirik Aavitsland2022-09-011-0/+2
| | | | | | | | | | The doc of QMetaEnum::valueToKey() says to use ::valueToKeys() instead for flag types. Pick-to: 6.4 Change-Id: I48e5ba47324137f2ce2710f1d876e93e7c562e9f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* QMetaObject: add a new, variadic invoke/invokeMethod/newInstanceThiago Macieira2022-08-302-22/+629
| | | | | | | | | | | | | | | | | [ChangeLog][QtCore][Meta Objects] The QMetaObject::invokeMethod() taking a method name by string, QMetaObject::newInstance(), and QMetaMethod::invoke() now support more than 10 arguments. [ChangeLog][QtCore][Meta Objects] The use of the Q_ARG and Q_RETURN_ARG macros is now optional with QMetaObject::invokeMethod(), QMetaObject::newInstance(), and QMetaMethod::invoke(): the type name will be obtained from the C++ type (the same as QMetaType). The function qReturnArg() can be used in place of the Q_RETURN_ARG macro. The macros are still useful in rare conditions where the type was typedef'ed from its original name. Change-Id: I36b24183fbd041179f2ffffd17022a2b48c7639b Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* tst_qobject: port away from deprecated methodsIvan Solovev2022-08-302-29/+17
| | | | | | | | | | | | | | | | | | | | | | The patch includes the following replacements: * QMetaType::type("name") -> QMetaType::fromType<Type>().id() * QMetaProperty::type() -> QMetaProperty::typeId() * QVariant::Type -> QMetaType::Type * qRegisterMetaType<T>("name") -> qResigeterMetaType<T>() * The static QMetaType::{load,save} methods are replaced with non-static versions * Replace QCOMPARE(property.type(), QVariant::UserType) with QCOMPARE_GT(property.typeId(), QMetaType::User), because the deprecated type() method was treating each custom type (id >= QVariant::UserType) as QVariant::UserType, while the typeId() method simply returns the actual id. As a drive-by: remove unneeded QMetaType registration tests as we have tst_QMetaType to check it. Task-number: QTBUG-104858 Change-Id: Ia08e002efdf07ff83366a5193164dba96a956f9a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* tst_qvariant: port away from deprecated methodsIvan Solovev2022-08-302-152/+184
| | | | | | | | | | | | | | The most common changes are: * guard the tests for deprecated APIs with QT_DEPRECATED_SINCE * QVariant(QVariant::Type) ctor -> QVariant(QMetaType) ctor * QVariant::type() -> QVariant::typeId() * QVariant::canConvert(int) -> QVariant::canConvert(QMetaType) * QVariant::convert(int) -> QVariant::convert(QMetaType) * QVariant::Type -> QMetaType::Type Task-number: QTBUG-104858 Change-Id: I00584acb24d29b461faa1115f8f8d36a0b443883 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* tst_qmetatype: port away from deprecated callsIvan Solovev2022-08-304-156/+304
| | | | | | | | | | | | | | | | | | | | | | | | The most common changes are: * Replace QMetaType::type("name") with QMetaType::fromName("name").id() or QMetaType::fromType<Type>().id() * QMetaType::typeName(int) -> QMetaType(int).name() * QMetaType::typeFlags(int) -> QMetaType(int).flags() * QMetaType::metaObjectForType(int) -> QMetaType(int).metaObject() * The static QMetaType::{load,save} methods are replaced with non-static versions * The static QMetaType::{create,destroy,construct, destruct} methods are guarded by QT_DEPRECATED_SINCE calls. The tests are also extended with non-static calls where they were missing. Fixed potential memory-leaks in these tests. Add separate unit-tests for deprecated APIs and guard them with QT_DEPRECATED_SINCE As a drive-by: use nullptr instead of 0 in some places Task-number: QTBUG-104858 Change-Id: I4b0cdd29bc197c186b835002372240aae3098c33 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVariant: fix conversions of string keys to Q_ENUM that are QFlags<>Thiago Macieira2022-08-301-0/+5
| | | | | | | | | | | | | Since Qt 6.0, QMetaType stores the name obtained from the C++ compiler, which means we know a type like Qt::Alignment by its proper, full name of QFlags<Qt::AlignmentFlag>. However, the meta object records only the bare name of the enumeration, not the full flags. Pick-to: 6.2 6.3 6.4 Fixes: QTBUG-105932 Fixes: QTBUG-96185 Change-Id: Ic6547f8247454b47baa8fffd170eab977e306377 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QMetaObject: fix the consistency check for forward-declared builtinsThiago Macieira2022-08-263-0/+55
| | | | | | | | | | | For those, moc does know their type ID, and yet they may be still forward-declared in the C++ side, so the meta object may have recorded a null pointer in the metatype array. Fixes: QTBUG-105832 Change-Id: Ic6547f8247454b47baa8fffd170dae07c0813dc7 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Change the license of all CMakeLists.txt and *.cmake files to BSDLucie Gérard2022-08-2334-34/+34
| | | | | | | Task-number: QTBUG-105718 Change-Id: I5d3ef70a31235868b9be6cb479b7621bf2a8ba39 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* Don't access QObjectPrivate::declarativeData unguardedVolker Hilsheimer2022-08-201-0/+77
| | | | | | | | | | | | | | | | | | | | | The QObjectPrivate::declarativeData member is stored in a union with currentChildBeingDeleted. The QObject destructor always sets the currentChildBeingDeleted member of the union. It also sets the isDeletingChildren bool, which is the only way to find out which union member we can safely access. While the QObject destructor is deleting children and isDeletingChildren is set, we must not access the declarativeData member of the union. Add a test case that initializes the function pointers for the declarative handlers and constructs a situation where an object emits a signal while it is destroying children. Fixes: QTBUG-105286 Pick-to: 6.4 6.3 6.3.2 6.2 5.15 Change-Id: Iea5ba2f7843b6926a8d157be166e6044d98d6c02 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Rename QT_DISABLE_DEPRECATED_BEFORE -> QT_DISABLE_DEPRECATED_UP_TOIvan Solovev2022-08-193-3/+3
| | | | | | | | | | | | | | The new name describes the behavior in a better way. [ChangeLog][Build System] The QT_DISABLE_DEPRECATED_BEFORE macro is renamed to QT_DISABLE_DEPRECATED_UP_TO. The old name is deprecated, but is still recognized if it is defined during configuration and the new name is not defined. Task-number: QTBUG-104944 Change-Id: Ifc34323e0bbd9e3dc2f86c3e80d4d0940ebccbb8 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QMetaType: don't use global relocations to the lambdas and structuresThiago Macieira2022-08-121-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | The way the Qt 6.0 QMetaTypeInterface was designed, using a static inline variable in a template, would normally require the linker and dynamic linker to merge all copies and choose a single copy as the official one. But because of hidden visibility and of Windows DLLs, QMetaType already copes with multiple copies NOT getting merged. So we may as well ask the linkers not to bother and use simpler, local relocations to find those symbols. They are all supposed to still be equivalent and it's an ODR violation if they're not. The Apple ld64 linker complains if you use this type of global relocation: ld: warning: direct access in function [...] to global weak symbol 'QtPrivate::QMetaTypeInterfaceWrapper<int>::metaType' Fixes: QTBUG-93471 Pick-to: 6.3 6.4 Change-Id: Id0fb9ab0089845ee8843fffd16f98a10aa719434 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QMetaType: add a test to confirm that types are equal across librariesThiago Macieira2022-08-127-5/+193
| | | | | | | | Because of the template shenanigans. This is just to make sure. Pick-to: 6.4 Change-Id: Id0fb9ab0089845ee8843fffd16f989e7d555894f Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* Remove assertion from ownMethodIndex that breaks testsSami Shalayel2022-08-101-0/+39
| | | | | | | | | | | | | | | | | | | | ownMethodIndex works for all kind of methods, also for constructors. Therefore, remove the assertion there (that checks for non constructors) and add a test in qtbase so it does not happen again. The test broken by the assertion is in qtdeclarative: tst_QJSEngine::newQMetaObject(). Also rename QMetaMethodPrivate::ownConstructorIndex() to ownConstructorMethodIndex() as the previous naming implied that ownMethodIndex() could not be used for constructors. amends b73ab954dffffc462b6f6efe5a2dd97efeab0038 Task-number: QTBUG-105360 Change-Id: I0244993ed79bee055645b5443f5d02e1c089a6c6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Add license headers to cmake filesLucie Gérard2022-08-0334-0/+108
| | | | | | | | | | | | CMakeLists.txt and .cmake files of significant size (more than 2 lines according to our check in tst_license.pl) now have the copyright and license header. Existing copyright statements remain intact Task-number: QTBUG-88621 Change-Id: I3b98cdc55ead806ec81ce09af9271f9b95af97fa Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* QMetaObject: fix calling overloaded functions & constructorsThiago Macieira2022-08-011-2/+69
| | | | | | | | | | | The rewrites in a1c34d8bd09bfc6e80dcb06c7900d40c2d32518c, 0f76e55bc440a70f5d9530a192c9ce6334a8f069 and in commit b73ab954dffffc462b6f6efe5a2dd97efeab0038 didn't do this right, though no problem ended up happening. In particular, the constructor one failed to check if there were even more parameters. Change-Id: I6f936da6f6e84d649f70fffd1706f827ba635584 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QProperty: Notify observers even when dependency is goneFabian Kosmale2022-08-011-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem description: -------------------- Assume we have two properties, P1 and P2. Assume further that we assign a binding to P2, so that it depends on P1. Let the binding additionally capture some (non-QProperty) boolean, and only create the dependency to P1 if the boolean is true. The state afterwards is P1:[p1vaue|firstObserver] | | v ---[p2binding] / P2:[p2value|binding] If the boolean is set to false, and P1 changes its value, we still correctly re-evaluate the binding and update P2's value. However, during binding evaluation we will notice that there is no further dependency from P2 on P1, and remove its observer. The state afterwards is P1:[p1vaue|firstObserver=nullptr] ---[p2binding] / P2:[p2value|binding] Then, during the notify phase, we traverse the observer's again, starting from P1's firstObserver. Given that it is nullptr now, we never reach P2's binding, and thus won't send a notification from it. Fix: ---- We store a list of all visited binding-observers (in a QVarLengthArray, to avoid allocations as long as possible). After the binding evaluation phase, we then use that list to send notifications from every binding that we visited. As we already have a list of all bindings, we no longer need to recurse on binding-observes during the notification process; instead, we only need to deal with static callbacks and ChangeHandlers. The pre-existing notification logic is still kept for the grouped update case, where we already have a list of all delayed properties, and should therefore not encounter the same issue. Unifying its codepath with the existing logic is left as an exercise for a later patch. Fixes: QTBUG-105204 Task-number: QTBUG-104982 Pick-to: 6.4 6.3 6.2 Change-Id: I2951f7d9597f4da0b8560a64dfb834f7ad86e757 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* tst_QMetaType: fix warning that buffer may be unusedThiago Macieira2022-07-311-2/+2
| | | | | | | | | | | | | We pass a pointer to uninitialized memory to QMetaType::create(). There's no harm because we're using the invalid QMetaType, but GCC is actually right to complain for any other type. qtestcase.h:54:25: warning: ‘buf’ may be used uninitialized [-Wmaybe-uninitialized] qmetatype.h:454:11: note: by argument 2 of type ‘const void*’ to ‘void* QMetaType::create(const void*) const’ declared here Pick-to: 6.3 6.4 Change-Id: I3859764fed084846bcb0fffd1703eb7967acf0d7 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QMetaObject: rewrite QMetaMethod::invokeThiago Macieira2022-07-281-0/+4
| | | | | | | | | | | | | This adds an internal method to QMetaMethodPrivate to do the work of actually placing the call on a given meta method. This rewrite should make the code clearer, but make no otherwise perceptible difference in behavior. The next commit will rewrite QMetaObject::invokeMethod to use this new, internal function to avoid doing a lot of string allocations. Change-Id: I36b24183fbd041179f2ffffd170219c0deaaf7f5 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* CMake: Don't use PUBLIC_LIBRARIES for tests and test helpersAlexandru Croitor2022-07-2816-20/+20
| | | | | Change-Id: I9b7404e1d3a78fe0726ec0f5ce1461f6c209e90d Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
* tst_QMetaObject: add a test for using Q_ARG with a non-const refThiago Macieira2022-07-271-0/+15
| | | | | | | | | | | | | | This is in use in tst_qdbusinterface.cpp, so let's have it here to make sure it works: QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_RETURN_ARG(QDBusVariant, retArg), Q_ARG(QDBusVariant, arg), Q_ARG(QDBusVariant, arg2), Q_ARG(QDBusVariant&, retArg2))); Change-Id: I36b24183fbd041179f2ffffd170271424c048292 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QMetaObject: make sure we don't mix references with non-refsThiago Macieira2022-07-271-0/+10
| | | | | | | | We should fail to even find the method. `QString' and `QString&` are not compatible. Change-Id: I36b24183fbd041179f2ffffd170259bcf07fd459 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QMetaObject: add some tests for passing and receiving pointersThiago Macieira2022-07-273-1/+86
| | | | | Change-Id: I36b24183fbd041179f2ffffd170259a81d65a36e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QMetaObject: change tests to forward-declared-onlyThiago Macieira2022-07-274-22/+42
| | | | | | | | | | | | | | The type MyUnregisteredType needs to be only forward-declared for the trick to work. The issue is not about registration, because since commit fa987d44417528856d5e80ed7b48ba99e19fa307 ("MetaObject: Store the QMetaType of the methods"), we will record the meta type of the type anyway, which will eventually allow the meta object to actually find this type. Instead, the tests are valid for a type that is only forward-declared. Change-Id: I36b24183fbd041179f2ffffd1702182746f7c1b2 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Remove qvariant_p.hThiago Macieira2022-07-271-1/+0
| | | | | Change-Id: I3859764fed084846bcb0fffd1704480153e34973 Reviewed-by: Ievgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>
* QVariant: split the warning from customConstruct()Thiago Macieira2022-07-271-2/+8
| | | | | | | | | In one of the three calls to customConstruct() -- QVariant::detach() -- we've already checked that the type is valid, so don't re-emit the warning there. Change-Id: I3859764fed084846bcb0fffd1703a3c7c0fb3164 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QMetaType: don't record trivial construction function pointersThiago Macieira2022-07-272-20/+106
| | | | | | | | | | | | We can implement the trivial {default,copy,move} construction outselves inside qmetatype.cpp and qvariant.cpp, simplifying the QMetaType interface object, removing up to three relocations per QMTI. This adds the testing for QMetaType::isXxxConstructible and isDestructible that couldn't be added before. Change-Id: Ic44396b31ba04712aab3fffd16ff0a28f541d507 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QMetaType: add registerType() and qRegisterMetaType(QMetaType)Thiago Macieira2022-07-261-0/+24
| | | | | | | | | | | | | | | | | | | | | | | This also rewrites QMetaType::id() on top of the helper, with the benefit of calling a member static function, so QMetaType doesn't need to be spilled onto the stack. In some upcoming changes I need to ensure that QMetaTypes are registered so they can be found by name and I'd like to have a dedicated function name for that, instead of calling .id(). Since I needed to add docs for the new function, I've updated for the old one too. [ChangeLog][QMetaType] Added QMetaType::registerType() and an overload of qRegisterMetaType() taking QMetaType (the two functions do the same thing). These two functions ensure a given QMetaType is registered with the Qt global registry, so they can be found by name later. Using qRegisterMetaType<T>() also accomplishes the same thing, but is slightly better for completely generic code because it will avoid emitting the registration for built-in types. Change-Id: I3859764fed084846bcb0fffd170351d606034c22 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QMetaType: fix isRegistered()Thiago Macieira2022-07-262-0/+10
| | | | | | | | It's not registered until an ID is assigned. Pick-to: 6.4 Change-Id: I3859764fed084846bcb0fffd17034f5b369c5b4d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QMetaType: suppress most warningsThiago Macieira2022-07-261-1/+16
| | | | | | | | It's not warning-free, but it's much better. Pick-to: 6.3 6.4 Change-Id: I3859764fed084846bcb0fffd170323c9ed12dd23 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QMetaType: merge flags and flagsStaticlessThiago Macieira2022-07-262-52/+42
| | | | | | | | | And rewrite them with templates. QMetaType::typeFlags() simply calls flags() anyway. Pick-to: 6.3 6.4 Change-Id: I3859764fed084846bcb0fffd170323f9d8c80466 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QVariant: do allow non-default-constructible typesThiago Macieira2022-07-221-2/+29
| | | | | | | | | | | | So long as you only ask us to copy it. Copying is mandatory, though. I'll firm up the warning in a later commit, which may not get cherry- picked as far back. Pick-to: 6.2 6.3 6.4 Fixes: QTBUG-105140 Change-Id: I3859764fed084846bcb0fffd170432abf65dc197 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QVariant: Avoid crash when constructed from unsuitable metatypeFabian Kosmale2022-07-211-0/+47
| | | | | | | | | | | | | | If the metatype does not support copy and default construction, then it it unsuitunsuitable for use in QMetaType. We cannot prevent users from passing in such metatypes (as we have e.g. a ctor taking QMetaType), so verify this in customConstruct, and make the variant invalid in that case. Pick-to: 6.2 6.3 6.4 Change-Id: Ib1f0149c8fb9a1cce0049fd0311980754cc85d1b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Use debug stream in QTest::toString's default fallback if possibleVolker Hilsheimer2022-07-131-0/+2
| | | | | | | | | | | | | | | | | | | | For built-in types, this is a compile-time assert - we should not have any types in Qt for which we have neither debug streaming nor a QTest::toString specialization implemented. A build of most of Qt submodules passes with this change, after minor modifications to some tests. We cannot declare QSizeHint::Policy as a metatype after the QMetaType has already been instantiated for it, and the QDebug stream operator for QElaspedTimer needs to be correctly declared within the namespace. Add a self-test function for a custom type, and update reference files of the self-test. Task-number: QTBUG-104867 Pick-to: 6.4 Change-Id: I2936db5933f4589fce45f47cf2f3224ed614d8c9 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QJniObject: Add template overloads for get/setStaticFieldVolker Hilsheimer2022-07-121-0/+7
| | | | | | | | | | | | | | Allow specifying the Java class on which to set/get the field via its corresponding C++ type, removing the need to explicitly provide the Java type string. Those were missing from a085a14d76553ebd1fa4a4a11a27110ee544a531, which was noticed when porting QtConnectivity over to the new template APIs. Pick-to: 6.4 Change-Id: I8f324c9fcc486b4c6c2f2b9051f7eca0cbec0e91 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
* Specialize MetaObjectForType for non-pointer QObject-derived typesMikolaj Boc2022-07-121-0/+1
| | | | | | | | | | | | | | | | | | QMetaTypeInterfaceWrapper tries to find the metaObjectFunction using the MetaObjectForType template. Using SFINAE, for a QObject, it should resolve to a suitable specialization. Such a specialization doesn't yet exist. It had to be created. The following path returns nullptr for registered meta types: auto metatype = QMetaType(typeId); requestedTestType.metaObject() -> returns nullptr since a bad template argument is fed to MetaObjectForType<T> in QMetaTypeInterfaceWrapper<IneritingFromQObject>::metaType's static initializer. Change-Id: I8b31c51e12cb19c333e00480b0177354b910ce1e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Add support for scoped JNI callbacksJuha Vuolle2022-07-072-0/+89
| | | | | | | | | | | | | | This commit adds macros for declaring scoped native callbacks which are in namespace or for example defined as static class member variables. The existing macros don't allow this as they use QtJniMethods namespace and the introduced callbacks' namespaces are not enclosed in that namespace, yielding a compilation error. Pick-to: 6.4 Change-Id: I754560bea7e9a1b57c2661d1ee7236e78db39ba1 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>