[前][次][番号順一覧][スレッド一覧]

ruby-changes:45689

From: nobu <ko1@a...>
Date: Fri, 3 Mar 2017 13:51:38 +0900 (JST)
Subject: [ruby-changes:45689] nobu:r57762 (trunk): broken mingw

nobu	2017-03-03 13:51:34 +0900 (Fri, 03 Mar 2017)

  New Revision: 57762

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57762

  Log:
    broken mingw
    
    * configure.in: check whether frexp and modf are broken.
    
    * include/ruby/win32.h (frexp, modf): ignore bad declarations when
      compiling as C++.  [ruby-core:79859] [Bug #13267]

  Modified files:
    trunk/configure.in
    trunk/include/ruby/win32.h
Index: include/ruby/win32.h
===================================================================
--- include/ruby/win32.h	(revision 57761)
+++ include/ruby/win32.h	(revision 57762)
@@ -753,7 +753,8 @@ uintptr_t rb_w32_asynchronize(asynchrono https://github.com/ruby/ruby/blob/trunk/include/ruby/win32.h#L753
 
 RUBY_SYMBOL_EXPORT_END
 
-#ifdef __MINGW_ATTRIB_PURE
+#if (defined(__MINGW64_VERSION_MAJOR) || defined(__MINGW64__)) && !defined(__cplusplus)
+#ifdef RUBY_MINGW64_BROKEN_FREXP_MODF
 /* License: Ruby's */
 /* get rid of bugs in math.h of mingw */
 #define frexp(_X, _Y) __extension__ ({\
@@ -771,13 +772,6 @@ RUBY_SYMBOL_EXPORT_END https://github.com/ruby/ruby/blob/trunk/include/ruby/win32.h#L772
 })
 #endif
 
-#if defined(__cplusplus)
-#if 0
-{ /* satisfy cc-mode */
-#endif
-}  /* extern "C" { */
-#endif
-
 #if defined(__MINGW64__)
 /*
  * Use powl() instead of broken pow() of x86_64-w64-mingw32.
@@ -792,8 +786,14 @@ rb_w32_pow(double x, double y) https://github.com/ruby/ruby/blob/trunk/include/ruby/win32.h#L786
 #elif defined(__MINGW64_VERSION_MAJOR)
 double rb_w32_pow(double x, double y);
 #endif
-#if defined(__MINGW64_VERSION_MAJOR) || defined(__MINGW64__)
 #define pow rb_w32_pow
 #endif
 
+#if defined(__cplusplus)
+#if 0
+{ /* satisfy cc-mode */
+#endif
+}  /* extern "C" { */
+#endif
+
 #endif /* RUBY_WIN32_H */
Index: configure.in
===================================================================
--- configure.in	(revision 57761)
+++ configure.in	(revision 57762)
@@ -940,6 +940,33 @@ if test "$GCC" = yes; then https://github.com/ruby/ruby/blob/trunk/configure.in#L940
       # various  headers.  Most frequent  situation is  the use  of //
       # comments.   We  bypass  ANSI   C  mode  for  them.   Otherwise
       # extension libs cannot include those headers.
+
+      # Since math.h in some mingw64 wrongly delcares frexp and modf
+      # to be pure, the variables pointed by the second arguments are
+      # considered uninitialized unexpectedly.
+      AC_CACHE_CHECK([whether frexp and modf are broken],
+	rb_cv_mingw64_broken_frexp_modf,
+	[
+	  save_CFLAGS="$CFLAGS"
+	  if test "$particular_werror_flags" = "yes"; then
+	    CFLAGS="$CFLAGS -Werror=uninitialized"
+	  else
+	    CFLAGS="$CFLAGS -Werror -Wuninitialized"
+	  fi
+	  AC_TRY_COMPILE([@%:@include <math.h>
+	    int foo(double x)
+	    {
+	      int exp;
+	      frexp(x, &exp);
+	      return exp;
+	    }], [if (foo(0.0)) return 1;],
+	    [rb_cv_mingw64_broken_frexp_modf=no],
+	    [rb_cv_mingw64_broken_frexp_modf=yes])
+	  CFLAGS="$save_CFLAGS"
+	])
+      if test "$rb_cv_mingw64_broken_frexp_modf" = yes; then
+	AC_DEFINE(RUBY_MINGW64_BROKEN_FREXP_MODF)
+      fi
     ],
     [cygwin*|darwin*|netbsd*|nacl], [
       # need lgamma_r(), finite()

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]