From patchwork Mon Oct 9 14:00:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 23408 Received: (qmail 89261 invoked by alias); 9 Oct 2017 14:00:38 -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 89118 invoked by uid 89); 9 Oct 2017 14:00:26 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=ansi, ANSI, login, brauner X-HELO: mx1.redhat.com DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0D150820EE Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jwakely@redhat.com Date: Mon, 9 Oct 2017 15:00:17 +0100 From: Jonathan Wakely To: Florian Weimer Cc: Joseph Myers , libc-alpha@sourceware.org Subject: Re: [PATCH][BZ #21326] Ensure C99 and C11 interfaces are available for C++ Message-ID: <20171009140017.GA3090@redhat.com> References: <20170922175120.GA21566@redhat.com> <20170922181627.GW4582@redhat.com> <39059803-3660-4a49-b930-980ae2a9040b@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <39059803-3660-4a49-b930-980ae2a9040b@redhat.com> X-Clacks-Overhead: GNU Terry Pratchett User-Agent: Mutt/1.9.1 (2017-09-22) On 09/10/17 15:24 +0200, Florian Weimer wrote: >On 09/22/2017 08:16 PM, Jonathan Wakely wrote: >>+#ifdef __cplusplus >>+/* This is to enable compatibility for ISO C++17. */ >>+#if __cplusplus >= 201703L >>+# define __USE_ISOC11 1 >>+#endif >> /* This is to enable compatibility for ISO C++11. > >The inner #if/#endif should be indented (similar to the inner #define). > >>- >>- So far g++ does not provide a macro. Check the temporary macro for >>- now, too. */ >>-#if ((defined __cplusplus && __cplusplus >= 201103L) \ >>- || defined __GXX_EXPERIMENTAL_CXX0X__) >>+ Check the temporary macro for now, too. */ >>+#if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ >> # define __USE_ISOCXX11 1 >>+# define __USE_ISOC99 1 >>+#endif >> #endif > >I think there is a preexisting issue here which will trigger macro >redefinition warnings with -Wsystem-headers. But perhaps I'm >mistaken. Even though both definitions are identical? I think there's no redefinition warning for: #define __USE_ISOC99 1 #define __USE_ISOC99 1 Only if the macro's replacement-list differs on the redefinition. >Apart from that, the substance of the patch looks okay to me. Thanks. Here's an updated patch against current master, with the fixed indentation. Tested again on x86_64-pc-linux-gnu (Fedora 26). From 89af7e3d8e5933ad801db224e6ba82ebc4fd613d Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 9 Oct 2017 14:58:34 +0100 Subject: [PATCH] [BZ #21326] Ensure C99 and C11 interfaces are available for C++ This patch ensures that the C99 and C11 features required by C++ are defined according to the value of the __cplusplus macro, and not just because G++ always defines _GNU_SOURCE. This will allow G++ to stop defining _GNU_SOURCE some day, without causing the C99 and C11 interfaces to disappear for C++ programs. [BZ #21326] * include/features.h [__cplusplus >= 201103] (__USE_ISOC99): Define. [__cplusplus >= 201703] (__USE_ISOCXX17, __USE_ISOC11): Define. * math/Makefile (test-math-cxx11): New test. * math/test-math-cxx11.cc: New file. --- ChangeLog | 8 +++ include/features.h | 17 +++-- math/Makefile | 4 +- math/test-math-cxx11.cc | 161 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 183 insertions(+), 7 deletions(-) create mode 100644 math/test-math-cxx11.cc diff --git a/ChangeLog b/ChangeLog index da396fff20..32bbcf2e34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2017-09-22 Jonathan Wakely + + [BZ #21326] + * include/features.h [__cplusplus >= 201703] (__USE_ISOC11): Define. + [__cplusplus >= 201103] (__USE_ISOC99): Define. + * math/Makefile (test-math-cxx11): New test. + * math/test-math-cxx11.cc: New file. + 2017-10-08 Christian Brauner * login/openpty.c (openpty): Close slave pty file descriptor on error. diff --git a/include/features.h b/include/features.h index c063b33b49..22735ec117 100644 --- a/include/features.h +++ b/include/features.h @@ -76,6 +76,7 @@ __USE_ISOC11 Define ISO C11 things. __USE_ISOC99 Define ISO C99 things. __USE_ISOC95 Define ISO C90 AMD1 (C95) things. + __USE_ISOCXX11 Define ISO C++11 things. __USE_POSIX Define IEEE Std 1003.1 things. __USE_POSIX2 Define IEEE Std 1003.2 things. __USE_POSIX199309 Define IEEE Std 1003.1, and .1b things. @@ -238,13 +239,17 @@ # define __USE_ISOC95 1 #endif +#ifdef __cplusplus +/* This is to enable compatibility for ISO C++17. */ +# if __cplusplus >= 201703L +# define __USE_ISOC11 1 +# endif /* This is to enable compatibility for ISO C++11. - - So far g++ does not provide a macro. Check the temporary macro for - now, too. */ -#if ((defined __cplusplus && __cplusplus >= 201103L) \ - || defined __GXX_EXPERIMENTAL_CXX0X__) -# define __USE_ISOCXX11 1 + Check the temporary macro for now, too. */ +# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ +# define __USE_ISOCXX11 1 +# define __USE_ISOC99 1 +# endif #endif /* If none of the ANSI/POSIX macros are defined, or if _DEFAULT_SOURCE diff --git a/math/Makefile b/math/Makefile index 008eeb2d18..d4f9e6b6e9 100644 --- a/math/Makefile +++ b/math/Makefile @@ -209,7 +209,7 @@ tests-static += atest-exp atest-sincos atest-exp2 ifneq (,$(CXX)) tests += test-math-isinff test-math-iszero test-math-issignaling \ - test-math-iscanonical + test-math-iscanonical test-math-cxx11 endif ifneq (no,$(PERL)) @@ -354,6 +354,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-cxx11.cc = -std=c++11 + CFLAGS-test-math-isinff.cc = -std=gnu++11 CFLAGS-test-math-iszero.cc = -std=gnu++11 CFLAGS-test-math-issignaling.cc = -std=gnu++11 diff --git a/math/test-math-cxx11.cc b/math/test-math-cxx11.cc new file mode 100644 index 0000000000..5d93e668e6 --- /dev/null +++ b/math/test-math-cxx11.cc @@ -0,0 +1,161 @@ +/* Test C99 math functions are available in C++11 without _GNU_SOURCE. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jonathan Wakely , 2017. + + 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 + . */ + +#undef _GNU_SOURCE +#undef _DEFAULT_SOURCE +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +// __STRICT_ANSI__ gets defined by -std=c++11 in CFLAGS +#include +#include + +static int +do_test (void) +{ +#ifdef _GNU_SOURCE + printf ("FAIL: _GNU_SOURCE is defined.\n"); + return 1; +#endif + +#if __cplusplus >= 201103L + /* Verify that C11 math functions and types are defined for C++11, + without _GNU_SOURCE being defined. [BZ #21326] */ + (void) FP_INFINITE; + (void) FP_NAN; + (void) FP_NORMAL; + (void) FP_SUBNORMAL; + (void) FP_ZERO; + double_t d = 1.0; + (void) d; + float_t f = 1.0f; + (void) f; + (void) acosh; + (void) acoshf; + (void) acoshl; + (void) asinh; + (void) asinhf; + (void) asinhl; + (void) atanh; + (void) atanhf; + (void) atanhl; + (void) cbrt; + (void) cbrtf; + (void) cbrtl; + (void) copysign; + (void) copysignf; + (void) copysignl; + (void) erf; + (void) erff; + (void) erfl; + (void) erfc; + (void) erfcf; + (void) erfcl; + (void) exp2; + (void) exp2f; + (void) exp2l; + (void) expm1; + (void) expm1f; + (void) expm1l; + (void) fdim; + (void) fdimf; + (void) fdiml; + (void) fma; + (void) fmaf; + (void) fmal; + (void) fmax; + (void) fmaxf; + (void) fmaxl; + (void) fmin; + (void) fminf; + (void) fminl; + (void) hypot; + (void) hypotf; + (void) hypotl; + (void) ilogb; + (void) ilogbf; + (void) ilogbl; + (void) lgamma; + (void) lgammaf; + (void) lgammal; + (void) llrint; + (void) llrintf; + (void) llrintl; + (void) llround; + (void) llroundf; + (void) llroundl; + (void) log1p; + (void) log1pf; + (void) log1pl; + (void) log2; + (void) log2f; + (void) log2l; + (void) logb; + (void) logbf; + (void) logbl; + (void) lrint; + (void) lrintf; + (void) lrintl; + (void) lround; + (void) lroundf; + (void) lroundl; + (void) nan; + (void) nanf; + (void) nanl; + (void) nearbyint; + (void) nearbyintf; + (void) nearbyintl; + (void) nextafter; + (void) nextafterf; + (void) nextafterl; + (void) nexttoward; + (void) nexttowardf; + (void) nexttowardl; + (void) remainder; + (void) remainderf; + (void) remainderl; + (void) remquo; + (void) remquof; + (void) remquol; + (void) rint; + (void) rintf; + (void) rintl; + (void) round; + (void) roundf; + (void) roundl; + (void) scalbln; + (void) scalblnf; + (void) scalblnl; + (void) scalbn; + (void) scalbnf; + (void) scalbnl; + (void) tgamma; + (void) tgammaf; + (void) tgammal; + (void) trunc; + (void) truncf; + (void) truncl; + printf ("PASS: C11 math functions present in C++11 without _GNU_SOURCE.\n"); +#else + printf ("UNSUPPORTED: C++11 not enabled.\n"); +#endif + return 0; +} + +#include