diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-10-09 14:58:34 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-10-09 16:18:11 +0200 |
commit | d6c064e914cba3277d852c9fa27db53f0059ff8c (patch) | |
tree | e8ce891a1960979738c5a262475b7487b5881883 | |
parent | 645ac9aaf89e3311949828546df6334322f48933 (diff) | |
download | glibc-d6c064e914cba3277d852c9fa27db53f0059ff8c.tar.gz glibc-d6c064e914cba3277d852c9fa27db53f0059ff8c.tar.xz glibc-d6c064e914cba3277d852c9fa27db53f0059ff8c.zip |
Ensure C99 and C11 interfaces are available for C++ [BZ #21326]
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.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | include/features.h | 17 | ||||
-rw-r--r-- | math/Makefile | 4 | ||||
-rw-r--r-- | math/test-math-cxx11.cc | 160 |
4 files changed, 182 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index da396fff20..876f5e614f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2017-10-09 Jonathan Wakely <jwakely@redhat.com> + + [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 <christian.brauner@ubuntu.com> * 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..8417cdd6e3 --- /dev/null +++ b/math/test-math-cxx11.cc @@ -0,0 +1,160 @@ +/* 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. + + 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 + <http://www.gnu.org/licenses/>. */ + +#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 <math.h> +#include <stdio.h> + +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 <support/test-driver.c> |