This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCHv2] S390: Fix build failure in test string/tst-endian.c with gcc 6.


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.
diff --git a/string/tst-endian.c b/string/tst-endian.c
index 8684bb2..358232c 100644
--- a/string/tst-endian.c
+++ b/string/tst-endian.c
@@ -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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]