// Define if compatibility should be provided for -mlong-double-64.
#undef _GLIBCXX_LONG_DOUBLE_COMPAT
+// Use an alternate macro to test for clang, so as to provide an easy
+// workaround for systems (such as vxworks) whose headers require
+// __clang__ to be defined, even when compiling with GCC.
+#if !defined _GLIBCXX_CLANG && defined __clang__
+# define _GLIBCXX_CLANG __clang__
+// Turn -D_GLIBCXX_CLANG=0 into -U_GLIBCXX_CLANG, so that
+// _GLIBCXX_CLANG can be tested as defined, just like __clang__.
+#elif !_GLIBCXX_CLANG
+# undef _GLIBCXX_CLANG
+#endif
+
// Define if compatibility should be provided for alternative 128-bit long
// double formats. Not possible for Clang until __ibm128 is supported.
-#ifndef __clang__
+#ifndef _GLIBCXX_CLANG
#undef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT
#endif
ctype<_CharT> const& __ctype = use_facet<ctype<_CharT> >(__loc);
__err = ios_base::goodbit;
bool __use_state = false;
-#if __GNUC__ >= 5 && !defined(__clang__)
+#if __GNUC__ >= 5 && !defined(_GLIBCXX_CLANG)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpmf-conversions"
// Nasty hack. The C++ standard mandates that get invokes the do_get
void
_M_assume_normalized() const
{
-#if __has_attribute(__assume__) && !defined(__clang__)
+#if __has_attribute(__assume__) && !defined(_GLIBCXX_CLANG)
unsigned int __ofst = _M_offset;
__attribute__ ((__assume__ (__ofst < unsigned(_S_word_bit))));
#endif
using std::atomic_thread_fence;
using std::atomic_signal_fence;
-#elif defined __clang__
+#elif defined _GLIBCXX_CLANG
# include_next <stdatomic.h>
#endif // __cpp_lib_stdatomic_h
#endif // _GLIBCXX_STDATOMIC_H
__builtin_memcpy(&__r, &__v, sizeof(_To));
return __r;
}
-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
else if constexpr (__have_avx && sizeof(_From) == 16 && sizeof(_To) == 32)
return reinterpret_cast<_To>(__builtin_ia32_ps256_ps(
reinterpret_cast<__vector_type_t<float, 4>>(__v)));
// }}}
// __andnot{{{
-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
static constexpr struct
{
_GLIBCXX_SIMD_INTRINSIC __v4sf
operator()(__v8di __a, __v8di __b) const noexcept
{ return _mm512_andnot_si512(__a, __b); }
} _S_x86_andnot;
-#endif // _GLIBCXX_SIMD_X86INTRIN && !__clang__
+#endif // _GLIBCXX_SIMD_X86INTRIN && !_GLIBCXX_CLANG
template <typename _TW>
_GLIBCXX_SIMD_INTRINSIC constexpr _TW
using _TVT = conditional_t<__is_simd_wrapper_v<_TW>, _TW,
_VectorTraitsImpl<_TW>>;
using _Tp = typename _TVT::value_type;
-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
if constexpr (sizeof(_TW) >= 16)
{
const auto __ai = __to_intrin(__a);
using _Tp = remove_reference_t<decltype(declval<_T0>()[0])>;
using _RV [[maybe_unused]] = __vector_type_t<_Tp, sizeof...(_Is)>;
#if __has_builtin(__builtin_shufflevector)
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
// Clang requires _T0 == _T1
if constexpr (sizeof(__x) > sizeof(__y) and _N1 == 1)
return __vec_shuffle(__x, _T0{__y[0]}, __seq, __idx_perm);
constexpr size_t _Bytes = _ReqBytes == 0 ? sizeof(__x) : _ReqBytes;
static_assert(sizeof(__x) >= _Bytes);
-#if !defined __clang__ && _GLIBCXX_SIMD_WORKAROUND_PR90424
+#if !defined _GLIBCXX_CLANG && _GLIBCXX_SIMD_WORKAROUND_PR90424
if constexpr (__is_vector_type_v<_TV>)
_S_memcpy<_Bytes>(reinterpret_cast<char*>(__addr), reinterpret_cast<const char*>(&__x));
else
return __vector_bitcast<float, 2>(_S_plus_minus(__x4, __y));
}
#endif
-#if !defined __clang__ && __GCC_IEC_559 == 0
+#if !defined _GLIBCXX_CLANG && __GCC_IEC_559 == 0
if (__builtin_is_constant_evaluated()
|| (__builtin_constant_p(__x) && __builtin_constant_p(__y)))
return (__x + __y) - __y;
#endif
//}}}
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
#define _GLIBCXX_SIMD_NORMAL_MATH
#define _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA
#else
#define _GLIBCXX_SIMD_IS_UNLIKELY(__x) __builtin_expect(__x, 0)
#define _GLIBCXX_SIMD_IS_LIKELY(__x) __builtin_expect(__x, 1)
-#if _GLIBCXX_SIMD_HAVE_SVE || __STRICT_ANSI__ || defined __clang__
+#if _GLIBCXX_SIMD_HAVE_SVE || __STRICT_ANSI__ || defined _GLIBCXX_CLANG
#define _GLIBCXX_SIMD_CONSTEXPR
#define _GLIBCXX_SIMD_USE_CONSTEXPR_API const
#else
#define _GLIBCXX_SIMD_USE_CONSTEXPR_API constexpr
#endif
-#if defined __clang__
+#if defined _GLIBCXX_CLANG
#define _GLIBCXX_SIMD_USE_CONSTEXPR const
#else
#define _GLIBCXX_SIMD_USE_CONSTEXPR constexpr
#endif
// integer division not optimized
-#ifndef __clang__
+#ifndef _GLIBCXX_CLANG
#define _GLIBCXX_SIMD_WORKAROUND_PR90993 1
#endif
// }}}
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
template <size_t _Np, typename _Tp, typename _Kp>
_GLIBCXX_SIMD_INTRINSIC constexpr auto
__movm(_Kp __k) noexcept
else
__assert_unreachable<_Tp>();
}
-#endif // __clang__
+#endif // _GLIBCXX_CLANG
#ifdef _GLIBCXX_SIMD_WORKAROUND_PR85048
#include "simd_x86_conversions.h"
using _Tp = typename _VectorTraits<_TV>::value_type;
static_assert(sizeof(_TV) >= 16);
static_assert(sizeof(_Tp) <= 8);
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
return __movm<_VectorTraits<_TV>::_S_full_size, _Tp>(__k) ? __b : __a;
#else
using _IntT
// optimize masked unary increment and decrement as masked sub +/-1
constexpr int __pm_one
= is_same_v<_Op<void>, __increment<void>> ? -1 : 1;
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
return __movm<_Np, _Tp>(__k._M_data) ? __v._M_data - __pm_one : __v._M_data;
-#else // __clang__
+#else // _GLIBCXX_CLANG
using _TV = __vector_type_t<_Tp, _Np>;
constexpr size_t __bytes = sizeof(__v) < 16 ? 16 : sizeof(__v);
constexpr size_t __width = __bytes / sizeof(_Tp);
#undef _GLIBCXX_SIMD_MASK_SUB_512
#undef _GLIBCXX_SIMD_MASK_SUB
}
-#endif // __clang__
+#endif // _GLIBCXX_CLANG
}
else
return _Base::template _S_masked_unary<_Op>(__k, __v);
#pragma GCC diagnostic push
// Many [[gnu::vector_size(N)]] types might lead to a -Wpsabi warning which is
// irrelevant as those functions never appear on ABI borders
-#ifndef __clang__
+#ifndef _GLIBCXX_CLANG
#pragma GCC diagnostic ignored "-Wpsabi"
#endif
// the actual GCC version on the system.
#define _PSTL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
-#if defined(__clang__)
+#if defined(_GLIBCXX_CLANG)
// according to clang documentation, version can be vendor specific
# define _PSTL_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#endif
#if (defined(_OPENMP) && _OPENMP >= 201307) || \
(defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1600) || \
(!defined(__INTEL_COMPILER) && _PSTL_GCC_VERSION >= 40900) || \
- defined(__clang__)
+ defined(_GLIBCXX_CLANG)
# define _PSTL_PRAGMA_SIMD _PSTL_PRAGMA(omp simd)
# define _PSTL_PRAGMA_DECLARE_SIMD _PSTL_PRAGMA(omp declare simd)
# define _PSTL_PRAGMA_SIMD_REDUCTION(PRM) _PSTL_PRAGMA(omp simd reduction(PRM))
// Get rid of a macro possibly defined in <complex.h>
#undef complex
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wc99-extensions"
#endif
#endif // C++11
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
#pragma clang diagnostic pop
#endif
class zip_view<_Vs...>::_Iterator
: public __detail::__zip_view_iter_cat<_Const, _Vs...>
{
-#ifdef __clang__ // LLVM-61763 workaround
+#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround
public:
#endif
tuple<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_current;
return input_iterator_tag{};
}
-#ifndef __clang__ // LLVM-61763 workaround
+#ifndef _GLIBCXX_CLANG // LLVM-61763 workaround
template<move_constructible _Fp, input_range... _Ws>
requires (view<_Ws> && ...) && (sizeof...(_Ws) > 0) && is_object_v<_Fp>
&& regular_invocable<_Fp&, range_reference_t<_Ws>...>
template<bool _Const>
class adjacent_view<_Vp, _Nm>::_Iterator
{
-#ifdef __clang__ // LLVM-61763 workaround
+#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround
public:
#endif
using _Base = __detail::__maybe_const_t<_Const, _Vp>;
friend class adjacent_view;
-#ifndef __clang__ // LLVM-61763 workaround
+#ifndef _GLIBCXX_CLANG // LLVM-61763 workaround
template<forward_range _Wp, move_constructible _Fp, size_t _Mm>
requires view<_Wp> && (_Mm > 0) && is_object_v<_Fp>
&& regular_invocable<__detail::__unarize<_Fp&, _Mm>, range_reference_t<_Wp>>
}, __rhs);
}
-#if defined(__clang__) && __clang_major__ <= 7
+#if defined(_GLIBCXX_CLANG) && __clang_major__ <= 7
public:
using _Base::_M_u; // See https://bugs.llvm.org/show_bug.cgi?id=31852
#endif