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:
parent
97bbf37f42
commit
4b806d678e
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user