From patchwork Tue Feb 9 21:54:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos O'Donell X-Patchwork-Id: 581083 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id F2BAE14030E for ; Wed, 10 Feb 2016 08:55:06 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b=YZqt9IKo; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:cc:from:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; q=dns; s=default; b=dQsxJKZpDSKGFrBs 6x+IO/D28ShMNx67F7Du9wjuMVjEh0rmeN4+HOi5I+cEM1SVC5AG2dx1Tq2aSEd1 3oIiBNyOY/6PcLGuQSkhXh8D7ASSHdHttGBCjvrPIHiZlSmlNN5Ye3Yvm00fuOYb k3BaUmoV1GwWw1VAIP2dZUdSk00= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:cc:from:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; s=default; bh=TOyxBuJU8fjmypAOhIm1Ku LPdws=; b=YZqt9IKodvkzxJyP30NunOEAOaxokAvgB02KRRBH2RYZOuD22ByykD haciKAEf8prc3Y1PHbxosXaQSMZS+p4JsE7M2BgohfaCZjbRrMdS+tFcBj0PTEFz PztISLHbqr3xYDmyHgQY1QE9VIUhiY5H/r+G1uzphmOKtVpQVkcUY= Received: (qmail 61734 invoked by alias); 9 Feb 2016 21:54:59 -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 61713 invoked by uid 89); 9 Feb 2016 21:54:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=Adding, ASAP, sk:testsi, Post X-HELO: mx1.redhat.com Subject: Re: [PATCH] Preserve ::is{inf, nan}{f, l} prototypes even for C++11 and later To: Jonathan Wakely , Adhemerval Zanella References: <20160201162152.GH3017@tucnak.redhat.com> <20160201163400.GH3471@redhat.com> <56B23119.3050605@linaro.org> <20160203174027.GK7732@vapier.lan> <56B2413D.1070309@linaro.org> <20160209172356.GC8441@redhat.com> <56BA240E.2080405@redhat.com> Cc: Jakub Jelinek , libc-alpha@sourceware.org From: "Carlos O'Donell" X-Enigmail-Draft-Status: N1110 Message-ID: <56BA602E.5090009@redhat.com> Date: Tue, 9 Feb 2016 16:54:54 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <56BA240E.2080405@redhat.com> On 02/09/2016 12:38 PM, Carlos O'Donell wrote: > On 02/09/2016 12:23 PM, Jonathan Wakely wrote: >> On 03/02/16 16:04 -0200, Adhemerval Zanella wrote: >>> >>> >>> On 03-02-2016 15:40, Mike Frysinger wrote: >>>> On 03 Feb 2016 14:55, Adhemerval Zanella wrote: >>>>> I will quote the email referenced: >>>>> >>>>>> C++11 code using isinf and isnan continues to compile after that >>>>>> change, because the C++11 standard library provides its own versions >>>>>> conforming to the C++11 requirements. However, the C++11 library >>>>>> doesn't provide isinff, isinfl etc. and so code using those >>>>>> (non-standard) functions will no longer compile if they are not >>>>>> declared by glibc. >>>>> >>>>> This was not clear to me, what kind of build issue are you seeing now? >>>>> Using isinf{f,l} by including just along with C++11? If it is the >>>>> case please open a bugzilla (or update the original) and please commit >>>>> the fix. >>>> >>>> if the change hasn't seen a release yet, then we can just re-use the >>>> existing bug since it's really just a direct follow up to that ? >>>> -mike >>>> >>> >>> I do not see why not. >> >> Hi, what's the status of this then - do we need to add a testcase or >> can it be committed for 2.23? (or wait for 2.24?) > > Yes, we want always want a test case. It's perfectly fine to use C++ > in tests in glibc, and if the C++ compiler isn't present those tests > should become UNSUPPORTED tests, which is OK (when bootstrapping). > > In summary: > - Add C++ test. > - Use BZ #19439 and provide ChangeLog. > - Post v2 v2 - Added test case which fails to compile before patch. I saw no easier way to test a header inclusion issue like this than to fail the entire testsuite when building that test. Adding a conform test just for this is overkill and outside the scope of conformtest. - Regression tested on x86_64 with no regressions. I'll commit this ASAP if nobody objects. Adhemerval? 2016-02-09 Jakub Jelinek Jonathan Wakely Carlos O'Donell [BZ 19439] * math/Makefile (tests): Add test-math-isinff. (CFLAGS-test-math-isinff.cc): Use -std=gnu++11. * math/bits/mathcalls.h [__USE_MISC]: Use '|| __MATH_DECLARING_DOUBLE == 0' to relax definition of functions not in C++11 and which don't conflict e.g. isinff, isinfl etc. * math/test-math-isinff.cc: New file. Cheers, Carlos. diff --git a/math/Makefile b/math/Makefile index 222ee6b..7d573a0 100644 --- a/math/Makefile +++ b/math/Makefile @@ -114,6 +114,7 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \ test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \ test-signgam-uint test-signgam-uint-init test-signgam-ullong \ test-signgam-ullong-init test-nan-overflow test-nan-payload \ + test-math-isinff \ $(tests-static) tests-static = test-fpucw-static test-fpucw-ieee-static \ test-signgam-uchar-static test-signgam-uchar-init-static \ @@ -220,6 +221,8 @@ CFLAGS-test-signgam-ullong-init.c = -std=c99 CFLAGS-test-signgam-ullong-static.c = -std=c99 CFLAGS-test-signgam-ullong-init-static.c = -std=c99 +CFLAGS-test-math-isinff.cc = -std=gnu++11 + # The -lieee module sets the _LIB_VERSION_ switch to IEEE mode # for error handling in the -lm functions. install-lib += libieee.a diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index a48345d..9a7b3f0 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -196,7 +196,9 @@ __MATHDECL_1 (int,__finite,, (_Mdouble_ __value)) __attribute__ ((__const__)); _Mdouble_END_NAMESPACE #ifdef __USE_MISC -# if !defined __cplusplus || __cplusplus < 201103L /* Conflicts with C++11. */ +# if (!defined __cplusplus \ + || __cplusplus < 201103L /* isinf conflicts with C++11. */ \ + || __MATH_DECLARING_DOUBLE == 0) /* isinff or isinfl don't. */ /* Return 0 if VALUE is finite or NaN, +1 if it is +Infinity, -1 if it is -Infinity. */ __MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__)); @@ -232,7 +234,9 @@ __END_NAMESPACE_C99 __MATHDECL_1 (int,__isnan,, (_Mdouble_ __value)) __attribute__ ((__const__)); #if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K) -# if !defined __cplusplus || __cplusplus < 201103L /* Conflicts with C++11. */ +# if (!defined __cplusplus \ + || __cplusplus < 201103L /* isnan conflicts with C++11. */ \ + || __MATH_DECLARING_DOUBLE == 0) /* isnanf or isnanl don't. */ /* Return nonzero if VALUE is not a number. */ __MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__)); # endif diff --git a/math/test-math-isinff.cc b/math/test-math-isinff.cc new file mode 100644 index 0000000..195d753 --- /dev/null +++ b/math/test-math-isinff.cc @@ -0,0 +1,48 @@ +/* Test for bug 19439. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define _GNU_SOURCE 1 +#include +#include +#include + +static int +do_test (void) +{ + /* Verify that isinff, isinfl, isnanf, and isnanlf are defined + in the header under C++11 and can be called. Without the + header fix this test will not compile. */ + if (isinff (1.0f) + || !isinff (INFINITY) + || isinfl (1.0L) + || !isinfl (INFINITY) + || isnanf (2.0f) + || !isnanf (NAN) + || isnanl (2.0L) + || !isnanl (NAN)) + { + printf ("FAIL: Failed to call is* functions.\n"); + exit (1); + } + printf ("PASS: Able to call isinff, isinfl, isnanf, and isnanl.\n"); + exit (0); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" ---