bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Re: stdint.h, C++ and __STDC_LIMIT_MACROS


From: Pedro Alves
Subject: Re: [PATCH] Re: stdint.h, C++ and __STDC_LIMIT_MACROS
Date: Tue, 03 Nov 2015 14:55:34 +0000
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

On 11/03/2015 02:45 PM, Pedro Alves wrote:
> On 11/03/2015 02:32 AM, Paul Eggert wrote:
>> Pedro Alves wrote:
>>> Instead of trying to detect the right types, detect
>>> good-enough-pre-C++11 stdint.h and in such case make the substitute
>>> stdint.h just wrap the system's stdint.h with
>>> __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
>>

>> Instead, how about just adding the necessary #defines for 
>> __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS to config.h if they are needed to 
>> fix 
>> the bug?  Then we can leave stdint.h alone (perhaps not even build stdint.h 
>> at all).

> I'll update the patch in that direction.

Here's the updated patch.

-------------------
>From e6f4dc6da7d2ef60a5647e4d1bc673572011a463 Mon Sep 17 00:00:00 2001
From: Pedro Alves <address@hidden>
Date: Mon, 2 Nov 2015 14:52:18 +0000
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
substituing 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:

~~~
/* 7.18.1.4. Integer types capable of holding object pointers */

#undef intptr_t
#undef uintptr_t
typedef long int gl_intptr_t;
typedef unsigned long int gl_uintptr_t;
#define intptr_t gl_intptr_t
#define uintptr_t gl_uintptr_t
~~~

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.
---
 m4/stdint.m4 | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/m4/stdint.m4 b/m4/stdint.m4
index 4011a49..4244c05 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-2015 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 <stdint.h>
 /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
 #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 <stdint.h>
 ]
 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 <stdint.h> 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 <stdint.h>
+]
+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 <stdint.h> predates C++11.])
+      AC_DEFINE([__STDC_LIMIT_MACROS], [1],
+                [Define to 1 if the system <stdint.h> predates C++11.])
+    fi
     STDINT_H=
   else
     dnl Check for <sys/inttypes.h>, and for
-- 
1.9.3





reply via email to

[Prev in Thread] Current Thread [Next in Thread]