commit 9d0a8d21b790517dbcf1f3c1d83f549e96170feb Author: Jonathan Wakely Date: Fri Nov 13 09:23:37 2015 +0000 More fine-grained autoconf checks for C99 library 2015-11-13 Jennifer Yao Jonathan Wakely PR libstdc++/58393 PR libstdc++/61580 * acinclude.m4 (GLIBCXX_ENABLE_C99): Perform tests twice, with -std=c++11 as well as -std=c++98, and define separate macros for each. Cache the results of checking for complex math and wide character functions. Reformat for readability. * config.h.in: Regenerate. * include/bits/c++config: Define _GLIBCXX_USE_C99_XXX macros to either _GLIBCXX98_USE_C99_XXX or _GLIBCXX11_USE_C99_XXX according to language standard in use. * config/locale/dragonfly/c_locale.h (std::__convert_from_v): Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * config/locale/generic/c_locale.h (std::__convert_from_v): Likewise. * config/locale/gnu/c_locale.h (std::__convert_from_v): Likewise. * config/os/bsd/dragonfly/os_defines.h: Define _GLIBCXX_USE_C99_STDIO, _GLIBCXX_USE_C99_STDLIB, and _GLIBCXX_USE_C99_WCHAR. * configure: Regenerate. * include/bits/basic_string.h: Make numeric conversion functions depend on _GLIBCXX_USE_C99_STDIO, _GLIBCXX_USE_C99_STDLIB, or _GLIBCXX_USE_C99_WCHAR, instead of _GLIBCXX_USE_C99. * include/ext/vstring.h: Likewise. * include/bits/locale_facets.tcc (std::num_put::_M_insert_float): Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * include/bits/locale_facets_nonio.tcc (std::money_put::do_put): Likewise. * include/c_compatibility/math.h: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_MATH. * include/c_compatibility/wchar.h: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_WCHAR. * include/c_global/cstdio: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * include/c_global/cstdlib: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * include/c_global/cwchar: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_WCHAR. * include/c_std/cstdio: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * include/c_std/cstdlib: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * include/c_std/cwchar: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_WCHAR. * include/tr1/cstdio: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * include/tr1/cstdlib: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * include/tr1/cwchar: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_WCHAR. * include/tr1/stdlib.h: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * src/c++98/locale_facets.cc (std::__num_base::_S_format_float): Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * testsuite/18_support/exception_ptr/60612-terminate.cc: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * testsuite/18_support/exception_ptr/60612-unexpected.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc (test01): Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_WCHAR. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stof.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stoi.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stol.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stold.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stoll.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stoul.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ stoull.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/wchar_t/ to_wstring.cc: Likewise. * testsuite/26_numerics/headers/cstdlib/13943.cc: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * testsuite/26_numerics/headers/cstdlib/types_std_c++0x.cc: Likewise. * testsuite/lib/libstdc++.exp (check_v3_target_string_conversions): Change preprocessor #if conditional so that it uses _GLIBCXX_USE_C99_STDIO, _GLIBCXX_USE_C99_STDLIB, and _GLIBCXX_USE_C99_WCHAR, instead of _GLIBCXX_USE_C99. * testsuite/tr1/8_c_compatibility/cmath/templates.cc: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_MATH. * testsuite/tr1/8_c_compatibility/cstdio/functions.cc: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. * testsuite/tr1/8_c_compatibility/cstdlib/functions.cc: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDLIB. * testsuite/tr1/8_c_compatibility/cstdlib/types_std_tr1.cc: Likewise. * testsuite/tr1/8_c_compatibility/cwchar/functions.cc: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_WCHAR. * testsuite/util/testsuite_fs.h: Replace _GLIBCXX_USE_C99 with _GLIBCXX_USE_C99_STDIO. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index abf2e93..deefa04 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -915,234 +915,438 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [ GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support]) if test x"$enable_c99" = x"yes"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS - AC_LANG_SAVE - AC_LANG_CPLUSPLUS + # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__ + # undefined may cause fake C99 facilities, like pre-standard snprintf, + # to be spuriously enabled. + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -std=c++98" + ac_save_LIBS="$LIBS" + ac_save_gcc_no_link="$gcc_no_link" - # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__ - # undefined and fake C99 facilities - like pre-standard snprintf - may be - # spuriously enabled. - # Long term, -std=c++0x could be even better, could manage to explicitly - # request C99 facilities to the underlying C headers. - ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS -std=c++98" - ac_save_LIBS="$LIBS" - ac_save_gcc_no_link="$gcc_no_link" + if test x$gcc_no_link != xyes; then + # Use -fno-exceptions to that the C driver can link these tests without + # hitting undefined references to personality routines. + CXXFLAGS="$CXXFLAGS -fno-exceptions" + AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [ + # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK + gcc_no_link=yes + ]) + fi - if test x$gcc_no_link != xyes; then - # Use -fno-exceptions to that the C driver can link these tests without - # hitting undefined references to personality routines. - CXXFLAGS="$CXXFLAGS -fno-exceptions" - AC_CHECK_LIB(m, sin, [ - LIBS="$LIBS -lm" - ], [ - # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK - gcc_no_link=yes + # Check for the existence of functions used if C99 is enabled. + AC_MSG_CHECKING([for ISO C99 support in for C++98]) + AC_CACHE_VAL(glibcxx_cv_c99_math_cxx98, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + volatile double d1, d2; + volatile int i;], + [i = fpclassify(d1); + i = isfinite(d1); + i = isinf(d1); + i = isnan(d1); + i = isnormal(d1); + i = signbit(d1); + i = isgreater(d1, d2); + i = isgreaterequal(d1, d2); + i = isless(d1, d2); + i = islessequal(d1, d2); + i = islessgreater(d1, d2); + i = islessgreater(d1, d2); + i = isunordered(d1, d2); + ], [glibcxx_cv_c99_math_cxx98=yes], [glibcxx_cv_c99_math_cxx98=no]) ]) - fi + AC_MSG_RESULT($glibcxx_cv_c99_math_cxx98) + if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then + AC_DEFINE(_GLIBCXX98_USE_C99_MATH, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++98.]) + fi - # Check for the existence of functions used if C99 is enabled. - AC_MSG_CHECKING([for ISO C99 support in ]) - AC_CACHE_VAL(glibcxx_cv_c99_math, [ - GCC_TRY_COMPILE_OR_LINK( - [#include - volatile double d1, d2; - volatile int i;], - [i = fpclassify(d1); - i = isfinite(d1); - i = isinf(d1); - i = isnan(d1); - i = isnormal(d1); - i = signbit(d1); - i = isgreater(d1, d2); - i = isgreaterequal(d1, d2); - i = isless(d1, d2); - i = islessequal(d1, d2); - i = islessgreater(d1, d2); - i = islessgreater(d1, d2); - i = isunordered(d1, d2); - ],[glibcxx_cv_c99_math=yes], [glibcxx_cv_c99_math=no]) - ]) - AC_MSG_RESULT($glibcxx_cv_c99_math) - if test x"$glibcxx_cv_c99_math" = x"yes"; then - AC_DEFINE(_GLIBCXX_USE_C99_MATH, 1, - [Define if C99 functions or macros in should be imported - in in namespace std.]) - fi + # Check for the existence of complex math functions. + # This is necessary even though libstdc++ uses the builtin versions + # of these functions, because if the builtin cannot be used, a reference + # to the library function is emitted. + AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no) + AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no) + if test x"$ac_has_complex_h" = x"yes"; then + AC_MSG_CHECKING([for ISO C99 support in for C++98]) + AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx98, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + typedef __complex__ float float_type; + typedef __complex__ double double_type; + typedef __complex__ long double ld_type; + volatile float_type tmpf; + volatile double_type tmpd; + volatile ld_type tmpld; + volatile float f; + volatile double d; + volatile long double ld;], + [f = cabsf(tmpf); + f = cargf(tmpf); + tmpf = ccosf(tmpf); + tmpf = ccoshf(tmpf); + tmpf = cexpf(tmpf); + tmpf = clogf(tmpf); + tmpf = csinf(tmpf); + tmpf = csinhf(tmpf); + tmpf = csqrtf(tmpf); + tmpf = ctanf(tmpf); + tmpf = ctanhf(tmpf); + tmpf = cpowf(tmpf, tmpf); + tmpf = cprojf(tmpf); + d = cabs(tmpd); + d = carg(tmpd); + tmpd = ccos(tmpd); + tmpd = ccosh(tmpd); + tmpd = cexp(tmpd); + tmpd = clog(tmpd); + tmpd = csin(tmpd); + tmpd = csinh(tmpd); + tmpd = csqrt(tmpd); + tmpd = ctan(tmpd); + tmpd = ctanh(tmpd); + tmpd = cpow(tmpd, tmpd); + tmpd = cproj(tmpd); + ld = cabsl(tmpld); + ld = cargl(tmpld); + tmpld = ccosl(tmpld); + tmpld = ccoshl(tmpld); + tmpld = cexpl(tmpld); + tmpld = clogl(tmpld); + tmpld = csinl(tmpld); + tmpld = csinhl(tmpld); + tmpld = csqrtl(tmpld); + tmpld = ctanl(tmpld); + tmpld = ctanhl(tmpld); + tmpld = cpowl(tmpld, tmpld); + tmpld = cprojl(tmpld); + ], [glibcxx_cv_c99_complex_cxx98=yes], [glibcxx_cv_c99_complex_cxx98=no]) + ]) + fi + AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx98) + if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then + AC_DEFINE(_GLIBCXX98_USE_C99_COMPLEX, 1, + [Define if C99 functions in should be used in + for C++98. Using compiler builtins for these functions + requires corresponding C99 library functions to be present.]) + fi - # Check for the existence of complex math functions. - # This is necessary even though libstdc++ uses the builtin versions - # of these functions, because if the builtin cannot be used, a reference - # to the library function is emitted. - AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no) - AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no) - glibcxx_cv_c99_complex=no; - if test x"$ac_has_complex_h" = x"yes"; then - AC_MSG_CHECKING([for ISO C99 support in ]) - GCC_TRY_COMPILE_OR_LINK( - [#include - typedef __complex__ float float_type; - typedef __complex__ double double_type; - typedef __complex__ long double ld_type; - volatile float_type tmpf; - volatile double_type tmpd; - volatile ld_type tmpld; - volatile float f; - volatile double d; - volatile long double ld;], - [f = cabsf(tmpf); - f = cargf(tmpf); - tmpf = ccosf(tmpf); - tmpf = ccoshf(tmpf); - tmpf = cexpf(tmpf); - tmpf = clogf(tmpf); - tmpf = csinf(tmpf); - tmpf = csinhf(tmpf); - tmpf = csqrtf(tmpf); - tmpf = ctanf(tmpf); - tmpf = ctanhf(tmpf); - tmpf = cpowf(tmpf, tmpf); - tmpf = cprojf(tmpf); - d = cabs(tmpd); - d = carg(tmpd); - tmpd = ccos(tmpd); - tmpd = ccosh(tmpd); - tmpd = cexp(tmpd); - tmpd = clog(tmpd); - tmpd = csin(tmpd); - tmpd = csinh(tmpd); - tmpd = csqrt(tmpd); - tmpd = ctan(tmpd); - tmpd = ctanh(tmpd); - tmpd = cpow(tmpd, tmpd); - tmpd = cproj(tmpd); - ld = cabsl(tmpld); - ld = cargl(tmpld); - tmpld = ccosl(tmpld); - tmpld = ccoshl(tmpld); - tmpld = cexpl(tmpld); - tmpld = clogl(tmpld); - tmpld = csinl(tmpld); - tmpld = csinhl(tmpld); - tmpld = csqrtl(tmpld); - tmpld = ctanl(tmpld); - tmpld = ctanhl(tmpld); - tmpld = cpowl(tmpld, tmpld); - tmpld = cprojl(tmpld); - ],[glibcxx_cv_c99_complex=yes], [glibcxx_cv_c99_complex=no]) - fi - AC_MSG_RESULT($glibcxx_cv_c99_complex) - if test x"$glibcxx_cv_c99_complex" = x"yes"; then - AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX, 1, - [Define if C99 functions in should be used in - . Using compiler builtins for these functions requires - corresponding C99 library functions to be present.]) - fi + # Check for the existence in of vscanf, et. al. + AC_MSG_CHECKING([for ISO C99 support in for C++98]) + AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx98, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + #include + void foo(char* fmt, ...) + { + va_list args; va_start(args, fmt); + vfscanf(stderr, "%i", args); + vscanf("%i", args); + vsnprintf(fmt, 0, "%i", args); + vsscanf(fmt, "%i", args); + snprintf(fmt, 0, "%i"); + }], [], + [glibcxx_cv_c99_stdio_cxx98=yes], [glibcxx_cv_c99_stdio_cxx98=no]) + ]) + AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx98) + if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then + AC_DEFINE(_GLIBCXX98_USE_C99_STDIO, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++98.]) + fi - # Check for the existence in of vscanf, et. al. - AC_MSG_CHECKING([for ISO C99 support in ]) - AC_CACHE_VAL(glibcxx_cv_c99_stdio, [ - GCC_TRY_COMPILE_OR_LINK( - [#include - #include - void foo(char* fmt, ...) - { - va_list args; va_start(args, fmt); - vfscanf(stderr, "%i", args); - vscanf("%i", args); - vsnprintf(fmt, 0, "%i", args); - vsscanf(fmt, "%i", args); - snprintf(fmt, 0, "%i"); - }], [], - [glibcxx_cv_c99_stdio=yes], [glibcxx_cv_c99_stdio=no]) - ]) - AC_MSG_RESULT($glibcxx_cv_c99_stdio) + # Check for the existence in of wcstold, etc. + if test x"$ac_has_wchar_h" = xyes && + test x"$ac_has_wctype_h" = xyes; then + AC_MSG_CHECKING([for ISO C99 support in for C++98]) + AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx98, [ + AC_TRY_COMPILE([#include + namespace test + { + using ::wcstold; + using ::wcstoll; + using ::wcstoull; + } + ], [], [glibcxx_cv_c99_wchar_cxx98=yes], [glibcxx_cv_c99_wchar_cxx98=no]) + ]) - # Check for the existence in of lldiv_t, et. al. - AC_MSG_CHECKING([for ISO C99 support in ]) - AC_CACHE_VAL(glibcxx_cv_c99_stdlib, [ - GCC_TRY_COMPILE_OR_LINK( - [#include - volatile float f; - volatile long double ld; - volatile unsigned long long ll; - lldiv_t mydivt;], - [char* tmp; - f = strtof("gnu", &tmp); - ld = strtold("gnu", &tmp); - ll = strtoll("gnu", &tmp, 10); - ll = strtoull("gnu", &tmp, 10); - ll = llabs(10); - mydivt = lldiv(10,1); - ll = mydivt.quot; - ll = mydivt.rem; - ll = atoll("10"); - _Exit(0); - ],[glibcxx_cv_c99_stdlib=yes], [glibcxx_cv_c99_stdlib=no]) - ]) - AC_MSG_RESULT($glibcxx_cv_c99_stdlib) + # Checks for wide character functions that may not be present. + # Injection of these is wrapped with guard macros. + # NB: only put functions here, instead of immediately above, if + # absolutely necessary. + AC_TRY_COMPILE([#include + namespace test { using ::vfwscanf; }], [], + [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], []) - # Check for the existence in of wcstold, etc. - glibcxx_cv_c99_wchar=no; - if test x"$ac_has_wchar_h" = xyes && - test x"$ac_has_wctype_h" = xyes; then - AC_MSG_CHECKING([for ISO C99 support in ]) - AC_TRY_COMPILE([#include - namespace test - { - using ::wcstold; - using ::wcstoll; - using ::wcstoull; - } - ],[],[glibcxx_cv_c99_wchar=yes], [glibcxx_cv_c99_wchar=no]) + AC_TRY_COMPILE([#include + namespace test { using ::vswscanf; }], [], + [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], []) - # Checks for wide character functions that may not be present. - # Injection of these is wrapped with guard macros. - # NB: only put functions here, instead of immediately above, if - # absolutely necessary. - AC_TRY_COMPILE([#include - namespace test { using ::vfwscanf; } ], [], - [AC_DEFINE(HAVE_VFWSCANF,1, - [Defined if vfwscanf exists.])],[]) + AC_TRY_COMPILE([#include + namespace test { using ::vwscanf; }], [], + [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], []) - AC_TRY_COMPILE([#include - namespace test { using ::vswscanf; } ], [], - [AC_DEFINE(HAVE_VSWSCANF,1, - [Defined if vswscanf exists.])],[]) + AC_TRY_COMPILE([#include + namespace test { using ::wcstof; }], [], + [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], []) - AC_TRY_COMPILE([#include - namespace test { using ::vwscanf; } ], [], - [AC_DEFINE(HAVE_VWSCANF,1,[Defined if vwscanf exists.])],[]) + AC_TRY_COMPILE([#include ], + [wint_t t; int i = iswblank(t);], + [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], []) - AC_TRY_COMPILE([#include - namespace test { using ::wcstof; } ], [], - [AC_DEFINE(HAVE_WCSTOF,1,[Defined if wcstof exists.])],[]) + AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx98) + if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then + AC_DEFINE(_GLIBCXX98_USE_C99_WCHAR, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++98.]) + fi + fi - AC_TRY_COMPILE([#include ], - [ wint_t t; int i = iswblank(t);], - [AC_DEFINE(HAVE_ISWBLANK,1, - [Defined if iswblank exists.])],[]) + # Option parsed, now set things appropriately. + if test x"$glibcxx_cv_c99_math_cxx98" = x"no" || + test x"$glibcxx_cv_c99_complex_cxx98" = x"no" || + test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" || + test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" || + test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then + enable_c99=no; + else + AC_DEFINE(_GLIBCXX_USE_C99, 1, + [Define if C99 functions or macros from , , + , , and can be used or exposed.]) + fi - AC_MSG_RESULT($glibcxx_cv_c99_wchar) - fi + gcc_no_link="$ac_save_gcc_no_link" + LIBS="$ac_save_LIBS" + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE - # Option parsed, now set things appropriately. - if test x"$glibcxx_cv_c99_math" = x"no" || - test x"$glibcxx_cv_c99_complex" = x"no" || - test x"$glibcxx_cv_c99_stdio" = x"no" || - test x"$glibcxx_cv_c99_stdlib" = x"no" || - test x"$glibcxx_cv_c99_wchar" = x"no"; then - enable_c99=no; - else - AC_DEFINE(_GLIBCXX_USE_C99, 1, - [Define if C99 functions or macros from , , - , , and can be used or exposed.]) - fi + AC_LANG_SAVE + AC_LANG_CPLUSPLUS - gcc_no_link="$ac_save_gcc_no_link" - LIBS="$ac_save_LIBS" - CXXFLAGS="$ac_save_CXXFLAGS" - AC_LANG_RESTORE + # Use -std=c++11 and test again for C99 library feature in C++11 mode. + # For the reasons given above we use -std=c++11 not -std=gnu++11. + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -std=c++11" + ac_save_LIBS="$LIBS" + ac_save_gcc_no_link="$gcc_no_link" + + if test x$gcc_no_link != xyes; then + # Use -fno-exceptions to that the C driver can link these tests without + # hitting undefined references to personality routines. + CXXFLAGS="$CXXFLAGS -fno-exceptions" + AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [ + # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK + gcc_no_link=yes + ]) + fi + + # Check for the existence of functions used if C99 is enabled. + AC_MSG_CHECKING([for ISO C99 support in for C++11]) + AC_CACHE_VAL(glibcxx_cv_c99_math_cxx11, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + volatile double d1, d2; + volatile int i;], + [i = fpclassify(d1); + i = isfinite(d1); + i = isinf(d1); + i = isnan(d1); + i = isnormal(d1); + i = signbit(d1); + i = isgreater(d1, d2); + i = isgreaterequal(d1, d2); + i = isless(d1, d2); + i = islessequal(d1, d2); + i = islessgreater(d1, d2); + i = islessgreater(d1, d2); + i = isunordered(d1, d2); + ], [glibcxx_cv_c99_math_cxx11=yes], [glibcxx_cv_c99_math_cxx11=no]) + ]) + AC_MSG_RESULT($glibcxx_cv_c99_math_cxx11) + if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then + AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++11.]) + fi + + # Check for the existence of complex math functions. + # This is necessary even though libstdc++ uses the builtin versions + # of these functions, because if the builtin cannot be used, a reference + # to the library function is emitted. + AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no) + AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no) + if test x"$ac_has_complex_h" = x"yes"; then + AC_MSG_CHECKING([for ISO C99 support in for C++11]) + AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx11, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + typedef __complex__ float float_type; + typedef __complex__ double double_type; + typedef __complex__ long double ld_type; + volatile float_type tmpf; + volatile double_type tmpd; + volatile ld_type tmpld; + volatile float f; + volatile double d; + volatile long double ld;], + [f = cabsf(tmpf); + f = cargf(tmpf); + tmpf = ccosf(tmpf); + tmpf = ccoshf(tmpf); + tmpf = cexpf(tmpf); + tmpf = clogf(tmpf); + tmpf = csinf(tmpf); + tmpf = csinhf(tmpf); + tmpf = csqrtf(tmpf); + tmpf = ctanf(tmpf); + tmpf = ctanhf(tmpf); + tmpf = cpowf(tmpf, tmpf); + tmpf = cprojf(tmpf); + d = cabs(tmpd); + d = carg(tmpd); + tmpd = ccos(tmpd); + tmpd = ccosh(tmpd); + tmpd = cexp(tmpd); + tmpd = clog(tmpd); + tmpd = csin(tmpd); + tmpd = csinh(tmpd); + tmpd = csqrt(tmpd); + tmpd = ctan(tmpd); + tmpd = ctanh(tmpd); + tmpd = cpow(tmpd, tmpd); + tmpd = cproj(tmpd); + ld = cabsl(tmpld); + ld = cargl(tmpld); + tmpld = ccosl(tmpld); + tmpld = ccoshl(tmpld); + tmpld = cexpl(tmpld); + tmpld = clogl(tmpld); + tmpld = csinl(tmpld); + tmpld = csinhl(tmpld); + tmpld = csqrtl(tmpld); + tmpld = ctanl(tmpld); + tmpld = ctanhl(tmpld); + tmpld = cpowl(tmpld, tmpld); + tmpld = cprojl(tmpld); + ], [glibcxx_cv_c99_complex_cxx11=yes], [glibcxx_cv_c99_complex_cxx11=no]) + ]) + fi + AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx11) + if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then + AC_DEFINE(_GLIBCXX11_USE_C99_COMPLEX, 1, + [Define if C99 functions in should be used in + for C++11. Using compiler builtins for these functions + requires corresponding C99 library functions to be present.]) + fi + + # Check for the existence in of vscanf, et. al. + AC_MSG_CHECKING([for ISO C99 support in for C++11]) + AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx11, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + #include + void foo(char* fmt, ...) + { + va_list args; va_start(args, fmt); + vfscanf(stderr, "%i", args); + vscanf("%i", args); + vsnprintf(fmt, 0, "%i", args); + vsscanf(fmt, "%i", args); + snprintf(fmt, 0, "%i"); + }], [], + [glibcxx_cv_c99_stdio_cxx11=yes], [glibcxx_cv_c99_stdio_cxx11=no]) + ]) + AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx11) + if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then + AC_DEFINE(_GLIBCXX11_USE_C99_STDIO, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++11.]) + fi + + # Check for the existence in of lldiv_t, et. al. + AC_MSG_CHECKING([for ISO C99 support in for C++11]) + AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx11, [ + GCC_TRY_COMPILE_OR_LINK( + [#include + volatile float f; + volatile long double ld; + volatile unsigned long long ll; + lldiv_t mydivt;], + [char* tmp; + f = strtof("gnu", &tmp); + ld = strtold("gnu", &tmp); + ll = strtoll("gnu", &tmp, 10); + ll = strtoull("gnu", &tmp, 10); + ll = llabs(10); + mydivt = lldiv(10,1); + ll = mydivt.quot; + ll = mydivt.rem; + ll = atoll("10"); + _Exit(0); + ], [glibcxx_cv_c99_stdlib_cxx11=yes], [glibcxx_cv_c99_stdlib_cxx11=no]) + ]) + AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx11) + if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then + AC_DEFINE(_GLIBCXX11_USE_C99_STDLIB, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++11.]) + fi + + # Check for the existence in of wcstold, etc. + if test x"$ac_has_wchar_h" = xyes && + test x"$ac_has_wctype_h" = xyes; then + AC_MSG_CHECKING([for ISO C99 support in for C++11]) + AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx11, [ + AC_TRY_COMPILE([#include + namespace test + { + using ::wcstold; + using ::wcstoll; + using ::wcstoull; + } + ], [], [glibcxx_cv_c99_wchar_cxx11=yes], [glibcxx_cv_c99_wchar_cxx11=no]) + ]) + + # Checks for wide character functions that may not be present. + # Injection of these is wrapped with guard macros. + # NB: only put functions here, instead of immediately above, if + # absolutely necessary. + AC_TRY_COMPILE([#include + namespace test { using ::vfwscanf; }], [], + [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], []) + + AC_TRY_COMPILE([#include + namespace test { using ::vswscanf; }], [], + [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], []) + + AC_TRY_COMPILE([#include + namespace test { using ::vwscanf; }], [], + [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], []) + + AC_TRY_COMPILE([#include + namespace test { using ::wcstof; }], [], + [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], []) + + AC_TRY_COMPILE([#include ], + [wint_t t; int i = iswblank(t);], + [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], []) + + AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx11) + if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then + AC_DEFINE(_GLIBCXX11_USE_C99_WCHAR, 1, + [Define if C99 functions or macros in should be imported + in in namespace std for C++11.]) + fi + fi + + gcc_no_link="$ac_save_gcc_no_link" + LIBS="$ac_save_LIBS" + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE fi AC_MSG_CHECKING([for fully enabled ISO C99 support]) diff --git a/libstdc++-v3/config/locale/dragonfly/c_locale.h b/libstdc++-v3/config/locale/dragonfly/c_locale.h index 5c17cfe..867a404 100644 --- a/libstdc++-v3/config/locale/dragonfly/c_locale.h +++ b/libstdc++-v3/config/locale/dragonfly/c_locale.h @@ -64,7 +64,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __builtin_va_list __args; __builtin_va_start(__args, __fmt); -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); #else const int __ret = __builtin_vsprintf(__out, __fmt, __args); diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h index ee3ef86..fa7629f 100644 --- a/libstdc++-v3/config/locale/generic/c_locale.h +++ b/libstdc++-v3/config/locale/generic/c_locale.h @@ -70,7 +70,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __builtin_va_list __args; __builtin_va_start(__args, __fmt); -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); #else const int __ret = __builtin_vsprintf(__out, __fmt, __args); diff --git a/libstdc++-v3/config/locale/gnu/c_locale.h b/libstdc++-v3/config/locale/gnu/c_locale.h index a1dc3d2..f8ddfeb 100644 --- a/libstdc++-v3/config/locale/gnu/c_locale.h +++ b/libstdc++-v3/config/locale/gnu/c_locale.h @@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __builtin_va_list __args; __builtin_va_start(__args, __fmt); -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); #else const int __ret = __builtin_vsprintf(__out, __fmt, __args); diff --git a/libstdc++-v3/config/os/bsd/dragonfly/os_defines.h b/libstdc++-v3/config/os/bsd/dragonfly/os_defines.h index 2209129..055c5b6 100644 --- a/libstdc++-v3/config/os/bsd/dragonfly/os_defines.h +++ b/libstdc++-v3/config/os/bsd/dragonfly/os_defines.h @@ -30,6 +30,9 @@ // file will come before all others. #define _GLIBCXX_USE_C99 1 +#define _GLIBCXX_USE_C99_STDIO 1 +#define _GLIBCXX_USE_C99_STDLIB 1 +#define _GLIBCXX_USE_C99_WCHAR 1 #define _GLIBCXX_USE_C99_CHECK 1 #define _GLIBCXX_USE_C99_DYNAMIC (!(__ISO_C_VISIBLE >= 1999)) #define _GLIBCXX_USE_C99_LONG_LONG_CHECK 1 diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 35246d9..b3853cd 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -5387,7 +5387,7 @@ _GLIBCXX_END_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#if __cplusplus >= 201103L && defined(_GLIBCXX_USE_C99) +#if __cplusplus >= 201103L #include @@ -5396,6 +5396,7 @@ namespace std _GLIBCXX_VISIBILITY(default) _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_CXX11 +#if _GLIBCXX_USE_C99_STDLIB // 21.4 Numeric Conversions [string.conversions]. inline int stoi(const string& __str, size_t* __idx = 0, int __base = 10) @@ -5434,7 +5435,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 inline long double stold(const string& __str, size_t* __idx = 0) { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); } +#endif // _GLIBCXX_USE_C99_STDLIB +#if _GLIBCXX_USE_C99_STDIO // NB: (v)snprintf vs sprintf. // DR 1261. @@ -5498,8 +5501,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 return __gnu_cxx::__to_xstring(&std::vsnprintf, __n, "%Lf", __val); } +#endif // _GLIBCXX_USE_C99_STDIO -#ifdef _GLIBCXX_USE_WCHAR_T +#if defined(_GLIBCXX_USE_WCHAR_T) && defined(_GLIBCXX_USE_C99_WCHAR) inline int stoi(const wstring& __str, size_t* __idx = 0, int __base = 10) { return __gnu_cxx::__stoa(&std::wcstol, "stoi", __str.c_str(), @@ -5601,13 +5605,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 L"%Lf", __val); } #endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF -#endif +#endif // _GLIBCXX_USE_WCHAR_T && _GLIBCXX_USE_C99_WCHAR _GLIBCXX_END_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#endif /* C++11 && _GLIBCXX_USE_C99 ... */ +#endif /* C++11 */ #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 924f13e..723feb1 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -529,4 +529,40 @@ namespace std #undef min #undef max +// N.B. these _GLIBCXX_USE_C99_XXX macros are defined unconditionally +// so they should be tested with #if not with #ifdef. +#if __cplusplus >= 201103L +# ifndef _GLIBCXX_USE_C99_MATH +# define _GLIBCXX_USE_C99_MATH _GLIBCXX11_USE_C99_MATH +# endif +# ifndef _GLIBCXX_USE_C99_COMPLEX +# define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX11_USE_C99_COMPLEX +# endif +# ifndef _GLIBCXX_USE_C99_STDIO +# define _GLIBCXX_USE_C99_STDIO _GLIBCXX11_USE_C99_STDIO +# endif +# ifndef _GLIBCXX_USE_C99_STDLIB +# define _GLIBCXX_USE_C99_STDLIB _GLIBCXX11_USE_C99_STDLIB +# endif +# ifndef _GLIBCXX_USE_C99_WCHAR +# define _GLIBCXX_USE_C99_WCHAR _GLIBCXX11_USE_C99_WCHAR +# endif +#else +# ifndef _GLIBCXX_USE_C99_MATH +# define _GLIBCXX_USE_C99_MATH _GLIBCXX98_USE_C99_MATH +# endif +# ifndef _GLIBCXX_USE_C99_COMPLEX +# define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX98_USE_C99_COMPLEX +# endif +# ifndef _GLIBCXX_USE_C99_STDIO +# define _GLIBCXX_USE_C99_STDIO _GLIBCXX98_USE_C99_STDIO +# endif +# ifndef _GLIBCXX_USE_C99_STDLIB +# define _GLIBCXX_USE_C99_STDLIB _GLIBCXX98_USE_C99_STDLIB +# endif +# ifndef _GLIBCXX_USE_C99_WCHAR +# define _GLIBCXX_USE_C99_WCHAR _GLIBCXX98_USE_C99_WCHAR +# endif +#endif + // End of prewritten config; the settings discovered at configure time follow. diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index bd58771..2db2d83 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -959,13 +959,13 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL } // The following code uses vsnprintf (or vsprintf(), when - // _GLIBCXX_USE_C99 is not defined) to convert floating point values - // for insertion into a stream. An optimization would be to replace - // them with code that works directly on a wide buffer and then use - // __pad to do the padding. It would be good to replace them anyway - // to gain back the efficiency that C++ provides by knowing up front - // the type of the values to insert. Also, sprintf is dangerous - // since may lead to accidental buffer overruns. This + // _GLIBCXX_USE_C99_STDIO is not defined) to convert floating point + // values for insertion into a stream. An optimization would be to + // replace them with code that works directly on a wide buffer and + // then use __pad to do the padding. It would be good to replace + // them anyway to gain back the efficiency that C++ provides by + // knowing up front the type of the values to insert. Also, sprintf + // is dangerous since may lead to accidental buffer overruns. This // implementation follows the C++ standard fairly directly as // outlined in 22.2.2.2 [lib.locale.num.put] template @@ -992,7 +992,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL char __fbuf[16]; __num_base::_S_format_float(__io, __fbuf, __mod); -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO // Precision is always used except for hexfloat format. const bool __use_prec = (__io.flags() & ios_base::floatfield) != ios_base::floatfield; diff --git a/libstdc++-v3/include/bits/locale_facets_nonio.tcc b/libstdc++-v3/include/bits/locale_facets_nonio.tcc index 2e73b5d..631ef53 100644 --- a/libstdc++-v3/include/bits/locale_facets_nonio.tcc +++ b/libstdc++-v3/include/bits/locale_facets_nonio.tcc @@ -578,7 +578,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 { const locale __loc = __io.getloc(); const ctype<_CharT>& __ctype = use_facet >(__loc); -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO // First try a buffer perhaps big enough. int __cs_size = 64; char* __cs = static_cast(__builtin_alloca(__cs_size)); @@ -751,7 +751,7 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 case 'S': // Seconds. [tm_sec] // [00, 60] in C99 (one leap-second), [00, 61] in C89. -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99 __beg = _M_extract_num(__beg, __end, __tm->tm_sec, 0, 60, 2, #else __beg = _M_extract_num(__beg, __end, __tm->tm_sec, 0, 61, 2, diff --git a/libstdc++-v3/include/c_compatibility/math.h b/libstdc++-v3/include/c_compatibility/math.h index d6acb6d..7729896 100644 --- a/libstdc++-v3/include/c_compatibility/math.h +++ b/libstdc++-v3/include/c_compatibility/math.h @@ -56,7 +56,7 @@ using std::fabs; using std::floor; using std::fmod; -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_MATH using std::fpclassify; using std::isfinite; using std::isinf; diff --git a/libstdc++-v3/include/c_compatibility/wchar.h b/libstdc++-v3/include/c_compatibility/wchar.h index 06b5d47..3bc12d0 100644 --- a/libstdc++-v3/include/c_compatibility/wchar.h +++ b/libstdc++-v3/include/c_compatibility/wchar.h @@ -103,7 +103,7 @@ using std::wmemmove; using std::wmemset; using std::wcsftime; -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR using std::wcstold; using std::wcstoll; using std::wcstoull; diff --git a/libstdc++-v3/include/c_global/cstdio b/libstdc++-v3/include/c_global/cstdio index d1c958b..486cee9 100644 --- a/libstdc++-v3/include/c_global/cstdio +++ b/libstdc++-v3/include/c_global/cstdio @@ -146,7 +146,7 @@ namespace std using ::vsprintf; } // namespace -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO #undef snprintf #undef vfscanf @@ -189,6 +189,6 @@ namespace std using ::__gnu_cxx::vsscanf; } // namespace std -#endif // _GLIBCXX_USE_C99 +#endif // _GLIBCXX_USE_C99_STDIO #endif diff --git a/libstdc++-v3/include/c_global/cstdlib b/libstdc++-v3/include/c_global/cstdlib index 7e9bb30..a2f44fc 100644 --- a/libstdc++-v3/include/c_global/cstdlib +++ b/libstdc++-v3/include/c_global/cstdlib @@ -195,7 +195,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB #undef _Exit #undef llabs @@ -266,7 +266,7 @@ namespace std using ::__gnu_cxx::strtold; } // namespace std -#endif // _GLIBCXX_USE_C99 +#endif // _GLIBCXX_USE_C99_STDLIB #endif // !_GLIBCXX_HOSTED diff --git a/libstdc++-v3/include/c_global/cwchar b/libstdc++-v3/include/c_global/cwchar index dddb409..1571463 100644 --- a/libstdc++-v3/include/c_global/cwchar +++ b/libstdc++-v3/include/c_global/cwchar @@ -232,7 +232,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR #undef wcstold #undef wcstoll @@ -289,7 +289,7 @@ namespace std using std::vwscanf; #endif -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR using std::wcstold; using std::wcstoll; using std::wcstoull; diff --git a/libstdc++-v3/include/c_std/cstdio b/libstdc++-v3/include/c_std/cstdio index 37f01ca..b7860f9 100644 --- a/libstdc++-v3/include/c_std/cstdio +++ b/libstdc++-v3/include/c_std/cstdio @@ -144,7 +144,7 @@ namespace std using ::vsprintf; } // namespace std -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO #undef snprintf #undef vfscanf diff --git a/libstdc++-v3/include/c_std/cstdlib b/libstdc++-v3/include/c_std/cstdlib index 0bd7058..7b69884 100644 --- a/libstdc++-v3/include/c_std/cstdlib +++ b/libstdc++-v3/include/c_std/cstdlib @@ -192,7 +192,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB #undef _Exit #undef llabs @@ -263,7 +263,7 @@ namespace std using ::__gnu_cxx::strtold; } // namespace std -#endif // _GLIBCXX_USE_C99 +#endif // _GLIBCXX_USE_C99_STDLIB #endif // !_GLIBCXX_HOSTED diff --git a/libstdc++-v3/include/c_std/cwchar b/libstdc++-v3/include/c_std/cwchar index aa1b2fa..5aade7f 100644 --- a/libstdc++-v3/include/c_std/cwchar +++ b/libstdc++-v3/include/c_std/cwchar @@ -228,7 +228,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR #undef wcstold #undef wcstoll diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index 68acd57..8732bd3 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -2680,7 +2680,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99)) +#if __cplusplus >= 201103L #include @@ -2688,6 +2688,7 @@ namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#if _GLIBCXX_USE_C99_STDLIB // 21.4 Numeric Conversions [string.conversions]. inline int stoi(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) @@ -2726,7 +2727,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline long double stold(const __vstring& __str, std::size_t* __idx = 0) { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); } +#endif // _GLIBCXX_USE_C99_STDLIB +#if _GLIBCXX_USE_C99_STDIO // NB: (v)snprintf vs sprintf. // DR 1261. @@ -2789,8 +2792,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, "%Lf", __val); } +#endif // _GLIBCXX_USE_C99_STDIO -#ifdef _GLIBCXX_USE_WCHAR_T +#if defined(_GLIBCXX_USE_WCHAR_T) && defined(_GLIBCXX_USE_C99_WCHAR) inline int stoi(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) { return __gnu_cxx::__stoa(&std::wcstol, "stoi", __str.c_str(), @@ -2890,8 +2894,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, L"%Lf", __val); } -#endif -#endif +#endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF +#endif // _GLIBCXX_USE_WCHAR_T && _GLIBCXX_USE_C99_WCHAR _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 5ed4fd5..f1d3b79 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -995,7 +995,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION complex<_Tp> pow(const complex<_Tp>& __x, const _Tp& __y) { -#ifndef _GLIBCXX_USE_C99_COMPLEX +#if ! _GLIBCXX_USE_C99_COMPLEX if (__x == _Tp()) return _Tp(); #endif @@ -1831,7 +1831,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION arg(_Tp __x) { typedef typename __gnu_cxx::__promote<_Tp>::__type __type; -#if (_GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) +#if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L) : __type(); #else diff --git a/libstdc++-v3/include/tr1/cstdio b/libstdc++-v3/include/tr1/cstdio index 7681823..b8fc04f 100644 --- a/libstdc++-v3/include/tr1/cstdio +++ b/libstdc++-v3/include/tr1/cstdio @@ -33,7 +33,7 @@ #include -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO namespace std _GLIBCXX_VISIBILITY(default) { diff --git a/libstdc++-v3/include/tr1/cstdlib b/libstdc++-v3/include/tr1/cstdlib index c3c65eb..35a9133 100644 --- a/libstdc++-v3/include/tr1/cstdlib +++ b/libstdc++-v3/include/tr1/cstdlib @@ -35,7 +35,7 @@ #if _GLIBCXX_HOSTED -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB namespace std _GLIBCXX_VISIBILITY(default) { @@ -65,7 +65,7 @@ namespace tr1 } } -#endif // _GLIBCXX_USE_C99 +#endif // _GLIBCXX_USE_C99_STDLIB #endif // _GLIBCXX_HOSTED diff --git a/libstdc++-v3/include/tr1/cwchar b/libstdc++-v3/include/tr1/cwchar index 10772ee..0db2262 100644 --- a/libstdc++-v3/include/tr1/cwchar +++ b/libstdc++-v3/include/tr1/cwchar @@ -52,7 +52,7 @@ namespace tr1 using std::vwscanf; #endif -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR using std::wcstold; using std::wcstoll; using std::wcstoull; diff --git a/libstdc++-v3/include/tr1/stdlib.h b/libstdc++-v3/include/tr1/stdlib.h index 310c7bc..5e826d6 100644 --- a/libstdc++-v3/include/tr1/stdlib.h +++ b/libstdc++-v3/include/tr1/stdlib.h @@ -33,7 +33,7 @@ #if _GLIBCXX_HOSTED -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB using std::tr1::atoll; using std::tr1::strtoll; diff --git a/libstdc++-v3/src/c++98/locale_facets.cc b/libstdc++-v3/src/c++98/locale_facets.cc index 071f79e..28b6f3a 100644 --- a/libstdc++-v3/src/c++98/locale_facets.cc +++ b/libstdc++-v3/src/c++98/locale_facets.cc @@ -72,7 +72,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ios_base::fmtflags __fltfield = __flags & ios_base::floatfield; -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO // Precision is always used except for hexfloat format. if (__fltfield != (ios_base::fixed | ios_base::scientific)) #endif @@ -89,7 +89,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION *__fptr++ = 'f'; else if (__fltfield == ios_base::scientific) *__fptr++ = (__flags & ios_base::uppercase) ? 'E' : 'e'; -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO else if (__fltfield == (ios_base::fixed | ios_base::scientific)) *__fptr++ = (__flags & ios_base::uppercase) ? 'A' : 'a'; #endif diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/60612-terminate.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/60612-terminate.cc index 5f0a4bf..1a53c06 100644 --- a/libstdc++-v3/testsuite/18_support/exception_ptr/60612-terminate.cc +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/60612-terminate.cc @@ -23,7 +23,7 @@ #include #include -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB void terminate() { _Exit(0); } void f() noexcept @@ -39,7 +39,7 @@ void f() noexcept int main() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB f(); #endif return 0; diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc index ed3930a..3f8e08d 100644 --- a/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc @@ -23,7 +23,7 @@ #include #include -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB void unexpected() { _Exit(0); } void f() throw() @@ -39,7 +39,7 @@ void f() throw() int main() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB f(); #endif } diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc index c270d76..ea284cc 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc index 2bb7aea..fd54d57 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc index 24aceb6..8cd0ea1 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc index bc50156..9be3f39 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc index 1461adb..7d9e414 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc index cc91c24..2927da3 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc index 6c26c2bb..256cee5 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc index 91b6479..e102c6a 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc @@ -29,7 +29,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = false; using namespace std; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc index e36c30e..467bd9f 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc @@ -27,7 +27,7 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR bool test __attribute__((unused)) = true; using namespace std; diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/13943.cc b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/13943.cc index 33f8000..50c6b32 100644 --- a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/13943.cc +++ b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/13943.cc @@ -19,7 +19,7 @@ #include #include -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB // libstdc++/13943 void test01() { @@ -36,7 +36,7 @@ void test01() int main() { -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB test01(); #endif return 0; diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/types_std_c++0x.cc b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/types_std_c++0x.cc index 0511043..bfcbe9a 100644 --- a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/types_std_c++0x.cc +++ b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/types_std_c++0x.cc @@ -24,10 +24,10 @@ void test01() { -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB typedef std::lldiv_t my_lldiv_t; - + #endif } diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 9a6726c..6a62dfd 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -1614,7 +1614,7 @@ proc check_v3_target_string_conversions { } { set f [open $src "w"] puts $f "#include " - puts $f "#if !defined(_GLIBCXX_USE_C99) || defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)" + puts $f "#if !(_GLIBCXX_USE_C99_STDIO && _GLIBCXX_USE_C99_STDLIB && _GLIBCXX_USE_C99_WCHAR) || defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)" puts $f "# error No string conversions" puts $f "#endif" close $f diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/templates.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/templates.cc index b75fda2..ac8933c 100644 --- a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/templates.cc +++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/templates.cc @@ -23,7 +23,7 @@ #include -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_MATH #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC template diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdio/functions.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdio/functions.cc index 0c913e0..5a9eb6c 100644 --- a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdio/functions.cc +++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdio/functions.cc @@ -30,7 +30,7 @@ void test01(int dummy, ...) std::va_list ap; va_start(ap, dummy); -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO char* s = 0; const char* cs = 0; diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/functions.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/functions.cc index cfa748d..dfa08ef 100644 --- a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/functions.cc +++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/functions.cc @@ -27,7 +27,7 @@ void test01() { -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB long long i = 0; const char* s = 0; diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/types_std_tr1.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/types_std_tr1.cc index 002b6a5..1252463 100644 --- a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/types_std_tr1.cc +++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cstdlib/types_std_tr1.cc @@ -27,10 +27,10 @@ void test01() { -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDLIB typedef std::tr1::lldiv_t my_lldiv_t; - + #endif } diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cwchar/functions.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cwchar/functions.cc index b964661..c745b19 100644 --- a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cwchar/functions.cc +++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cwchar/functions.cc @@ -67,7 +67,7 @@ void test01(int dummy, ...) ret3 = ret3; // Suppress unused warning. #endif -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_WCHAR const wchar_t* nptr2 = 0; wchar_t** endptr2 = 0; diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h index 44aef11..ddcbdcc 100644 --- a/libstdc++-v3/testsuite/util/testsuite_fs.h +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h @@ -83,7 +83,7 @@ namespace __gnu_test p = tmp; #else char buf[64]; -#if _GLIBCXX_USE_C99 +#if _GLIBCXX_USE_C99_STDIO std::snprintf(buf, 64, "filesystem-ts-test.%lu", (unsigned long)::getpid()); #else std::sprintf(buf, "filesystem-ts-test.%lu", (unsigned long)::getpid());