[PATCHv2] S390: Fix build failure in test string/tst-endian.c with gcc 6.
Commit Message
On 01/21/2016 03:05 PM, Joseph Myers wrote:
> On Thu, 21 Jan 2016, Stefan Liebler wrote:
>
>> This patch makes these if-statements conditional on __BYTE_ORDER ==
>> __LITTLE_ENDIAN.
>
> I don't think that's the right fix.
>
> This test is verifying assertions that should be true for both
> endiannesses. It just so happens that some of those assertions can be
> verified at compile time in some cases, but they are still appropriate
> assertions for it to verify.
Agreed
> This is one of the cases where the nature of what is being tested requires
> doing something that GCC warns about. In such a case, rather than
> disabling the testing of those assertions, you should disable the warning
> (with DIAG_* macros if possible - if glibc supports building with GCC
> versions without the relevant -W option, they'll need to be appropriately
> conditional), with appropriate comments explaining the issue.
ok
This patch suppresses these warnings with DIAG_* macros.
The conditional #if __GNUC_PREREQ (6, 0) is needed, because an older gcc
would warn about:
tst-endian.c: In function ‘do_test’:
tst-endian.c:18:4: warning: unknown option after ‘#pragma GCC
diagnostic’ kind [-Wpragmas]
DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare");
^
I've extended the patch in order to suppress those warnings on little
endian systems for "if (htoleXX (leXXtoh (i)) != i)", too.
Those macros are defined to (x) in string/endian.h for little endian
systems and produce the same warning.
Ok to commit?
Bye Stefan
ChangeLog:
* string/tst-endian.c: Include <libc-internal.h>
(do_test): Ignore tautological-compare warnings around
"htobeXX (beXXtoh (i)) != i" and
"htoleXX (leXXtoh (i)) != i" if-statements.
Comments
On 21 Jan 2016 17:38, Stefan Liebler wrote:
> This patch suppresses these warnings with DIAG_* macros.
> The conditional #if __GNUC_PREREQ (6, 0) is needed, because an older gcc
> would warn about:
> tst-endian.c: In function ‘do_test’:
> tst-endian.c:18:4: warning: unknown option after ‘#pragma GCC
> diagnostic’ kind [-Wpragmas]
> DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare");
> ^
you can at least do it once at the top via a local define:
/* big comment block */
#if __GNUC_PREREQ (6, 0)
# define DIAG_IGNORE_NEEDS_COMMENT_AUTOLOGICAL_COMPARE() \
DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare");
#else
# define DIAG_IGNORE_NEEDS_COMMENT_AUTOLOGICAL_COMPARE()
#endif
then the inline usage is simple
-mike
@@ -3,6 +3,7 @@
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
+#include <libc-internal.h>
static int
do_test (void)
@@ -13,6 +14,17 @@ do_test (void)
{
if (i < UINT64_C (65536))
{
+ DIAG_PUSH_NEEDS_COMMENT;
+#if __GNUC_PREREQ (6, 0)
+ /* GCC 6.0 warns on big endian systems about:
+ htobe16 (be16toh (i)) != i
+ warning: self-comparison always evaluates to false
+ [-Wtautological-compare]
+ because htobe16(x) and be16toh(x) is defined to (x)
+ in string/endian.h on big endian systems.
+ The same applies to htole16/le16toh on little endian systems. */
+ DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare");
+#endif
if (htobe16 (be16toh (i)) != i)
{
printf ("htobe16 (be16toh (%" PRIx64 ")) == %" PRIx16 "\n",
@@ -25,6 +37,7 @@ do_test (void)
i, (uint16_t) htole16 (le16toh (i)));
result = 1;
}
+ DIAG_POP_NEEDS_COMMENT;
uint16_t n[2];
n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_16 (i);
@@ -45,6 +58,17 @@ do_test (void)
if (i < UINT64_C (4294967296))
{
+ DIAG_PUSH_NEEDS_COMMENT;
+#if __GNUC_PREREQ (6, 0)
+ /* GCC 6.0 warns on big endian systems about:
+ htobe32 (be32toh (i)) != i
+ warning: self-comparison always evaluates to false
+ [-Wtautological-compare]
+ because htobe32(x) and be32toh(x) is defined to (x)
+ in string/endian.h on big endian systems.
+ The same applies to htole32/le32toh on little endian systems. */
+ DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare");
+#endif
if (htobe32 (be32toh (i)) != i)
{
printf ("htobe32 (be32toh (%" PRIx64 ")) == %" PRIx32 "\n",
@@ -57,6 +81,7 @@ do_test (void)
i, (uint32_t) htole32 (le32toh (i)));
result = 1;
}
+ DIAG_POP_NEEDS_COMMENT;
uint32_t n[2];
n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_32 (i);
@@ -75,6 +100,17 @@ do_test (void)
}
}
+ DIAG_PUSH_NEEDS_COMMENT;
+#if __GNUC_PREREQ (6, 0)
+ /* GCC 6.0 warns on big endian systems about:
+ htobe64 (be64toh (i)) != i
+ warning: self-comparison always evaluates to false
+ [-Wtautological-compare]
+ because htobe64(x) and be64toh(x) is defined to (x)
+ in string/endian.h on big endian systems.
+ The same applies to htole64/le64toh on little endian systems. */
+ DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare");
+#endif
if (htobe64 (be64toh (i)) != i)
{
printf ("htobe64 (be64toh (%" PRIx64 ")) == %" PRIx64 "\n",
@@ -87,6 +123,7 @@ do_test (void)
i, htole64 (le64toh (i)));
result = 1;
}
+ DIAG_POP_NEEDS_COMMENT;
uint64_t n[2];
n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_64 (i);