summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qalgorithms.h
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2023-02-07 18:51:59 -0800
committerThiago Macieira <thiago.macieira@intel.com>2023-02-22 11:06:49 -0800
commite69d80e14d24001f93442ab59b8babb7e9df0092 (patch)
treea755b37314ed71deb47f6f60ebfc01a9009c4c11 /src/corelib/tools/qalgorithms.h
parentac9d25340aec5c165db5e58a3d8b869967c5ff97 (diff)
qalgorithms.h: fix mistake that MSVC has constexpr bitops in C++17 mode
<bit> exists in C++20 and is properly both constexpr and optimized. But in C++17 mode, we don't have constexpr bitops and instead elect to have performance at runtime instead. But somewhere along the line, either when they were added, when C++20 <bit> support was, or in any of the bugfixes for other compilers, the nesting of #ifdef got messed up and we declared that we had constexpr builtins for MSVC in C++17 too. The macro QT_HAS_CONSTEXPR_BUILTINS isn't supposed to be used by anyone else... but we ended up not being able to use it ourselves either. So I'm renaming it to a more precise label. Pick-to: 6.5 Change-Id: I9671dee8ceb64aa9b9cafffd1741b9b4060c9753 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/corelib/tools/qalgorithms.h')
-rw-r--r--src/corelib/tools/qalgorithms.h21
1 files changed, 5 insertions, 16 deletions
diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h
index 94aa2da012..8889effece 100644
--- a/src/corelib/tools/qalgorithms.h
+++ b/src/corelib/tools/qalgorithms.h
@@ -41,19 +41,11 @@ inline void qDeleteAll(const Container &c)
*/
namespace QAlgorithmsPrivate {
-#ifdef Q_CC_CLANG
-// Clang had a bug where __builtin_ctz/clz/popcount were not marked as constexpr.
-# if (defined __apple_build_version__ && __clang_major__ >= 7) || (Q_CC_CLANG >= 307)
-# define QT_HAS_CONSTEXPR_BUILTINS
-# endif
-#elif defined(Q_CC_MSVC) && !defined(Q_PROCESSOR_ARM)
-# define QT_HAS_CONSTEXPR_BUILTINS
+#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
+// We use C++20 <bit> operations instead which ensures constexpr bit ops
+# define QT_HAS_CONSTEXPR_BITOPS
#elif defined(Q_CC_GNU)
-# define QT_HAS_CONSTEXPR_BUILTINS
-#endif
-
-#if defined QT_HAS_CONSTEXPR_BUILTINS
-#if defined(Q_CC_GNU) || defined(Q_CC_CLANG)
+# define QT_HAS_CONSTEXPR_BITOPS
# define QT_HAS_BUILTIN_CTZS
constexpr Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) noexcept
{
@@ -169,9 +161,7 @@ Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) noexcept
// architecture), but unlike the other compilers, MSVC has no option
// to generate code for those processors.
// So it's an acceptable compromise.
-#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
-// We use C++20 <bit> operations instead which ensures constexpr popcount
-#elif defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
+#if defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
#define QT_POPCOUNT_CONSTEXPR
#define QT_POPCOUNT_RELAXED_CONSTEXPR
#define QALGORITHMS_USE_BUILTIN_POPCOUNT
@@ -200,7 +190,6 @@ Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) noexcept
#endif // __AVX__ || __SSE4_2__ || __POPCNT__
#endif // MSVC
-#endif // QT_HAS_CONSTEXPR_BUILTINS
#ifndef QT_POPCOUNT_CONSTEXPR
#define QT_POPCOUNT_CONSTEXPR constexpr