diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h index 8bebd761ca3..dbded9e0b11 100644 --- a/src/corelib/kernel/qcoreapplication.h +++ b/src/corelib/kernel/qcoreapplication.h @@ -60,6 +60,10 @@ class Q_CORE_EXPORT QCoreApplication Q_DECLARE_PRIVATE(QCoreApplication) friend class QEventLoopLocker; +#if QT_CONFIG(permissions) + using RequestPermissionPrototype = void(*)(QPermission); +#endif + public: enum { ApplicationFlags = QT_VERSION }; @@ -122,21 +126,25 @@ public: # else // requestPermission with context or receiver object; need to require here that receiver is the // right type to avoid ambiguity with the private implementation function. - template + template ::value, + bool> = true> void requestPermission(const QPermission &permission, const typename QtPrivate::ContextTypeForFunctor::ContextType *receiver, Functor &&func) { - using Prototype = void(*)(QPermission); - QtPrivate::AssertCompatibleFunctions(); requestPermission(permission, - QtPrivate::makeCallableObject(std::forward(func)), + QtPrivate::makeCallableObject(std::forward(func)), receiver); } # endif // Q_QDOC // requestPermission to a functor or function pointer (without context) - template + template ::value, + bool> = true> void requestPermission(const QPermission &permission, Functor &&func) { requestPermission(permission, nullptr, std::forward(func)); diff --git a/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp b/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp index 146c1b26608..8f257eba8bb 100644 --- a/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp +++ b/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp @@ -146,6 +146,19 @@ void tst_QPermission::conversionMaintainsState() const } } +template requestPermission(std::declval(), + std::declval()))> + > +void wrapRequestPermission(const QPermission &p, Func &&f) +{ + qApp->requestPermission(p, std::forward(f)); +} + +template +using CompatibleTest = decltype(wrapRequestPermission(std::declval(), std::declval())); + + // Compile test for context-less functor overloads void tst_QPermission::functorWithoutContext() { @@ -161,6 +174,17 @@ void tst_QPermission::functorWithoutContext() qApp->requestPermission(dummy, [](const QPermission &permission){ QVERIFY(permission.value()); }); + wrapRequestPermission(dummy, [](const QPermission &permission){ + QVERIFY(permission.value()); + }); + + auto compatible = [](const QPermission &) {}; + using Compatible = decltype(compatible); + auto incompatible = [](const QString &) {}; + using Incompatible = decltype(incompatible); + + static_assert(qxp::is_detected_v); + static_assert(!qxp::is_detected_v); } void tst_QPermission::functorWithContextInThread()