From 906ce31873f4036cd7700cad78aa799a1f221d8f Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Sun, 3 Apr 2016 22:48:22 -0700 Subject: [PATCH] stdint: detect good enough pre-C++11 stdint.h in C++ mode When gnulib is configured in C++ mode for a system with a working C99 implementation of stdint.h that predates C++11, gnulib ends up substituting stdint.h anyway. This works on most targets, but on e.g., 64-bit MinGW, it doesn't, as gnulib's substitute assumes LP64, while MinGW is LLP64. Instead of trying to detect the right types, detect good-enough-pre-C++11 stdint.h and in such case define __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS in config.h. * m4/stdint.m4 (gl_STDINT_H): Always define __STDC_CONSTANT_MACROS / __STDC_LIMIT_MACROS while checking whether the system stdint.h conforms to C99. If it does, check whether it hides symbols behind the __STDC_{CONSTANT|LIMIT}_MACROS macros. Then if it does, define those macros in config.h. --- ChangeLog | 16 ++++++++++++++++ m4/stdint.m4 | 29 ++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0bdbf57406..980cfaae5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2016-04-03 Pedro Alves + + stdint: detect good enough pre-C++11 stdint.h in C++ mode + When gnulib is configured in C++ mode for a system with a working C99 + implementation of stdint.h that predates C++11, gnulib ends up + substituting stdint.h anyway. This works on most targets, but on e.g., + 64-bit MinGW, it doesn't, as gnulib's substitute assumes LP64, while + MinGW is LLP64. Instead of trying to detect the right types, detect + good-enough-pre-C++11 stdint.h and in such case define + __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS in config.h. + * m4/stdint.m4 (gl_STDINT_H): Always define __STDC_CONSTANT_MACROS + / __STDC_LIMIT_MACROS while checking whether the system stdint.h + conforms to C99. If it does, check whether it hides symbols + behind the __STDC_{CONSTANT|LIMIT}_MACROS macros. Then if it + does, define those macros in config.h. + 2016-04-03 Paul Eggert argp: merge changes from glibc diff --git a/m4/stdint.m4 b/m4/stdint.m4 index 0f40ce803b..0b4b9060db 100644 --- a/m4/stdint.m4 +++ b/m4/stdint.m4 @@ -1,4 +1,4 @@ -# stdint.m4 serial 43 +# stdint.m4 serial 44 dnl Copyright (C) 2001-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -70,6 +70,8 @@ AC_DEFUN_ONCE([gl_STDINT_H], AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#define __STDC_CONSTANT_MACROS 1 +#define __STDC_LIMIT_MACROS 1 #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) @@ -218,6 +220,8 @@ struct s { AC_RUN_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#define __STDC_CONSTANT_MACROS 1 +#define __STDC_LIMIT_MACROS 1 #include ] gl_STDINT_INCLUDES @@ -279,6 +283,29 @@ static const char *macro_values[] = ]) fi if test "$gl_cv_header_working_stdint_h" = yes; then + dnl Now see whether the system works without + dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined. + AC_CACHE_CHECK([whether stdint.h predates C++11], + [gl_cv_header_stdint_predates_cxx11_h], + [gl_cv_header_stdint_predates_cxx11_h=yes + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#include +] +gl_STDINT_INCLUDES +[ +intmax_t im = INTMAX_MAX; +int32_t i32 = INT32_C (0x7fffffff); + ]])], + [gl_cv_header_stdint_predates_cxx11_h=no])]) + + if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then + AC_DEFINE([__STDC_CONSTANT_MACROS], [1], + [Define to 1 if the system predates C++11.]) + AC_DEFINE([__STDC_LIMIT_MACROS], [1], + [Define to 1 if the system predates C++11.]) + fi STDINT_H= else dnl Check for , and for -- 2.39.5