Rename qIsConstantEvaluated() to q20::is_constant_evaluated()

We should really try to avoid another
almost-std-compatible-but-not-quite idiom. When qIsConstantEvaluated()
was added, the rationale was given that this cannot be q20, because we
can't implement it in all compilers. But we can: returning false is a
perfectly legal implementation, and makes most users actually simpler
because the #ifdef'ery can be dropped.

There are only two users that still require the macro, because either
they do different fallbacks depending on whether the implementation is
trivial, or because they direct expected test outcomes.

The INTEGRITY compiler complains "calling __has_builtin() in a
constant expression", which we currently don't understand. To unblock
this patch, and therefore the 6.7 release, hard-code INTEGRITY to
return false.

Amends 95e6fac0a5a1eee3aa23e4da0a93c6c25e32fb98.

Pick-to: 6.7
Change-Id: If6cae902ff434f2ccceb6057cb053b7f304a604c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Marc Mutz 2024-02-21 14:33:59 +01:00
parent 97bbf37f42
commit 4b806d678e
5 changed files with 32 additions and 32 deletions

View File

@ -3,6 +3,8 @@
#ifndef Q20TYPE_TRAITS_H
#define Q20TYPE_TRAITS_H
#include <QtCore/qcompilerdetection.h>
#include <QtCore/qsystemdetection.h>
#include <QtCore/qtconfigmacros.h>
//
@ -25,6 +27,29 @@
QT_BEGIN_NAMESPACE
namespace q20 {
// like std::is_constant_evaluated
#ifdef __cpp_lib_is_constant_evaluated
using std::is_constant_evaluated;
#define QT_SUPPORTS_IS_CONSTANT_EVALUATED
#else
constexpr bool is_constant_evaluated() noexcept
{
#ifdef Q_OS_INTEGRITY
// Integrity complains "calling __has_builtin() from a constant expression".
// Avoid the __has_builtin check until we know what's going on.
return false;
#elif __has_builtin(__builtin_is_constant_evaluated) || \
(defined(Q_CC_MSVC_ONLY) /* >= 1925, but we require 1927 in qglobal.h */)
# define QT_SUPPORTS_IS_CONSTANT_EVALUATED
return __builtin_is_constant_evaluated();
#else
return false;
#endif
}
#endif // __cpp_lib_is_constant_evaluated
}
namespace q20 {
// like std::remove_cvref(_t)
#ifdef __cpp_lib_remove_cvref

View File

@ -17,23 +17,6 @@
QT_BEGIN_NAMESPACE
// like std::is_constant_evaluated
#define QT_SUPPORTS_IS_CONSTANT_EVALUATED
#ifdef __cpp_lib_is_constant_evaluated
constexpr bool qIsConstantEvaluated() noexcept
{
return std::is_constant_evaluated();
}
#elif __has_builtin(__builtin_is_constant_evaluated) || \
(defined(Q_CC_MSVC_ONLY) /* >= 1925, but we require 1927 in qglobal.h */)
constexpr bool qIsConstantEvaluated() noexcept
{
return __builtin_is_constant_evaluated();
}
#else
# undef QT_SUPPORTS_IS_CONSTANT_EVALUATED
#endif
// like std::to_underlying
template <typename Enum>
constexpr std::underlying_type_t<Enum> qToUnderlying(Enum e) noexcept

View File

@ -102,12 +102,7 @@ private:
static constexpr bool isAsciiOnlyCharsAtCompileTime(Char *str, qsizetype sz) noexcept
{
// do not perform check if not at compile time
#if !defined(QT_SUPPORTS_IS_CONSTANT_EVALUATED)
Q_UNUSED(str);
Q_UNUSED(sz);
return false;
#else
if (!qIsConstantEvaluated())
if (!q20::is_constant_evaluated())
return false;
if constexpr (sizeof(Char) != sizeof(char)) {
Q_UNUSED(str);
@ -120,7 +115,6 @@ private:
}
return true;
}
#endif
}
template<typename Char>
@ -138,10 +132,8 @@ private:
template <typename Char>
static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept
{
#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
if (qIsConstantEvaluated())
if (q20::is_constant_evaluated())
return qsizetype(std::char_traits<Char>::length(str));
#endif
if constexpr (sizeof(Char) == sizeof(char16_t))
return QtPrivate::qustrlen(reinterpret_cast<const char16_t*>(str));
else

View File

@ -16,6 +16,8 @@
#include <string.h> // for memchr
#include <QtCore/q20type_traits.h> // q20::is_constant_evaluated
QT_BEGIN_NAMESPACE
namespace QtPrivate {
@ -169,7 +171,7 @@ lengthHelperContainer(const Char (&str)[N])
return str[0] == Char(0) ? 0 : 1;
} else if constexpr (N > RuntimeThreshold) {
#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
if (!qIsConstantEvaluated())
if (!q20::is_constant_evaluated())
return QtPrivate::qustrnlen(reinterpret_cast<const char16_t *>(str), N);
#endif
}
@ -181,7 +183,7 @@ template <typename Char, size_t N> [[nodiscard]] constexpr inline
std::enable_if_t<sizeof(Char) == 1, qsizetype> lengthHelperContainer(const Char (&str)[N])
{
#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
if (!qIsConstantEvaluated())
if (!q20::is_constant_evaluated())
return qstrnlen(reinterpret_cast<const char *>(str), N);
#endif

View File

@ -104,10 +104,8 @@ private:
template <typename Char>
static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept
{
#if defined(QT_SUPPORTS_IS_CONSTANT_EVALUATED)
if (qIsConstantEvaluated())
if (q20::is_constant_evaluated())
return std::char_traits<Char>::length(str);
#endif
return QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(str));
}
static qsizetype lengthHelperPointer(const QChar *str) noexcept