This reverts
c1676651b6c417e8f2b276a28199d76943834277 and uses the
__extension__ keyword to prevent pedantic warnings instead of diagnostic
pragmas.
This also adds the __extension__ keyword in <limits> and <bits/random.h>
where there are some more warnings that I missed in the previous commit.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/cpp_type_traits.h (__INT_N): Use __extension__
instead of diagnostic pragmas.
* include/bits/functional_hash.h: Likewise.
* include/bits/iterator_concepts.h (__is_signed_int128)
(__is_unsigned_int128): Likewise.
* include/bits/max_size_type.h (__max_size_type): Likewise.
(numeric_limits<__max_size_type>): Likewise.
* include/bits/std_abs.h (abs): Likewise.
* include/bits/stl_algobase.h (__size_to_integer): Likewise.
* include/bits/uniform_int_dist.h (uniform_int_distribution):
Likewise.
* include/ext/numeric_traits.h (_GLIBCXX_INT_N_TRAITS):
Likewise.
* include/std/type_traits (__is_integral_helper<INT_N>)
(__is_signed_integer, __is_unsigned_integer)
(__make_unsigned<INT_N>, __make_signed<INT_N>): Likewise.
* include/std/limits (__INT_N): Add __extension__ keyword.
* include/bits/random.h (_Select_uint_least_t)
(random_device): Likewise.
};
#define __INT_N(TYPE) \
+ __extension__ \
template<> \
struct __is_integer<TYPE> \
{ \
enum { __value = 1 }; \
typedef __true_type __type; \
}; \
+ __extension__ \
template<> \
struct __is_integer<unsigned TYPE> \
{ \
typedef __true_type __type; \
};
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
#ifdef __GLIBCXX_TYPE_INT_N_0
__INT_N(__GLIBCXX_TYPE_INT_N_0)
#endif
__INT_N(__GLIBCXX_TYPE_INT_N_3)
#endif
-#pragma GCC diagnostic pop
-
#undef __INT_N
//
/// Explicit specialization for unsigned long long.
_Cxx_hashtable_define_trivial_hash(unsigned long long)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
#ifdef __GLIBCXX_TYPE_INT_N_0
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_0)
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_0 unsigned)
#endif
#ifdef __GLIBCXX_TYPE_INT_N_1
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_1)
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_1 unsigned)
#endif
#ifdef __GLIBCXX_TYPE_INT_N_2
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_2)
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_2 unsigned)
#endif
#ifdef __GLIBCXX_TYPE_INT_N_3
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_3)
+ __extension__
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_3 unsigned)
#endif
-#pragma GCC diagnostic pop
-
#undef _Cxx_hashtable_define_trivial_hash
struct _Hash_impl
class __max_diff_type;
class __max_size_type;
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
+ __extension__
template<typename _Tp>
concept __is_signed_int128
#if __SIZEOF_INT128__
= false;
#endif
+ __extension__
template<typename _Tp>
concept __is_unsigned_int128
#if __SIZEOF_INT128__
= false;
#endif
-#pragma GCC diagnostic pop
-
template<typename _Tp>
concept __cv_bool = same_as<const volatile _Tp, const volatile bool>;
#endif
#if __SIZEOF_INT128__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
+ __extension__
using __rep = unsigned __int128;
-#pragma GCC diagnostic pop
#else
using __rep = unsigned long long;
#endif
static constexpr bool is_integer = true;
static constexpr bool is_exact = true;
#if __SIZEOF_INT128__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
- static_assert(same_as<_Sp::__rep, unsigned __int128>);
-#pragma GCC diagnostic pop
+ static_assert(__extension__ same_as<_Sp::__rep, __uint128_t>);
static constexpr int digits = 129;
#else
static_assert(same_as<_Sp::__rep, unsigned long long>);
#if __SIZEOF_INT128__ > __SIZEOF_LONG_LONG__
template<int __s>
struct _Select_uint_least_t<__s, 1>
- { typedef unsigned __int128 type; };
+ { __extension__ typedef unsigned __int128 type; };
#endif
// Assume a != 0, a < m, c < m, x < m.
void _M_init(const char*, size_t); // not exported from the shared library
- union
+ __extension__ union
{
struct
{
{ return __builtin_fabsl(__x); }
#endif
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
#if defined(__GLIBCXX_TYPE_INT_N_0)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
#endif
#if defined(__GLIBCXX_TYPE_INT_N_1)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
#endif
#if defined(__GLIBCXX_TYPE_INT_N_2)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
#endif
#if defined(__GLIBCXX_TYPE_INT_N_3)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
#endif
#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
- inline _GLIBCXX_CONSTEXPR
+ __extension__ inline _GLIBCXX_CONSTEXPR
__float128
abs(__float128 __x)
{ return __x < 0 ? -__x : __x; }
#endif
-#pragma GCC diagnostic pop
-
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
} // extern "C"++"
inline _GLIBCXX_CONSTEXPR unsigned long long
__size_to_integer(unsigned long long __n) { return __n; }
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
#if defined(__GLIBCXX_TYPE_INT_N_0)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
__size_to_integer(__GLIBCXX_TYPE_INT_N_0 __n) { return __n; }
- inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_0
+ __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_0
__size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_0 __n) { return __n; }
#endif
#if defined(__GLIBCXX_TYPE_INT_N_1)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
__size_to_integer(__GLIBCXX_TYPE_INT_N_1 __n) { return __n; }
- inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_1
+ __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_1
__size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_1 __n) { return __n; }
#endif
#if defined(__GLIBCXX_TYPE_INT_N_2)
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
__size_to_integer(__GLIBCXX_TYPE_INT_N_2 __n) { return __n; }
- inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_2
+ __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_2
__size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_2 __n) { return __n; }
#endif
#if defined(__GLIBCXX_TYPE_INT_N_3)
- inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_3
+ __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_3
__size_to_integer(__GLIBCXX_TYPE_INT_N_3 __n) { return __n; }
- inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
+ __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
__size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_3 __n) { return __n; }
#endif
-#pragma GCC diagnostic pop
-
inline _GLIBCXX_CONSTEXPR long long
__size_to_integer(float __n) { return (long long)__n; }
inline _GLIBCXX_CONSTEXPR long long
inline _GLIBCXX_CONSTEXPR long long
__size_to_integer(long double __n) { return (long long)__n; }
#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
- inline _GLIBCXX_CONSTEXPR long long
+ __extension__ inline _GLIBCXX_CONSTEXPR long long
__size_to_integer(__float128 __n) { return (long long)__n; }
#endif
#if defined __UINT64_TYPE__ && defined __UINT32_TYPE__
#if __SIZEOF_INT128__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
if _GLIBCXX17_CONSTEXPR (__urngrange == __UINT64_MAX__)
{
// __urng produces values that use exactly 64-bits,
// so use 128-bit integers to downscale to desired range.
__UINT64_TYPE__ __u64erange = __uerange;
- __ret = _S_nd<unsigned __int128>(__urng, __u64erange);
+ __ret = __extension__ _S_nd<unsigned __int128>(__urng,
+ __u64erange);
}
else
-#pragma GCC diagnostic pop
#endif
if _GLIBCXX17_CONSTEXPR (__urngrange == __UINT32_MAX__)
{
// Enable __numeric_traits_integer for types where the __is_integer_nonstrict
// primary template doesn't give the right answer.
#define _GLIBCXX_INT_N_TRAITS(T, WIDTH) \
+ __extension__ \
template<> struct __is_integer_nonstrict<T> \
{ \
enum { __value = 1 }; \
typedef std::__true_type __type; \
enum { __width = WIDTH }; \
}; \
+ __extension__ \
template<> struct __is_integer_nonstrict<unsigned T> \
{ \
enum { __value = 1 }; \
#endif
#if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
// In strict modes __is_integer<__int128> is false,
// but we still want to define __numeric_traits_integer<__int128>.
_GLIBCXX_INT_N_TRAITS(__int128, 128)
-#pragma GCC diagnostic pop
#endif
#undef _GLIBCXX_INT_N_TRAITS
};
#define __INT_N(TYPE, BITSIZE, EXT, UEXT) \
+ __extension__ \
template<> \
struct numeric_limits<TYPE> \
{ \
= round_toward_zero; \
}; \
\
+ __extension__ \
template<> \
struct numeric_limits<unsigned TYPE> \
{ \
struct __is_integral_helper<unsigned long long>
: public true_type { };
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
// Conditionalizing on __STRICT_ANSI__ here will break any port that
// uses one of these types for size_t.
#if defined(__GLIBCXX_TYPE_INT_N_0)
+ __extension__
template<>
struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_0>
: public true_type { };
+ __extension__
template<>
struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_0>
: public true_type { };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_1)
+ __extension__
template<>
struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_1>
: public true_type { };
+ __extension__
template<>
struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_1>
: public true_type { };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_2)
+ __extension__
template<>
struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_2>
: public true_type { };
+ __extension__
template<>
struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_2>
: public true_type { };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_3)
+ __extension__
template<>
struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_3>
: public true_type { };
+ __extension__
template<>
struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_3>
: public true_type { };
#endif
-#pragma GCC diagnostic pop
/// @endcond
/// is_integral
template<typename _Tp, typename... _Types>
using __is_one_of = __or_<is_same<_Tp, _Types>...>;
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
// Check if a type is one of the signed integer types.
+ __extension__
template<typename _Tp>
using __is_signed_integer = __is_one_of<__remove_cv_t<_Tp>,
signed char, signed short, signed int, signed long,
>;
// Check if a type is one of the unsigned integer types.
+ __extension__
template<typename _Tp>
using __is_unsigned_integer = __is_one_of<__remove_cv_t<_Tp>,
unsigned char, unsigned short, unsigned int, unsigned long,
, unsigned __GLIBCXX_TYPE_INT_N_3
#endif
>;
-#pragma GCC diagnostic pop
// Check if a type is one of the signed or unsigned integer types.
template<typename _Tp>
struct __make_unsigned<long long>
{ typedef unsigned long long __type; };
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
#if defined(__GLIBCXX_TYPE_INT_N_0)
+ __extension__
template<>
struct __make_unsigned<__GLIBCXX_TYPE_INT_N_0>
{ typedef unsigned __GLIBCXX_TYPE_INT_N_0 __type; };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_1)
+ __extension__
template<>
struct __make_unsigned<__GLIBCXX_TYPE_INT_N_1>
{ typedef unsigned __GLIBCXX_TYPE_INT_N_1 __type; };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_2)
+ __extension__
template<>
struct __make_unsigned<__GLIBCXX_TYPE_INT_N_2>
{ typedef unsigned __GLIBCXX_TYPE_INT_N_2 __type; };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_3)
+ __extension__
template<>
struct __make_unsigned<__GLIBCXX_TYPE_INT_N_3>
{ typedef unsigned __GLIBCXX_TYPE_INT_N_3 __type; };
#endif
-#pragma GCC diagnostic pop
-
// Select between integral and enum: not possible to be both.
template<typename _Tp,
bool _IsInt = is_integral<_Tp>::value,
struct __make_signed<unsigned long long>
{ typedef signed long long __type; };
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-
#if defined(__GLIBCXX_TYPE_INT_N_0)
+ __extension__
template<>
struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_0>
{ typedef __GLIBCXX_TYPE_INT_N_0 __type; };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_1)
+ __extension__
template<>
struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_1>
{ typedef __GLIBCXX_TYPE_INT_N_1 __type; };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_2)
+ __extension__
template<>
struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_2>
{ typedef __GLIBCXX_TYPE_INT_N_2 __type; };
#endif
#if defined(__GLIBCXX_TYPE_INT_N_3)
+ __extension__
template<>
struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_3>
{ typedef __GLIBCXX_TYPE_INT_N_3 __type; };
#endif
-#pragma GCC diagnostic pop
-
// Select between integral and enum: not possible to be both.
template<typename _Tp,
bool _IsInt = is_integral<_Tp>::value,