From patchwork Thu Jan 21 16:38:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stefan Liebler X-Patchwork-Id: 10506 Received: (qmail 126777 invoked by alias); 21 Jan 2016 16:39:15 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 126757 invoked by uid 89); 21 Jan 2016 16:39:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=1417, 456, 123, 7, 1237 X-HELO: plane.gmane.org To: libc-alpha@sourceware.org From: Stefan Liebler Subject: [PATCHv2] S390: Fix build failure in test string/tst-endian.c with gcc 6. Date: Thu, 21 Jan 2016 17:38:54 +0100 Lines: 151 Message-ID: References: Mime-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 In-Reply-To: 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 (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 #include #include +#include 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);