New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MinGW.org builds - infnan and pack test failures due to LD handling #15453
Comments
From @dcollinsnHello, I have built perl using long doubles with the following Win32 tools: W:\buildbot\windows1\win32-mingw-ld\build>gcc -v W:\buildbot\windows1\win32-mingw-ld\build>perl.exe -Ilib -V Platform: Characteristics of this binary (from libperl): I have test failures: # Failed test 310 - 9**9**9 is Inf at op/infnan.t line 249 <SNIP> op/pack.t .......................................................... The first part is caused by long doubles: W:\buildbot\windows1\win32-mingw-ld\build>..\..\win32-mingw\build\perl.exe -le "print 9**9**9" The second part is probably your typical rounding error? -- |
From @sisyphus-----Original Message----- # New Ticket Created by Dan Collins
[snip]
Well .... (9**9)**9 is not Inf, but it's not 1.18973149535723177e+4932 I think this must be a bug with the specific compiler/runtime that you've If, in infnan.t, you replace the occurrences of 9**9**9 with 9**(9**9), does
Dunno - those failures have been a fixture of all 'long double' mingw builds Cheers, |
The RT System itself - Status changed from 'new' to 'open' |
From zefram@fysh.orgDan Collins wrote:
That's the maximum representable finite value in this floating point -zefram |
From @dcollinsnThe binary representation of this number is: ff.ff.ff.ff.ff.ff.ff.ff.fe.7f which is the largest possible extended precision value, and is not inf. 0.0.0.0.0.0.0.80.ff.7f Interestingly, 2*9**9**9 does properly give inf. So perhaps powl() is perl -le "print (9**9**9)" perl -le "print (9**9**9)**2" perl -le "print (9**9**9)*2" perl -le "print 2*(9**9**9)" Even with plain C: powl(9, powl(9, 9)) = 1.189731e+4932 MinGW-w64 gets it right: powl(9, powl(9, 9)) = inf Perhaps worth a note in README.win32, otherwise just close? On Sun, Jul 17, 2016 at 12:14 AM, Zefram via RT <perlbug-followup@perl.org>
|
From zefram@fysh.orgDan Collins wrote:
That's useful information.
Precedence problem. You should get into the habit of "-lwe": $ perl -lwe 'print (9**9**9)*2'
I would strongly expect the multiplication to give the same result either
That's weird. Failing to ever produce Inf would be understandable;
Can we find a working powl()? -zefram |
From @dcollinsnOn Sat Jul 16 22:31:37 2016, zefram@fysh.org wrote:
I tried this experiment. I pulled the powl() out of mingw-w64, changed a few things to get it to interact with mingw.org without also needing to grab 20 different header files, and added it to win32.c/h. I obviously didn't do so correctly, because extensions aren't building properly: g++ POSIX.def -o ..\..\lib\auto\POSIX\POSIX.dll -mdll -s -L"c:\perl\lib\CORE" -L"C:\MinGW\lib" POSIX.o "..\..\lib\CORE\libperl525.a" -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 -Wl,--enable-auto-image-base However, the generated miniperl seems to be cooperating: W:\buildbot\windows1\win32ld\build>miniperl.exe -wle "print 9**9**9" W:\buildbot\windows1\win32ld\build>miniperl.exe -V W:\buildbot\windows1\win32ld\build>miniperl.exe -Ilib -V Platform: Characteristics of this binary (from libperl): (I'm also not entirely confident in the error handling in this patch, as I had to futz around with that a bit - the code I lifted used something called __mingw_raise_matherr, which doesn't seem to have an equivalent in mingw.org.) dmake minitest reports an expected error in re/reg_mesg.t, a test in op/glob.t that I'm not sure about (Failed test 16 - ~ works at op/glob.t line 104), and still fails op/pack.t tests 13177 and 13180. The op/infnan.t errors are fixed. -- |
From @dcollinsn0001-RT-128643.patchFrom 46fe0a3489d04c34dc7b150a2d0b5090476dc29c Mon Sep 17 00:00:00 2001
From: Dan Collins <dcollinsn@gmail.com>
Date: Sun, 17 Jul 2016 12:37:46 -0400
Subject: [PATCH] RT 128643
---
win32/win32.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
win32/win32.h | 8 ++++
2 files changed, 157 insertions(+)
diff --git a/win32/win32.c b/win32/win32.c
index 6ac73e2..408d455 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4795,3 +4795,152 @@ Perl_sys_intern_dup(pTHX_ struct interp_intern *src, struct interp_intern *dst)
}
# endif /* USE_ITHREADS */
#endif /* HAVE_INTERP_INTERN */
+
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32__)
+/* NAN builtins for gcc, as they are not part of math.h */
+#ifndef NANF
+#define NANF __builtin_nanf ("")
+#endif
+#ifndef NANL
+#define NANL __builtin_nanl ("")
+#endif
+
+
+#ifndef _SET_ERRNO
+#define _SET_ERRNO(x) errno = (x)
+#endif
+
+
+static long double
+internal_modf (long double value, long double *iptr)
+{
+ long double int_part = (long double) 0.0;
+#ifdef _WIN64
+ asm ("pushq %%rax\n\tsubq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n"
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\npopq %%rax" : "=t" (int_part) : "0" (value)); /* round */
+#else
+ asm ("push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n"
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value)); /* round */
+#endif
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? (long double) 0.0 : value - int_part);
+}
+
+long double __powil (long double x, int n);
+
+long double
+my_powl (long double x, long double y)
+{
+ int x_class = fpclassify (x);
+ int y_class = fpclassify (y);
+ long odd_y = 0;
+ long double d, rslt;
+
+ if (y_class == FP_ZERO || x == 1.0L)
+ return 1.0L;
+ else if (x_class == FP_NAN || y_class == FP_NAN)
+ {
+ rslt = (signbit(x) ? -NANL : NANL);
+ _SET_ERRNO (EDOM);
+ return rslt;
+ }
+ else if (x_class == FP_ZERO)
+ {
+ if (y_class == FP_INFINITE)
+ return (signbit(y) ? HUGE_VALL : 0.0L);
+
+ if (signbit(x) && internal_modf (y, &d) != 0.0)
+ {
+ return signbit (y) ? (1.0 / -x) : 0.0L;
+ }
+ odd_y = (internal_modf (ldexpl (y, -1), &d) != 0.0) ? 1 : 0;
+ if (!signbit(y))
+ {
+ if (!odd_y || !signbit (x))
+ return 0.0L;
+ return -0.0L;
+ }
+
+ if (!odd_y || !signbit (x))
+ return HUGE_VALL;
+ return (signbit(x) ? -HUGE_VALL : HUGE_VALL);
+ }
+ else if (y_class == FP_INFINITE)
+ {
+ long double a_x;
+
+ if (x_class == FP_INFINITE)
+ return (signbit (y) ? 0.0L : HUGE_VALL);
+ a_x = (signbit (x) ? -x : x);
+ if (a_x == 1.0)
+ return 1.0L;
+ if (a_x > 1.0)
+ return (signbit (y) == 0 ? HUGE_VALL : 0.0L);
+ return (!signbit (y) ? 0.0L : HUGE_VALL);
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ /* pow (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y. */
+ if (signbit(x) && internal_modf (y, &d) != 0.0)
+ {
+ return signbit(y) ? 1.0 / -x : -x;
+ }
+ odd_y = (internal_modf (ldexpl (y, -1), &d) != 0.0) ? 1 : 0;
+ /* pow( -inf, y) = +0 for y<0 and not an odd integer, */
+ if (signbit(x) && signbit(y) && !odd_y)
+ return 0.0L;
+ /* pow( -inf, y) = -inf for y an odd integer > 0. */
+ if (signbit(x) && !signbit(y) && odd_y)
+ return -HUGE_VALL;
+ /* pow( -inf, y) = +inf for y>0 and not an odd integer. */
+ if (signbit(x) && !signbit(y) && !odd_y)
+ return HUGE_VALL;
+ /* pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0. */
+ if (signbit(y))
+ {
+ /* pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -0.0L : 0.0L);
+ }
+ /* pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer. */
+ /* pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -HUGE_VALL : HUGE_VALL);
+ }
+
+ if (internal_modf (y, &d) != 0.0)
+ {
+ if (signbit (x))
+ {
+ _SET_ERRNO (EDOM);
+ return -NANL;
+ }
+ if (y == 0.5L)
+ {
+ asm ("fsqrt" : "=t" (rslt) : "0" (x));
+ return rslt;
+ }
+ }
+ else if ((d <= (long double) INT_MAX && d >= (long double) INT_MIN))
+ return __powil (x, (int) y);
+ /* As exp already checks for minlog and maxlog no further checks are necessary. */
+ rslt = (long double) exp2l ((long double) y * log2l ((long double) fabsl (x)));
+
+ if (signbit (x) && internal_modf (ldexpl (y, -1), &d) != 0.0)
+ rslt = -rslt;
+ return rslt;
+}
+#endif
\ No newline at end of file
diff --git a/win32/win32.h b/win32/win32.h
index 9b79e00..d89baa4 100644
--- a/win32/win32.h
+++ b/win32/win32.h
@@ -662,5 +662,13 @@ DllExport void *win32_signal_context(void);
#define Win_CreateSemaphore CreateSemaphore
#endif
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32__)
+/* MinGW.org provides a powl that is broken: 9**9**9 returns
+ * LDBL_MAX instead of INF.
+ */
+#define powl my_powl
+long double my_powl (long double x, long double y);
+#endif
+
#endif /* _INC_WIN32_PERL5 */
--
2.8.3
|
From zefram@fysh.orgDan Collins via RT wrote:
You need to add it to the core export list for the linker.
W00t.
Hairy. -zefram |
From @cpansproutOn Sun Jul 17 09:49:29 2016, dcollinsn@gmail.com wrote:
ok < At one point it was broken in miniperl on Unix, which is why the test is there. A simple boolean test is used, as < Glob on miniperl on Windows is implemented in terms of a call to ‘perlglob <arguments>’, and perlglob is provided by the build system. But I don’t know which of the following is used: win32/bin/perlglob.pl perlglob.pl documents itself as perlglob.bat and a better replacement for perlglob.exe, one that supports wildcards in directory paths. But perlglob.pl uses File::DosGlob, which has XS parts, and will consequently fail under miniperl. I was the one that added the XS parts (partly to fix memory leaks). I am surprised there have not been any bug reports since then. (It never occurred to me that the change would break perlglob.{pl,bat} under miniperl.) It must be that perlglob.c is being used. What does ‘dir perlglob.*’ give you? What does ‘perlglob ~’ give you? -- Father Chrysostomos |
From @dcollinsnZefram: I don't know how to do that. Father Chrysostomos: W:\buildbot\windows1\win32ld\build\t>..\miniperl.exe op\glob.t W:\buildbot\windows1\win32ld\build\t>dir perlglob* Directory of W:\buildbot\windows1\win32ld\build\t 07/17/2016 12:30 PM 46,080 perlglob.exe W:\buildbot\windows1\win32ld\build\t>perlglob.exe ~ Without this patch, the test passes. So it might be caused by the fact that -- |
From zefram@fysh.orgDan Collins wrote:
Add it to embed.fnc, guarded by appropriate #if. -zefram |
From @dcollinsnSubmitted to the upstream as https://sourceforge.net/p/mingw/bugs/2306/ This is the patch I'm going to test when I get back to a windows computer. For now it patches in a my_powl on all builds with a mingw.org compiler. No Configure on Windows, so I don't see any way to be smarter about it. Once the upstream is resolved, we can change this to gate on the MinGW version #defines - currently 3.22. -- |
From @dcollinsn0001-RT-128643.patchFrom 89699407814eee4c9d12ec8499104e1c8fb9b8ff Mon Sep 17 00:00:00 2001
From: Dan Collins <dcollinsn@gmail.com>
Date: Sun, 17 Jul 2016 12:37:46 -0400
Subject: [PATCH] [RT #128643] Win32: Provide my_powl to replace broken MinGW
The powl() provided by MinGW is broken: under at least some situations,
it fails to overflow from LDBL_MAX to INF. This was noticed because
the test suite uses 9**9**9 as something that "should be" inf, and
MinGW returned LDBL_MAX instead. This patch provides a powl() from
MinGW-w64, conditionally including it whenever long doubles are in
use on a MinGW platform.
This issue has been reported to MinGW as bug #2306. However, in the
interim, this patch allows Perl to build and test successfully on
that platform. Once that ticket is resolved upstream, we can update
core to only provide this function on broken versions of MinGW, for
now, the test is gated on all versions.
---
embed.fnc | 3 ++
embed.h | 3 ++
makedef.pl | 3 ++
proto.h | 3 ++
win32/win32.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
win32/win32.h | 14 ++++++
6 files changed, 181 insertions(+)
diff --git a/embed.fnc b/embed.fnc
index abc1187..915bbf2 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -978,6 +978,9 @@ Ap |I32 |my_pclose |NULLOK PerlIO* ptr
Ap |PerlIO*|my_popen |NN const char* cmd|NN const char* mode
#endif
Ap |PerlIO*|my_popen_list |NN const char* mode|int n|NN SV ** args
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32_VERSION_MAJOR) && !defined(__MINGW64_VERSION_MAJOR)
+A |long double |my_powl |long double x|long double y
+#endif
Ap |void |my_setenv |NULLOK const char* nam|NULLOK const char* val
Apmb |I32 |my_stat
pX |I32 |my_stat_flags |NULLOK const U32 flags
diff --git a/embed.h b/embed.h
index b440509..48e1d15 100644
--- a/embed.h
+++ b/embed.h
@@ -894,6 +894,9 @@
#if defined(USE_LOCALE_COLLATE)
#define sv_collxfrm_flags(a,b,c) Perl_sv_collxfrm_flags(aTHX_ a,b,c)
#endif
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32_VERSION_MAJOR) && !defined(__MINGW64_VERSION_MAJOR)
+#define my_powl(a,b) my_powl(aTHX_ a,b)
+#endif
#if defined(USE_PERLIO)
#define PerlIO_clearerr(a) Perl_PerlIO_clearerr(aTHX_ a)
#define PerlIO_close(a) Perl_PerlIO_close(aTHX_ a)
diff --git a/makedef.pl b/makedef.pl
index 956914e..671d644 100644
--- a/makedef.pl
+++ b/makedef.pl
@@ -561,6 +561,9 @@ if ($define{'PERL_GLOBAL_STRUCT'}) {
++$skip{$_} foreach qw(Perl_init_global_struct Perl_free_global_struct);
}
+++$skip{my_powl}
+ unless $define{USE_LONG_DOUBLE} && $define{__MINGW32_VERSION_MAJOR} && !$define{__MINGW64_VERSION_MAJOR};
+
++$skip{PL_op_exec_cnt}
unless $define{PERL_TRACE_OPS};
diff --git a/proto.h b/proto.h
index ec2ae33..21c8357 100644
--- a/proto.h
+++ b/proto.h
@@ -5808,6 +5808,9 @@ PERL_CALLCONV char* Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp
#define PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS \
assert(sv); assert(nxp)
#endif
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32_VERSION_MAJOR) && !defined(__MINGW64_VERSION_MAJOR)
+PERL_CALLCONV long double my_powl(pTHX_ long double x, long double y);
+#endif
#if defined(USE_PERLIO)
PERL_CALLCONV void Perl_PerlIO_clearerr(pTHX_ PerlIO *f);
PERL_CALLCONV int Perl_PerlIO_close(pTHX_ PerlIO *f);
diff --git a/win32/win32.c b/win32/win32.c
index 6ac73e2..20a28e5 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4795,3 +4795,158 @@ Perl_sys_intern_dup(pTHX_ struct interp_intern *src, struct interp_intern *dst)
}
# endif /* USE_ITHREADS */
#endif /* HAVE_INTERP_INTERN */
+
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32_VERSION_MAJOR) && !defined(__MINGW64_VERSION_MAJOR)
+/* NAN builtins for gcc, as they are not part of math.h */
+#ifndef NANF
+#define NANF __builtin_nanf ("")
+#endif
+#ifndef NANL
+#define NANL __builtin_nanl ("")
+#endif
+
+
+#ifndef _SET_ERRNO
+#define _SET_ERRNO(x) errno = (x)
+#endif
+
+
+static long double
+internal_modf (long double value, long double *iptr)
+{
+ long double int_part = (long double) 0.0;
+#ifdef _WIN64
+ asm ("pushq %%rax\n\tsubq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n"
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\npopq %%rax" : "=t" (int_part) : "0" (value)); /* round */
+#else
+ asm ("push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n"
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value)); /* round */
+#endif
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? (long double) 0.0 : value - int_part);
+}
+
+long double __powil (long double x, int n);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+long double __cdecl
+my_powl (long double x, long double y)
+{
+ int x_class = fpclassify (x);
+ int y_class = fpclassify (y);
+ long odd_y = 0;
+ long double d, rslt;
+
+ if (y_class == FP_ZERO || x == 1.0L)
+ return 1.0L;
+ else if (x_class == FP_NAN || y_class == FP_NAN)
+ {
+ rslt = (signbit(x) ? -NANL : NANL);
+ _SET_ERRNO (EDOM);
+ return rslt;
+ }
+ else if (x_class == FP_ZERO)
+ {
+ if (y_class == FP_INFINITE)
+ return (signbit(y) ? HUGE_VALL : 0.0L);
+
+ if (signbit(x) && internal_modf (y, &d) != 0.0)
+ {
+ return signbit (y) ? (1.0 / -x) : 0.0L;
+ }
+ odd_y = (internal_modf (ldexpl (y, -1), &d) != 0.0) ? 1 : 0;
+ if (!signbit(y))
+ {
+ if (!odd_y || !signbit (x))
+ return 0.0L;
+ return -0.0L;
+ }
+
+ if (!odd_y || !signbit (x))
+ return HUGE_VALL;
+ return (signbit(x) ? -HUGE_VALL : HUGE_VALL);
+ }
+ else if (y_class == FP_INFINITE)
+ {
+ long double a_x;
+
+ if (x_class == FP_INFINITE)
+ return (signbit (y) ? 0.0L : HUGE_VALL);
+ a_x = (signbit (x) ? -x : x);
+ if (a_x == 1.0)
+ return 1.0L;
+ if (a_x > 1.0)
+ return (signbit (y) == 0 ? HUGE_VALL : 0.0L);
+ return (!signbit (y) ? 0.0L : HUGE_VALL);
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ /* pow (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y. */
+ if (signbit(x) && internal_modf (y, &d) != 0.0)
+ {
+ return signbit(y) ? 1.0 / -x : -x;
+ }
+ odd_y = (internal_modf (ldexpl (y, -1), &d) != 0.0) ? 1 : 0;
+ /* pow( -inf, y) = +0 for y<0 and not an odd integer, */
+ if (signbit(x) && signbit(y) && !odd_y)
+ return 0.0L;
+ /* pow( -inf, y) = -inf for y an odd integer > 0. */
+ if (signbit(x) && !signbit(y) && odd_y)
+ return -HUGE_VALL;
+ /* pow( -inf, y) = +inf for y>0 and not an odd integer. */
+ if (signbit(x) && !signbit(y) && !odd_y)
+ return HUGE_VALL;
+ /* pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0. */
+ if (signbit(y))
+ {
+ /* pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -0.0L : 0.0L);
+ }
+ /* pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer. */
+ /* pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -HUGE_VALL : HUGE_VALL);
+ }
+
+ if (internal_modf (y, &d) != 0.0)
+ {
+ if (signbit (x))
+ {
+ _SET_ERRNO (EDOM);
+ return -NANL;
+ }
+ if (y == 0.5L)
+ {
+ asm ("fsqrt" : "=t" (rslt) : "0" (x));
+ return rslt;
+ }
+ }
+ else if ((d <= (long double) INT_MAX && d >= (long double) INT_MIN))
+ return __powil (x, (int) y);
+ /* As exp already checks for minlog and maxlog no further checks are necessary. */
+ rslt = (long double) exp2l ((long double) y * log2l ((long double) fabsl (x)));
+
+ if (signbit (x) && internal_modf (ldexpl (y, -1), &d) != 0.0)
+ rslt = -rslt;
+ return rslt;
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/win32/win32.h b/win32/win32.h
index 9b79e00..1d1dbb0 100644
--- a/win32/win32.h
+++ b/win32/win32.h
@@ -662,5 +662,19 @@ DllExport void *win32_signal_context(void);
#define Win_CreateSemaphore CreateSemaphore
#endif
+#if defined(USE_LONG_DOUBLE) && defined(__MINGW32_VERSION_MAJOR) && !defined(__MINGW64_VERSION_MAJOR)
+/* MinGW.org provides a powl that is broken: 9**9**9 returns
+ * LDBL_MAX instead of INF.
+ */
+#define powl my_powl
+#ifdef __cplusplus
+extern "C" {
+#endif
+long double __cdecl my_powl (long double x, long double y);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
#endif /* _INC_WIN32_PERL5 */
--
2.8.3
|
From @sisyphus-----Original Message-----
[snip]
My mingw.org compiler does not define the second symbol I *think* the info provided at Cheers, |
Migrated from rt.perl.org#128643 (status was 'open')
Searchable as RT128643$
The text was updated successfully, but these errors were encountered: