Fix compilation with Apple Clang 425
authorThiago Macieira <thiago.macieira@intel.com>
Wed, 14 Jan 2015 19:02:28 +0000 (11:02 -0800)
committerJani Heikkinen <jani.heikkinen@theqtcompany.com>
Mon, 9 Feb 2015 06:55:51 +0000 (06:55 +0000)
This version was based on Clang mainline between releases 3.1 and 3.2,
which means it has part of 3.2 features but not all. One of the missing
features is __builtin_bswap16.
Cherry-picked from ec9bc843d8a5c18459f3669c6e22acac2077df67 on 5.4

Change-Id: Ic5d393bfd36e48a193fcffff13b95664c7f664de
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
src/corelib/global/qendian.h

index 7c643f75926a23f1ca6870d4a2aa79f243c3e985..0e383c18d2fcf0c6237c6ac9438bc3ce7b79c8a9 100644 (file)
@@ -272,9 +272,15 @@ template <> inline qint8 qFromBigEndian<qint8>(const uchar *src)
 */
 template <typename T> T qbswap(T source);
 
+#ifdef __has_builtin
+#  define QT_HAS_BUILTIN(x)     __has_builtin(x)
+#else
+#  define QT_HAS_BUILTIN(x)     0
+#endif
+
 // GCC 4.3 implemented all the intrinsics, but the 16-bit one only got implemented in 4.8;
 // Clang 2.6 implemented the 32- and 64-bit but waited until 3.2 to implement the 16-bit one
-#if (defined(Q_CC_GNU) && Q_CC_GNU >= 403) || (defined(Q_CC_CLANG) && Q_CC_CLANG >= 206)
+#if (defined(Q_CC_GNU) && Q_CC_GNU >= 403) || QT_HAS_BUILTIN(__builtin_bswap32)
 template <> inline quint64 qbswap<quint64>(quint64 source)
 {
     return __builtin_bswap64(source);
@@ -306,7 +312,7 @@ template <> inline quint32 qbswap<quint32>(quint32 source)
         | ((source & 0xff000000) >> 24);
 }
 #endif // GCC & Clang intrinsics
-#if (defined(Q_CC_GNU) && Q_CC_GNU >= 408) || (defined(Q_CC_CLANG) && Q_CC_CLANG >= 302)
+#if (defined(Q_CC_GNU) && Q_CC_GNU >= 408) || QT_HAS_BUILTIN(__builtin_bswap16)
 template <> inline quint16 qbswap<quint16>(quint16 source)
 {
     return __builtin_bswap16(source);
@@ -320,6 +326,8 @@ template <> inline quint16 qbswap<quint16>(quint16 source)
 }
 #endif // GCC & Clang intrinsics
 
+#undef QT_HAS_BUILTIN
+
 // signed specializations
 template <> inline qint64 qbswap<qint64>(qint64 source)
 {