* [committed] libstdc++: Suppress pedantic warnings about __int128
@ 2021-07-16 7:41 Jonathan Wakely
2021-07-16 8:27 ` Jakub Jelinek
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Wakely @ 2021-07-16 7:41 UTC (permalink / raw)
To: libstdc++, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 709 bytes --]
With -std=c++NN -pedantic -Wsystem-headers there are warnings about the
use of __int128, which can be suppressed using diagnostic pragmas.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/cpp_type_traits.h: Add diagnostic pragmas around
uses of non-standard integer types.
* include/bits/functional_hash.h: Likewise.
* include/bits/iterator_concepts.h: Likewise.
* include/bits/max_size_type.h: Likewise.
* include/bits/std_abs.h: Likewise.
* include/bits/stl_algobase.h: Likewise.
* include/bits/uniform_int_dist.h: Likewise.
* include/ext/numeric_traits.h: Likewise.
* include/std/type_traits: Likewise.
Tested powerpc64le-linux. Committed to trunk.
[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 9953 bytes --]
commit c1676651b6c417e8f2b276a28199d76943834277
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Thu Jul 15 15:36:34 2021
libstdc++: Suppress pedantic warnings about __int128
With -std=c++NN -pedantic -Wsystem-headers there are warnings about the
use of __int128, which can be suppressed using diagnostic pragmas.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/cpp_type_traits.h: Add diagnostic pragmas around
uses of non-standard integer types.
* include/bits/functional_hash.h: Likewise.
* include/bits/iterator_concepts.h: Likewise.
* include/bits/max_size_type.h: Likewise.
* include/bits/std_abs.h: Likewise.
* include/bits/stl_algobase.h: Likewise.
* include/bits/uniform_int_dist.h: Likewise.
* include/ext/numeric_traits.h: Likewise.
* include/std/type_traits: Likewise.
diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h
index ca0d68c29de..8f8dd817dc2 100644
--- a/libstdc++-v3/include/bits/cpp_type_traits.h
+++ b/libstdc++-v3/include/bits/cpp_type_traits.h
@@ -266,6 +266,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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
@@ -279,6 +282,8 @@ __INT_N(__GLIBCXX_TYPE_INT_N_2)
__INT_N(__GLIBCXX_TYPE_INT_N_3)
#endif
+#pragma GCC diagnostic pop
+
#undef __INT_N
//
diff --git a/libstdc++-v3/include/bits/functional_hash.h b/libstdc++-v3/include/bits/functional_hash.h
index 7be8ebfa2d3..78e3644bc74 100644
--- a/libstdc++-v3/include/bits/functional_hash.h
+++ b/libstdc++-v3/include/bits/functional_hash.h
@@ -171,6 +171,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// 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
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_0)
_Cxx_hashtable_define_trivial_hash(__GLIBCXX_TYPE_INT_N_0 unsigned)
@@ -188,6 +191,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_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
diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h
index c273056c204..97c0b80a507 100644
--- a/libstdc++-v3/include/bits/iterator_concepts.h
+++ b/libstdc++-v3/include/bits/iterator_concepts.h
@@ -553,6 +553,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
class __max_diff_type;
class __max_size_type;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+
template<typename _Tp>
concept __is_signed_int128
#if __SIZEOF_INT128__
@@ -569,6 +572,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
= false;
#endif
+#pragma GCC diagnostic pop
+
template<typename _Tp>
concept __cv_bool = same_as<const volatile _Tp, const volatile bool>;
diff --git a/libstdc++-v3/include/bits/max_size_type.h b/libstdc++-v3/include/bits/max_size_type.h
index 153b1bff5f4..24237cc57de 100644
--- a/libstdc++-v3/include/bits/max_size_type.h
+++ b/libstdc++-v3/include/bits/max_size_type.h
@@ -417,7 +417,10 @@ namespace ranges
#endif
#if __SIZEOF_INT128__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
using __rep = unsigned __int128;
+#pragma GCC diagnostic pop
#else
using __rep = unsigned long long;
#endif
@@ -771,7 +774,10 @@ namespace ranges
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 constexpr int digits = 129;
#else
static_assert(same_as<_Sp::__rep, unsigned long long>);
diff --git a/libstdc++-v3/include/bits/std_abs.h b/libstdc++-v3/include/bits/std_abs.h
index ae6bfc1b1ac..c65ebb66439 100644
--- a/libstdc++-v3/include/bits/std_abs.h
+++ b/libstdc++-v3/include/bits/std_abs.h
@@ -80,6 +80,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ 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
abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
@@ -104,6 +107,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __x < 0 ? -__x : __x; }
#endif
+#pragma GCC diagnostic pop
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
} // extern "C"++"
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index d001b5f9dae..7f920dbdbf7 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -1013,6 +1013,9 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
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
__size_to_integer(__GLIBCXX_TYPE_INT_N_0 __n) { return __n; }
@@ -1038,6 +1041,8 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
__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
diff --git a/libstdc++-v3/include/bits/uniform_int_dist.h b/libstdc++-v3/include/bits/uniform_int_dist.h
index 2d83524caf6..8ee33450fa1 100644
--- a/libstdc++-v3/include/bits/uniform_int_dist.h
+++ b/libstdc++-v3/include/bits/uniform_int_dist.h
@@ -299,6 +299,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#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,
@@ -307,6 +309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ret = _S_nd<unsigned __int128>(__urng, __u64erange);
}
else
+#pragma GCC diagnostic pop
#endif
if _GLIBCXX17_CONSTEXPR (__urngrange == __UINT32_MAX__)
{
diff --git a/libstdc++-v3/include/ext/numeric_traits.h b/libstdc++-v3/include/ext/numeric_traits.h
index a81fa6f0d85..0dc1bc61f3e 100644
--- a/libstdc++-v3/include/ext/numeric_traits.h
+++ b/libstdc++-v3/include/ext/numeric_traits.h
@@ -123,9 +123,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#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
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index cccc6eed763..91d65234f23 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -347,6 +347,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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)
@@ -385,6 +388,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_3>
: public true_type { };
#endif
+#pragma GCC diagnostic pop
/// @endcond
/// is_integral
@@ -617,6 +621,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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.
template<typename _Tp>
using __is_signed_integer = __is_one_of<__remove_cv_t<_Tp>,
@@ -654,6 +661,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
, 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>
@@ -1717,6 +1725,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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)
template<>
struct __make_unsigned<__GLIBCXX_TYPE_INT_N_0>
@@ -1738,6 +1749,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ 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,
@@ -1873,6 +1886,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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)
template<>
struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_0>
@@ -1894,6 +1910,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ 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,
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [committed] libstdc++: Suppress pedantic warnings about __int128
2021-07-16 7:41 [committed] libstdc++: Suppress pedantic warnings about __int128 Jonathan Wakely
@ 2021-07-16 8:27 ` Jakub Jelinek
2021-07-16 8:29 ` Jakub Jelinek
0 siblings, 1 reply; 8+ messages in thread
From: Jakub Jelinek @ 2021-07-16 8:27 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: libstdc++, gcc-patches
On Fri, Jul 16, 2021 at 08:41:06AM +0100, Jonathan Wakely via Gcc-patches wrote:
> --- a/libstdc++-v3/include/bits/max_size_type.h
> +++ b/libstdc++-v3/include/bits/max_size_type.h
> @@ -417,7 +417,10 @@ namespace ranges
> #endif
>
> #if __SIZEOF_INT128__
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wpedantic"
> using __rep = unsigned __int128;
> +#pragma GCC diagnostic pop
At least in simple cases like this, wouldn't
using __rep = __extension__ unsigned __int128;
be smaller? And it should be more targetted, wouldn't disable
other pedantic warnings but about __int128.
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [committed] libstdc++: Suppress pedantic warnings about __int128
2021-07-16 8:27 ` Jakub Jelinek
@ 2021-07-16 8:29 ` Jakub Jelinek
2021-07-16 8:38 ` Jonathan Wakely
0 siblings, 1 reply; 8+ messages in thread
From: Jakub Jelinek @ 2021-07-16 8:29 UTC (permalink / raw)
To: Jonathan Wakely, libstdc++, gcc-patches
On Fri, Jul 16, 2021 at 10:27:09AM +0200, Jakub Jelinek via Gcc-patches wrote:
> On Fri, Jul 16, 2021 at 08:41:06AM +0100, Jonathan Wakely via Gcc-patches wrote:
> > --- a/libstdc++-v3/include/bits/max_size_type.h
> > +++ b/libstdc++-v3/include/bits/max_size_type.h
> > @@ -417,7 +417,10 @@ namespace ranges
> > #endif
> >
> > #if __SIZEOF_INT128__
> > +#pragma GCC diagnostic push
> > +#pragma GCC diagnostic ignored "-Wpedantic"
> > using __rep = unsigned __int128;
> > +#pragma GCC diagnostic pop
>
> At least in simple cases like this, wouldn't
> using __rep = __extension__ unsigned __int128;
__extension__ using __rep = unsigned __int128;
actually (now tested).
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [committed] libstdc++: Suppress pedantic warnings about __int128
2021-07-16 8:29 ` Jakub Jelinek
@ 2021-07-16 8:38 ` Jonathan Wakely
2021-07-16 8:39 ` Jonathan Wakely
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Wakely @ 2021-07-16 8:38 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Jonathan Wakely, libstdc++, gcc-patches
On Fri, 16 Jul 2021, 09:30 Jakub Jelinek via Libstdc++, <
libstdc++@gcc.gnu.org> wrote:
> On Fri, Jul 16, 2021 at 10:27:09AM +0200, Jakub Jelinek via Gcc-patches
> wrote:
> > On Fri, Jul 16, 2021 at 08:41:06AM +0100, Jonathan Wakely via
> Gcc-patches wrote:
> > > --- a/libstdc++-v3/include/bits/max_size_type.h
> > > +++ b/libstdc++-v3/include/bits/max_size_type.h
> > > @@ -417,7 +417,10 @@ namespace ranges
> > > #endif
> > >
> > > #if __SIZEOF_INT128__
> > > +#pragma GCC diagnostic push
> > > +#pragma GCC diagnostic ignored "-Wpedantic"
> > > using __rep = unsigned __int128;
> > > +#pragma GCC diagnostic pop
> >
> > At least in simple cases like this, wouldn't
> > using __rep = __extension__ unsigned __int128;
>
> __extension__ using __rep = unsigned __int128;
> actually (now tested).
>
Ah, thanks. I didn't find the right syntax, and I know __extension__
doesn't work in other cases, like quad float literals, so I assumed it
doesn't work here. I suppose the literals don't work because the warning
comes from the processor, which doesn't understand __extension__ (and also
ignores the diagnostic pragma).
> Jakub
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [committed] libstdc++: Suppress pedantic warnings about __int128
2021-07-16 8:38 ` Jonathan Wakely
@ 2021-07-16 8:39 ` Jonathan Wakely
2021-07-16 11:29 ` Jonathan Wakely
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Wakely @ 2021-07-16 8:39 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Jonathan Wakely, libstdc++, gcc-patches
On Fri, 16 Jul 2021, 09:38 Jonathan Wakely, <jwakely.gcc@gmail.com> wrote:
>
>
> On Fri, 16 Jul 2021, 09:30 Jakub Jelinek via Libstdc++, <
> libstdc++@gcc.gnu.org> wrote:
>
>> On Fri, Jul 16, 2021 at 10:27:09AM +0200, Jakub Jelinek via Gcc-patches
>> wrote:
>> > On Fri, Jul 16, 2021 at 08:41:06AM +0100, Jonathan Wakely via
>> Gcc-patches wrote:
>> > > --- a/libstdc++-v3/include/bits/max_size_type.h
>> > > +++ b/libstdc++-v3/include/bits/max_size_type.h
>> > > @@ -417,7 +417,10 @@ namespace ranges
>> > > #endif
>> > >
>> > > #if __SIZEOF_INT128__
>> > > +#pragma GCC diagnostic push
>> > > +#pragma GCC diagnostic ignored "-Wpedantic"
>> > > using __rep = unsigned __int128;
>> > > +#pragma GCC diagnostic pop
>> >
>> > At least in simple cases like this, wouldn't
>> > using __rep = __extension__ unsigned __int128;
>>
>> __extension__ using __rep = unsigned __int128;
>> actually (now tested).
>>
>
> Ah, thanks. I didn't find the right syntax, and I know __extension__
> doesn't work in other cases, like quad float literals, so I assumed it
> doesn't work here. I suppose the literals don't work because the warning
> comes from the processor, which doesn't understand __extension__ (and also
> ignores the diagnostic pragma).
>
That grammar for a using-declaration makes no sense at all btw ;-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [committed] libstdc++: Suppress pedantic warnings about __int128
2021-07-16 8:39 ` Jonathan Wakely
@ 2021-07-16 11:29 ` Jonathan Wakely
2021-07-16 13:02 ` [PATCH] libstdc++: Use __extension__ instead of diagnostic pragmas (was: Suppress pedantic warnings about __int128) Jonathan Wakely
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Wakely @ 2021-07-16 11:29 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: Jakub Jelinek, libstdc++, gcc-patches
On Fri, 16 Jul 2021 at 09:40, Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
>
>
>
> On Fri, 16 Jul 2021, 09:38 Jonathan Wakely, <jwakely.gcc@gmail.com> wrote:
>>
>>
>>
>> On Fri, 16 Jul 2021, 09:30 Jakub Jelinek via Libstdc++, <libstdc++@gcc.gnu.org> wrote:
>>>
>>> On Fri, Jul 16, 2021 at 10:27:09AM +0200, Jakub Jelinek via Gcc-patches wrote:
>>> > On Fri, Jul 16, 2021 at 08:41:06AM +0100, Jonathan Wakely via Gcc-patches wrote:
>>> > > --- a/libstdc++-v3/include/bits/max_size_type.h
>>> > > +++ b/libstdc++-v3/include/bits/max_size_type.h
>>> > > @@ -417,7 +417,10 @@ namespace ranges
>>> > > #endif
>>> > >
>>> > > #if __SIZEOF_INT128__
>>> > > +#pragma GCC diagnostic push
>>> > > +#pragma GCC diagnostic ignored "-Wpedantic"
>>> > > using __rep = unsigned __int128;
>>> > > +#pragma GCC diagnostic pop
>>> >
>>> > At least in simple cases like this, wouldn't
>>> > using __rep = __extension__ unsigned __int128;
>>>
>>> __extension__ using __rep = unsigned __int128;
>>> actually (now tested).
>>
>>
>> Ah, thanks. I didn't find the right syntax, and I know __extension__ doesn't work in other cases, like quad float literals, so I assumed it doesn't work here. I suppose the literals don't work because the warning comes from the processor, which doesn't understand __extension__ (and also ignores the diagnostic pragma).
>
>
> That grammar for a using-declaration makes no sense at all btw ;-)
Hmm, in fact it seems that we can just use the __uint128_t typedef
instead, which doesn't give a pedwarn:
using __rep = __uint128_t;
Is that typedef always available if __int128 is? There's a comment in
gcc/c-family/c-common.c that I don't understand:
#if HOST_BITS_PER_WIDE_INT >= 64
/* Note that this is different than the __int128 type that's part of
the generic __intN support. */
if (targetm.scalar_mode_supported_p (TImode))
lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
TYPE_DECL,
get_identifier ("__int128_t"),
intTI_type_node));
#endif
They are the same type in C++, so what is "different"? Is it possible
for __int128 to be different from a TImode integer?
We can still use __extension__ elsewhere, for defining explicit
specializations using the non-standard integers, e.g.
#define __INT_N(TYPE) \
+ __extension__ \
template<> \
struct __is_integer<TYPE> \
{ \
enum { __value = 1 }; \
typedef __true_type __type; \
};
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] libstdc++: Use __extension__ instead of diagnostic pragmas (was: Suppress pedantic warnings about __int128)
2021-07-16 11:29 ` Jonathan Wakely
@ 2021-07-16 13:02 ` Jonathan Wakely
2021-07-16 14:39 ` Jonathan Wakely
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Wakely @ 2021-07-16 13:02 UTC (permalink / raw)
To: libstdc++; +Cc: Jakub Jelinek, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1298 bytes --]
On Fri, 16 Jul 2021 at 12:29, Jonathan Wakely wrote:
> Hmm, in fact it seems that we can just use the __uint128_t typedef
> instead, which doesn't give a pedwarn:
>
> using __rep = __uint128_t;
>
> Is that typedef always available if __int128 is? There's a comment in
> gcc/c-family/c-common.c that I don't understand:
>
> #if HOST_BITS_PER_WIDE_INT >= 64
> /* Note that this is different than the __int128 type that's part of
> the generic __intN support. */
> if (targetm.scalar_mode_supported_p (TImode))
> lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
> TYPE_DECL,
> get_identifier ("__int128_t"),
> intTI_type_node));
> #endif
>
> They are the same type in C++, so what is "different"? Is it possible
> for __int128 to be different from a TImode integer?
As discussed on IRC, I'm going to add a configure check that __int128
and __int128_t are the same, and similarly for the unsigned versions.
That will allow us to use __int128_t and __uint128_t to avoid the
warnings (assuming GCC doesn't change to warn consistently for the
non-standard typedefs as well as the non-standard types).
For now, I'll just use __extension__ consistently everywhere. I'm
testing the attached patch that does that.
[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 19001 bytes --]
commit d74d80c850f70d68100336c5ba0c166e22bc5ef6
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Fri Jul 16 13:23:06 2021
libstdc++: Use __extension__ instead of diagnostic pragmas
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.
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.
diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h
index 8f8dd817dc2..d9462209bc2 100644
--- a/libstdc++-v3/include/bits/cpp_type_traits.h
+++ b/libstdc++-v3/include/bits/cpp_type_traits.h
@@ -253,12 +253,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
};
#define __INT_N(TYPE) \
+ __extension__ \
template<> \
struct __is_integer<TYPE> \
{ \
enum { __value = 1 }; \
typedef __true_type __type; \
}; \
+ __extension__ \
template<> \
struct __is_integer<unsigned TYPE> \
{ \
@@ -266,9 +268,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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
@@ -282,8 +281,6 @@ __INT_N(__GLIBCXX_TYPE_INT_N_2)
__INT_N(__GLIBCXX_TYPE_INT_N_3)
#endif
-#pragma GCC diagnostic pop
-
#undef __INT_N
//
diff --git a/libstdc++-v3/include/bits/functional_hash.h b/libstdc++-v3/include/bits/functional_hash.h
index 78e3644bc74..919faba778b 100644
--- a/libstdc++-v3/include/bits/functional_hash.h
+++ b/libstdc++-v3/include/bits/functional_hash.h
@@ -171,28 +171,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// 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
diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h
index 97c0b80a507..9c28ebfb345 100644
--- a/libstdc++-v3/include/bits/iterator_concepts.h
+++ b/libstdc++-v3/include/bits/iterator_concepts.h
@@ -553,9 +553,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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__
@@ -564,6 +562,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
= false;
#endif
+ __extension__
template<typename _Tp>
concept __is_unsigned_int128
#if __SIZEOF_INT128__
@@ -572,8 +571,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
= false;
#endif
-#pragma GCC diagnostic pop
-
template<typename _Tp>
concept __cv_bool = same_as<const volatile _Tp, const volatile bool>;
diff --git a/libstdc++-v3/include/bits/max_size_type.h b/libstdc++-v3/include/bits/max_size_type.h
index 24237cc57de..298a929db03 100644
--- a/libstdc++-v3/include/bits/max_size_type.h
+++ b/libstdc++-v3/include/bits/max_size_type.h
@@ -417,10 +417,8 @@ namespace ranges
#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
@@ -774,10 +772,7 @@ namespace ranges
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>);
diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h
index 9e0359b8092..6d0e1544c90 100644
--- a/libstdc++-v3/include/bits/random.h
+++ b/libstdc++-v3/include/bits/random.h
@@ -101,7 +101,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#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.
@@ -1663,7 +1663,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void _M_init(const char*, size_t); // not exported from the shared library
- union
+ __extension__ union
{
struct
{
diff --git a/libstdc++-v3/include/bits/std_abs.h b/libstdc++-v3/include/bits/std_abs.h
index c65ebb66439..908d6bcd983 100644
--- a/libstdc++-v3/include/bits/std_abs.h
+++ b/libstdc++-v3/include/bits/std_abs.h
@@ -80,35 +80,30 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ 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"++"
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index 7f920dbdbf7..d0c49628d7f 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -1013,36 +1013,31 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
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
@@ -1050,7 +1045,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
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
diff --git a/libstdc++-v3/include/bits/uniform_int_dist.h b/libstdc++-v3/include/bits/uniform_int_dist.h
index 8ee33450fa1..622b1fee91d 100644
--- a/libstdc++-v3/include/bits/uniform_int_dist.h
+++ b/libstdc++-v3/include/bits/uniform_int_dist.h
@@ -299,17 +299,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#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__)
{
diff --git a/libstdc++-v3/include/ext/numeric_traits.h b/libstdc++-v3/include/ext/numeric_traits.h
index 0dc1bc61f3e..3ef0989fe74 100644
--- a/libstdc++-v3/include/ext/numeric_traits.h
+++ b/libstdc++-v3/include/ext/numeric_traits.h
@@ -93,12 +93,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// 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 }; \
@@ -123,12 +125,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#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
diff --git a/libstdc++-v3/include/std/limits b/libstdc++-v3/include/std/limits
index f2c20724f37..79aff3d93a4 100644
--- a/libstdc++-v3/include/std/limits
+++ b/libstdc++-v3/include/std/limits
@@ -1478,6 +1478,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
};
#define __INT_N(TYPE, BITSIZE, EXT, UEXT) \
+ __extension__ \
template<> \
struct numeric_limits<TYPE> \
{ \
@@ -1546,6 +1547,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
= round_toward_zero; \
}; \
\
+ __extension__ \
template<> \
struct numeric_limits<unsigned TYPE> \
{ \
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 8d9c6394cd8..15ec83a06b8 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -347,48 +347,52 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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
@@ -621,10 +625,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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,
@@ -644,6 +646,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>;
// 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,
@@ -661,7 +664,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
, 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>
@@ -1725,32 +1727,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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,
@@ -1886,32 +1887,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
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,
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libstdc++: Use __extension__ instead of diagnostic pragmas (was: Suppress pedantic warnings about __int128)
2021-07-16 13:02 ` [PATCH] libstdc++: Use __extension__ instead of diagnostic pragmas (was: Suppress pedantic warnings about __int128) Jonathan Wakely
@ 2021-07-16 14:39 ` Jonathan Wakely
0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Wakely @ 2021-07-16 14:39 UTC (permalink / raw)
To: libstdc++; +Cc: Jakub Jelinek, gcc-patches
On Fri, 16 Jul 2021 at 14:02, Jonathan Wakely wrote:
>
> On Fri, 16 Jul 2021 at 12:29, Jonathan Wakely wrote:
> > Hmm, in fact it seems that we can just use the __uint128_t typedef
> > instead, which doesn't give a pedwarn:
> >
> > using __rep = __uint128_t;
> >
> > Is that typedef always available if __int128 is? There's a comment in
> > gcc/c-family/c-common.c that I don't understand:
> >
> > #if HOST_BITS_PER_WIDE_INT >= 64
> > /* Note that this is different than the __int128 type that's part of
> > the generic __intN support. */
> > if (targetm.scalar_mode_supported_p (TImode))
> > lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
> > TYPE_DECL,
> > get_identifier ("__int128_t"),
> > intTI_type_node));
> > #endif
> >
> > They are the same type in C++, so what is "different"? Is it possible
> > for __int128 to be different from a TImode integer?
>
> As discussed on IRC, I'm going to add a configure check that __int128
> and __int128_t are the same, and similarly for the unsigned versions.
> That will allow us to use __int128_t and __uint128_t to avoid the
> warnings (assuming GCC doesn't change to warn consistently for the
> non-standard typedefs as well as the non-standard types).
>
> For now, I'll just use __extension__ consistently everywhere. I'm
> testing the attached patch that does that.
Pushed to trunk now.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-07-16 14:39 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-16 7:41 [committed] libstdc++: Suppress pedantic warnings about __int128 Jonathan Wakely
2021-07-16 8:27 ` Jakub Jelinek
2021-07-16 8:29 ` Jakub Jelinek
2021-07-16 8:38 ` Jonathan Wakely
2021-07-16 8:39 ` Jonathan Wakely
2021-07-16 11:29 ` Jonathan Wakely
2021-07-16 13:02 ` [PATCH] libstdc++: Use __extension__ instead of diagnostic pragmas (was: Suppress pedantic warnings about __int128) Jonathan Wakely
2021-07-16 14:39 ` Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).