bug-gnulib
[Top][All Lists]
Advanced

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

[PATCH v2 1/2] stdio: fix probe on mingw under gcc 5.1


From: Eric Blake
Subject: [PATCH v2 1/2] stdio: fix probe on mingw under gcc 5.1
Date: Tue, 26 May 2015 15:30:35 -0600

Per https://gcc.gnu.org/gcc-5/porting_to.html, gcc 5.1 intentionally
changed the preprocessor to emit multiple lines, rather than one
line, when expanding text that includes literal markers combined with
a macro expansion obtained from a header.  This in turn breaks the
probe for whether mingw headers support GNU-style "lld" for PRIdMAX,
as the probe text was no longer on one line.

This patch changes from grepping preprocessor output (with its
indeterminate layout due to differences in preprocessors) to instead
using a compile-time check of the length of the macro expansion.

It feels a bit gross, but the grossness is limited to mingw, which
is the only platform where using __gnu_printf__ instead of __printf__
will make a difference.

Based on a report by Suren Hajyan.

* m4/stdio_h.m4 (gl_STDIO_H): Change to compile test, to work
around new gcc preprocessor rules.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog     |  6 ++++++
 m4/stdio_h.m4 | 19 ++++++++++++-------
 2 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 960eec3..a204cac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-26  Eric Blake  <address@hidden>
+
+       stdio: fix probe on mingw under gcc 5.1
+       * m4/stdio_h.m4 (gl_STDIO_H): Change to compile test, to work
+       around new gcc preprocessor rules.
+
 2015-05-07  Glenn Morris  <address@hidden>

        gitlog-to-changelog: parse "Tiny-change"
diff --git a/m4/stdio_h.m4 b/m4/stdio_h.m4
index e0c4bde..ffaf10c 100644
--- a/m4/stdio_h.m4
+++ b/m4/stdio_h.m4
@@ -1,4 +1,4 @@
-# stdio_h.m4 serial 44
+# stdio_h.m4 serial 45
 dnl Copyright (C) 2007-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,
@@ -15,15 +15,20 @@ AC_DEFUN([gl_STDIO_H],
   dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and
   dnl inttypes.h behave like gnu instead of system; we must give our
   dnl printf wrapper the right attribute to match.
-  AC_CACHE_CHECK([whether inttypes macros match system or gnu printf],
+  AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros],
     [gl_cv_func_printf_attribute_flavor],
-    [AC_EGREP_CPP([findme .(ll|j)d. findme],
-      [#define __STDC_FORMAT_MACROS 1
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+       #define __STDC_FORMAT_MACROS 1
        #include <stdio.h>
        #include <inttypes.h>
-       findme PRIdMAX findme
-      ], [gl_cv_func_printf_attribute_flavor=gnu],
-      [gl_cv_func_printf_attribute_flavor=system])])
+       /* For non-mingw systems, compilation will trivially succeed.
+          For mingw, compilation will succeed for older mingw (system
+          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+       #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+       #endif
+      ]])], [gl_cv_func_printf_attribute_flavor=system],
+      [gl_cv_func_printf_attribute_flavor=gnu])])
   if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
     AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1],
       [Define to 1 if printf and friends should be labeled with
-- 
2.1.0




reply via email to

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